算法导论第二章练习参考答案

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

输入:n个数的一个序列 A = < a 1 , a 2 , ⋯   , a n > A=<a_1,a_2,\cdots,a_n> A=<a1,a2,,an>和一个值 v v v

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

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

LINEARSEARCH(A,v)
	for i=1 to A.length
		if A[i]==v
			return i
	return NIL

循环不变式:子数组中不存在 v v v

初始化: i = 1 i=1 i=1时,子数组为空数组中不存在 v v v

保持:当迭代到第 i i i步时,如果 A [ i ] ≠ v A[i]\neq v A[i]=v A [ 1 … i ] A[1\dots i] A[1i]中不存在 v v v,循环不变式保持,如果 A [ i ] = v A[i]=v A[i]=v循环不变式终止。

终止:当循环终止时, i = A . l e n g t h + 1 i=A.length+1 i=A.length+1,数组 A [ 1 … n ] A[1\dots n] A[1n]中不存在 v v v

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

数组 A A A B B B最高位存储在 A [ 1 ] A[1] A[1] B [ 1 ] B[1] B[1]中,从 i = A . l e n g t h i=A.length i=A.length i = 1 i=1 i=1 C [ i ] = A [ i ] + B [ i ] + K C[i] =A[i]+B[i]+K C[i]=A[i]+B[i]+K,其中K为进位,最后把进位 K K K赋给C[1]

ADD(A,B)
    let C[1...n+1] be a new array
    K=0
    for i=A.length downto 1
        C[i+1]=A[i]+B[i]+K
        if C[i+1]==2
        	C[i+1]=0
        	K=1
        else
        	k=0
    C[1]=K
    return C

2.2-2 考虑排序存储在数组 A A A中的 n n n个数:首先找出 A A A中的最小元素并将其与 A [ 1 ] A[1] A[1]中的元素进行交换。接着,找出

A A A中次最小的元素,并将其与 A [ 2 ] A[2] A[2]中的元素进行交换。对 A A A中的前 n − 1 n-1 n1个元素按该方式继续。该算法成为选择算法,写出其伪代码。该算法维持循环不变式是什么?为什么它只需要对前 n − 1 n-1 n1个元素,而不是对所有 n n n个元素运行?用 Θ \Theta Θ记号给出线性查找的平均情况和最坏情况运行时间。证明你的答案。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值