线性搜索循环的伪代码:
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] 那么这意味着我们找到了我们一直在搜索的元素。因此算法是正确的。
这些是正确的吗?
答案 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。