使用循环不变量证明算法是正确的

时间:2015-11-11 17:00:47

标签: algorithm

来自算法导论由Cormen等人撰写。 (第3版),我正在练习2.1-3。基本上,给定长度为A且值为n的向量v,算法会输出索引i(索引从1开始,而不是{{ 1}})如果这样的索引不存在,0v = A[i]

我的伪代码如下:

NIL

如何使用循环不变量来证明这是正确的?我不确定如何在这里将对插入排序算法的循环不变量的讨论扩展到此算法(称为线性搜索算法)。

我想,当for j = 1 to length(A): value = A[j] if v == value: return j return 'NIL' 时,你有一个长度为j = 1的(子)向量,其中的一个组件只有1v

当你有一个长度为v的子向量时,如果我们假设算法有效,那么对于j = k,它是微不足道的(我认为?)。

我显然不理解这种证明算法正确的方法,虽然我 非常熟悉数学归纳,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

循环不变量为:A[i] != v适用于所有1 <= i < j

循环不变量始终在每次迭代时保持不变。另外假设存在i < j A[i] = v。该算法在到达i次迭代之前将返回j

循环不变量有助于证明正确性,因为在终止时有两种可能的情况。 (1)j <= length(A),其中循环不变量和if语句表明A[j] = v并且算法正确返回j;或(2)j > length(A),其中循环不变量意味着所有i <= length(A)A[i] != v,在这种情况下算法正确返回NIL