算法导论课后题和思考题 第2章

一、课后习题

2.1-1 以图 2-2为模型,说明INSERTION-SORT 在数组 A = < 31, 41, 59, 26, 41, 58 > 上的执行过程。

step 1 to 3

step 4 to 6

2.1-2 重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。

INSERTION-SORT(A)
    for j=2 to A.length
        key = A[j]
    
        i = j-1
        while i>0 and A[i]<key
            A[i+1]=A[i]
            i = i-1

        A[i+1]=key

2.1-3 考虑以下查找问题:

输入: n个数的一个序列 A=<a_1,a_2,...,a_n> 和一个值v。

输出: 下标i使得v=A[i] 或者当v不在A中出现时,v为特殊值NIL。

写出线性查找的伪代码, 它扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。

LINEAR-SEARCH(A,v)
    for i=1 to A.length
        if A[i]==v:
            return i
    return NIL

循环不变式:

初始化:第一次循环迭代之前,未找到v,结果为NIL

保持: 第i次迭代时,若A[i]==v,则表示找到v,返回v在A中的下标i,若没有找到,则进入下一次迭代,相当于结果为NIL。

终止: 在整个循环中,i逐渐增加1,如果找到v,则返回下标,循环终止,若一直没有找到v,则当下标超过A的长度时,退出循环,返回NIL。

2.1-4 考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应该按二进制形式存储在一个(n+1) 元数组C中。请给出该问题的形式化描述,并写出伪代码。

形式化描述:

输入: 两个整数的n位二进制序列,分别为 A=<a_1,a_2,...,a_n> 和 B=<b_1,b_2,...,b_n>

输出: n+1个数的序列 C=<c_1,c_2,...,c_n>,且C为A和B的和

BINARY-SUM(A, B, n):
    let C[1...n+1] be new array and initialised to 0
    carry = 0 
    for i=n downto 1
        if A[i]+B[i]+carry==2
            C[i+1]=0
            carry =1 
        else
            C[i+1]=1
            carry =0 

    if carry==1:
        C[0] = 1

    return C

2.2.-1 用\Theta记号表示函数 n^3/1000-100n^2-100n+3

\Theta(n^3)

2.2-2 考虑排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法称为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n-1个元素,而不是对所有n个元素运行?用\Theta记号给出选择排序的最好情况与最坏情况运行时间。

1) 伪代码:

SELECTION-SORT(A):
    for i=1 to A.length-1:
        min_index = i
        for j =i+1 to A.length:
            if A[j]<A[i]:
                min_index = j 
        A[i],A[min_index] = A[min_index],A[i]

    return A

2) 循环不变式: 在for循环的每次迭代开始时,子数组A[1,...,i-1] 中已按照非递减顺序排好,且由A中的前i-1个最小值组成

3) 因为当前n-1个元素排好顺序时,根据循环不变式,前n-1个元素由A中的前n-1个最小值组成,即A[n]为最大值,因此不用排第n个元素

4) 最好情况,A已排好顺序,但是依然要遍历所有元素确认最小值,最坏情况为A完全逆序,每次遍历所有元素确认最小值,这两者都是

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值