题目
考虑下面的查找问题:
输入:一列数A=<a1,a2,…,an>和一个值v。
输出:下标i,使得A[i]与v相等,当v不出现在A中时,输出NIL。
写出这个问题的线性查找的伪码,它顺序的扫描整个序列以找到v。利用LOOP VIARIANT证明其正确性。
分析
伪代码
LINEAR-SEARCH(A, v)
1 for i <- 1 to len(A)
2 do if A[i] == v
3 then return i
4 return NIL
循环不变式
在循环的每次迭代开始前,A[1...i-1]中不包含值为v的成员
证明:
初始化:在循环的第一次迭代开始前,此时i=1,给定假设A[1…0]不包含数据,显然v不在A[1…0]中,循环不变式成立
保持:在循环某次迭代开始时,假设i=k,不变式是正确的,那么A[1…k-1]不包含值为v的成员,执行此次迭代,假设没有找到与v匹配的成员(若找到就是终止条件),那么执行的结果可知A[k]不等于v,所以A[1...k]不包含值为v的成员,那么在下次迭代开始时,i=k+1,此时A[1...i-1]即A[1...k],由前面可知不包含值为v的成员,循环不变式成立
终止:终止有两种情况,第一种,在某次迭代中,假设i=k,找到了值为v的成员,由“保持”的分析可知,此时A[1...k-1]不包含值为v的成员,循环不变式成立。第二种,没有找到值为v的成员,此时i=n+1,那么A[1...i-1]即为A[1...n],A[1...n]即为原序列并且不包含值为v的成员,循环不变式成立。
代码
def linear_search(a, v):
for i in range(0, len(a)):
if a[i] == v:
return i
return None