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