2.1-4 全加器
代码:
Adder(A,B,n)
define C as n+1_bitsarray
Cin = 0 // 进位标志
for i = 1 to n
C[i] = A[i]^B[i]^Cin
Cin = (A[i]&B[i])|(A[i]&Cin)|(B[i]&Cin)
C[n+1] = Cin
return C
2.3-6
二分查找能缩短找到插入位置的时间,但是插入时仍需要移动元素,时间复杂度仍然为Θ(n2)Θ(n2)。采用链表则不能使用二分查找。
2.3-7
伪代码:
Find-two-numbers-sum-to(S,x)
Merge-Sort(S)
for i = 1 to S.length
if Binary-Search(S[i+1...S.length],x-S[i]) == true
return true
return false
2-1 归并-插入排序
a.
每个长度为kk的子表对其进行插入排序的最坏时间复杂度为,有n/kn/k个子表,总最坏时间复杂度ank+bn+cank+bn+c,忽略低价与常数项为Θ(nk)Θ(nk)
b.
(算法的实现过程是这样的:如果n≤kn≤k,则插入排序;否则将表分成两半)
在算法过程中
合并两个长度为kk的子表需要时间,共n/2kn/2k次
合并两个长度为2k2k的子表需要a⋅4k+b=4ak+ba⋅4k+b=4ak+b时间,共n/4kn/4k次
……
合并两个长度为n/2n/2的子表需要a⋅n+b=an+ba⋅n+b=an+b时间,共11次
总合并时间为
其中qq为序列的项数。忽略低阶项和常数项,合并时间为Θ(nlgnk)Θ(nlgnk)
c.
k=Θ(lgn)k=Θ(lgn)
2-2 冒泡排序
a.
还需要证明A′A′中的元素都来源于AA
b.
是A[j…A.length]A[j…A.length]中的最小值
证明:
初始化:j=A.lengthj=A.length时明显成立
保持:假设在某次循环前,循环不变式成立。那么在下一次循环之前,如果A[j]A[j]和A[j−1]A[j−1]不交换,则有A[j−1]≤A[j]A[j−1]≤A[j],如果交换,那么交换之后还是有A[j−1]≤A[j]A[j−1]≤A[j]。进入下一次循环赋值j=j−1j=j−1之后,迭代之前,循环不变式仍然成立。
终止:此时j=ij=i,有A[i]A[i]是A[i…A.length]A[i…A.length]的最小值
c.
循环不等式:A[1…i−1]A[1…i−1]由AA中第1到第i-1小的数组成,且已经有序。
证明:
初始:第一次迭代之前,A[1…i−1]为空A[1…i−1]为空
保持:假设每次迭代之前,循环不等式成立。那么迭代之后,A[i]A[i]是A[i…A.length]A[i…A.length]的最小值,意味着A[i]A[i]是AA中第i小的元素(因为第1到第i-1小的数在中)。于是下一次赋值之后(i=i+1i=i+1)迭代之前,循环不等式仍然成立。
终止:此时i=A.length+1i=A.length+1,说明A[1…A.length]A[1…A.length]由AA中第1到第个组成且已经有序,但“由AA中第1到第个组成”也即原来数组的所有元素。故得证
d.
行 | 每一步时间 | 次数 |
---|---|---|
1 | c1c1 | nn |
2 | ∑n−1i=1ti=n+n−1+⋯+2=12(n+2)(n−1)∑i=1n−1ti=n+n−1+⋯+2=12(n+2)(n−1) | |
3 | c3c3 | ∑n−1i=1(ti−1)=12n(n−1)∑i=1n−1(ti−1)=12n(n−1) |
4 | c4c4 | ∑n−1i=1(ti−1)=12n(n−1)∑i=1n−1(ti−1)=12n(n−1) |
T(n)=c1n+c22(n+2)(n−1)+c3+c42n(n−1)=Θ(n2)T(n)=c1n+c22(n+2)(n−1)+c3+c42n(n−1)=Θ(n2)
2-3 Horner规则(秦九韶)
a.
T(n)=c1+c2(n+2)+c3(n+1)=Θ(n)T(n)=c1+c2(n+2)+c3(n+1)=Θ(n)
b.
伪代码:
PolySum-Simple(A,x)
y = 0
for i = 0 to n
tmp = 1
for j = 1 to i
tmp *= x
y += A[i]*tmp
return y
最坏时间复杂度Θ(n2)Θ(n2),比霍纳规则坏
c.
初始化:在第一次迭代前,i=n,y=0i=n,y=0(没有项的和氏为0)
保持:假设在每次迭代前,y=∑n−(i+1)k=0ak+i+1xky=∑k=0n−(i+1)ak+i+1xk成立,也即y=ai+1+ai+2x+ai+3x2+⋯+anxn−(i+1)y=ai+1+ai+2x+ai+3x2+⋯+anxn−(i+1),那么该次迭代后y=ai+ai+1x+ai+2x2+⋯+anxn−iy=ai+ai+1x+ai+2x2+⋯+anxn−i,在下次迭代前i=i−1i=i−1,循环不等式依然成立。
终止:此时i=−1i=−1,有y=∑nk=0akxky=∑k=0nakxk。证毕。
2-4
c.
插入排序中,移动元素的次数等于逆序对的个数,因此运行时间和逆序对的个数的增长量级相同。
d.
Inversion-Number(A,p,q)
if p < q
mid = (p+q)/2