2.1-3 考虑以下查找问题:
输入:n个数的一个序列A=<a1,a2,⋯ ,an>A=<a_1,a_2,\cdots,a_n>A=<a1,a2,⋯,an>和一个值vvv。
输出:下标iii使得A[i]=vA[i]=vA[i]=v或者当vvv不在AAA中出现时,vvv为特殊值NILNILNIL
写出线性查找的伪代码,它扫描整个序列来查找vvv。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。
LINEARSEARCH(A,v)
for i=1 to A.length
if A[i]==v
return i
return NIL
循环不变式:子数组中不存在vvv
初始化:i=1i=1i=1时,子数组为空数组中不存在vvv
保持:当迭代到第iii步时,如果A[i]≠vA[i]\neq vA[i]=v,A[1…i]A[1\dots i]A[1…i]中不存在vvv,循环不变式保持,如果A[i]=vA[i]=vA[i]=v循环不变式终止。
终止:当循环终止时,i=A.length+1i=A.length+1i=A.length+1,数组A[1…n]A[1\dots n]A[1…n]中不存在vvv。
2.1-4 考虑把两个nnn为二进制数加起来的问题,这两个整数分别存储在两个nnn元数组AAA和BBB中。这两个整数的和应按二进制形式存储在一个(n+1)(n+1)(n+1)元数组CCC中。请给出该问题的形式化描述,并写出伪代码。
数组AAA和BBB最高位存储在A[1]A[1]A[1]和B[1]B[1]B[1]中,从i=A.lengthi=A.lengthi=A.length到i=1i=1i=1,C[i]=A[i]+B[i]+KC[i] =A[i]+B[i]+KC[i]=A[i]+B[i]+K,其中K为进位,最后把进位KKK赋给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 考虑排序存储在数组AAA中的nnn个数:首先找出AAA中的最小元素并将其与A[1]A[1]A[1]中的元素进行交换。接着,找出
AAA中次最小的元素,并将其与A[2]A[2]A[2]中的元素进行交换。对AAA中的前n−1n-1n−1个元素按该方式继续。该算法成为选择算法,写出其伪代码。该算法维持循环不变式是什么?为什么它只需要对前n−1n-1n−1个元素,而不是对所有nnn个元素运行?用Θ\ThetaΘ记号给出线性查找的平均情况和最坏情况运行时间。证明你的答案。

1573

被折叠的 条评论
为什么被折叠?



