这是这个循环的正确不变量吗?

时间:2016-03-03 16:59:48

标签: algorithm loops clrs loop-invariant

这是数组中线性搜索的伪代码,如果找到数组recyclerView中的所需元素i则返回索引e,否则返回A(此来自CLRS书,第3版,练习2.1-3):

NIL

我试图从中推断一个循环不变量,所以根据我的理解,我认为一个事实表明,在循环中的任何给定时刻,子数组LINEAR_SEARCH (A, e) for i = 1 to A.length if A[i] == e return i return NIL 仅包含等值测试证明错误的值。

具体地说,在第一次迭代A[1..i-1]之前,这意味着子数组的长度为空,因此不能有属于它的元素i-1 == 0,以便v 。在任何下一次迭代之前,同样测试也是一个退出条件,假定的不变属性必须仍然为true,否则循环已经结束。在终止时,要么函数即将返回一个索引(在这种情况下,循环不变量通常是真的),或者返回NIL(在这种情况下是v == e,所以循环不变量适用于任何i == A.length + 1)。

以上是否正确?如果不是,请你提供正确的循环不变量?

感谢您的关注。

1 个答案:

答案 0 :(得分:1)

  • 循环不变:在for循环的每次迭代开始时,我们A[j] != e都有j < i

  • 初始化:在第一次循环迭代之前,由于数组为空,因此保持不变。

  • 维护:在每次迭代时都会维护循环不变量,否则在第i次迭代时会有j < iA[j] == e }。但是,在这种情况下,对于循环的j次迭代,返回值j,并且循环没有i次迭代,这是一个矛盾。

  • 终止当循环终止时,可能有两种情况:一种是在i <= A.length次迭代后终止,并返回i,在这种情况下有条件的if确保A[i] == e。另一种情况是i超过A.length,在这种情况下,我们对所有j <= A.lengthA[j] != e的循环不变量,这个返回的NIL是正确的。