算法导论第二章原创部分答案(更新中)

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的子表对其进行插入排序的最坏时间复杂度为ak2+bk+c,有n/kn/k个子表,总最坏时间复杂度ank+bn+cank+bn+c,忽略低价与常数项为Θ(nk)Θ(nk)

b.

(算法的实现过程是这样的:如果nkn≤k,则插入排序;否则将表分成两半)
在算法过程中
合并两个长度为kk的子表需要a2k+b=2ak+b时间,共n/2kn/2k
合并两个长度为2k2k的子表需要a4k+b=4ak+ba⋅4k+b=4ak+b时间,共n/4kn/4k
……
合并两个长度为n/2n/2的子表需要an+b=an+ba⋅n+b=an+b时间,共11
总合并时间为

i=1qn2qk(2qak+b)=i=1qan+i=1qbn2qk=lgnkan+(n2k+n4k++1)b=anlgnk+(nk1)b

其中qq为序列n2k,n4k,,1的项数。忽略低阶项和常数项,合并时间为Θ(nlgnk)Θ(nlg⁡nk)

c.

k=Θ(lgn)k=Θ(lg⁡n)


2-2 冒泡排序

a.

还需要证明AA′中的元素都来源于AA

b.

A[j]A[jA.length]A[j…A.length]中的最小值
证明:
初始化:j=A.lengthj=A.length时明显成立
保持:假设在某次循环前,循环不变式成立。那么在下一次循环之前,如果A[j]A[j]A[j1]A[j−1]不交换,则有A[j1]A[j]A[j−1]≤A[j],如果交换,那么交换之后还是有A[j1]A[j]A[j−1]≤A[j]。进入下一次循环赋值j=j1j=j−1之后,迭代之前,循环不变式仍然成立。
终止:此时j=ij=i,有A[i]A[i]A[iA.length]A[i…A.length]的最小值

c.

循环不等式:A[1i1]A[1…i−1]AA中第1到第i-1小的数组成,且已经有序。
证明:
初始:第一次迭代之前i=1A[1i1]A[1…i−1]为空
保持:假设每次迭代之前,循环不等式成立。那么迭代之后,A[i]A[i]A[iA.length]A[i…A.length]的最小值,意味着A[i]A[i]AA中第i小的元素(因为第1到第i-1小的数在A[1i1]中)。于是下一次赋值之后(i=i+1i=i+1)迭代之前,循环不等式仍然成立。
终止:此时i=A.length+1i=A.length+1,说明A[1A.length]A[1…A.length]AA中第1到第A.length个组成且已经有序,但“由AA中第1到第A.length个组成”也即原来数组的所有元素。故得证

d.

每一步时间次数
1c1c1nn
2 c2n1i=1ti=n+n1++2=12(n+2)(n1)∑i=1n−1ti=n+n−1+⋯+2=12(n+2)(n−1)
3c3c3n1i=1(ti1)=12n(n1)∑i=1n−1(ti−1)=12n(n−1)
4c4c4n1i=1(ti1)=12n(n1)∑i=1n−1(ti−1)=12n(n−1)

T(n)=c1n+c22(n+2)(n1)+c3+c42n(n1)=Θ(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++anxniy=ai+ai+1x+ai+2x2+⋯+anxn−i,在下次迭代前i=i1i=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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值