算法导论 2.1-3

题目

考虑下面的查找问题:
输入:一列数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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值