这个循环不变是否正确?

时间:2016-08-30 01:41:57

标签: algorithm loop-invariant

线性搜索循环的伪代码:

for j = 1 to A.length 
   if(A[j] = v) 
      return j;
return NIL

循环不变我已经写过:

在for循环的每次迭代开始时, j A [j-1] 不等于之后的下一个索引v

初始化:

j 等于 1 并且在检查它是否小于 A.length 之前,先前的索引 0 。然后 A [0] 不等于 v ,因为在这种情况下 A [0] 甚至不存在。

维护:

如果 A [j] 等于 v ,则循环终止。这意味着我们没有下一次迭代。但如果它不等于 v ,那么循环的下一次迭代会在保持循环不变的同时执行。

终止:

导致for循环终止的条件是 j 大于 A.length v 等于 A [j ] 。因为每个循环迭代增加 j 1 ,所以我们已经检查 A 的每个元素与 v ,直到 j 大于 A.length 。因此算法是正确的。如果 v 等于 A [j] 那么这意味着我们找到了我们一直在搜索的元素。因此算法是正确的。

这些是正确的吗?

1 个答案:

答案 0 :(得分:2)

这不是太糟糕,但你可以做一些改进。

循环不变:“下一个......后面的语言”是笨拙的,你没有在算法正确的证据中使用它,所以没有理由维护它。这样的事情会更好:“在每次迭代开始时,都不存在任何i< j,这样A [i] == v”。

维护:如果A [j]!= v,循环继续。由于不存在任何i< j使得A [i] == v,并且A [j]!= v,那么也不存在任何i< = j,使得A [i] == v,并且循环不变量适用于下一个更高的j值。

然后您可以在终止条件中使用它:如果循环在数组中找到v并返回其索引,则循环会提前终止。否则,循环不变量保持j ==长度+ 1,并且已知不存在任何i <=长度使得A [i] == v,即,在该阵列中不发生v。