如算法导论(http://mitpress.mit.edu/algorithms)所示,练习陈述如下:
输入:数组A [1 ... n]
输出:i,其中A [i] = v或未找到时为NIL
为LINEAR-SEARCH写一个伪代码, 扫描序列, 寻找v。使用循环不变量, 证明你的算法是正确的。 (确保你的循环不变 完善了三个必要的属性 - 初始化,维护, 终止。)
我创建算法没有问题,但我没有得到的是如何判断我的循环不变量。我认为我理解了循环不变量的概念,即在循环开始之前,在每次迭代的结束/开始时始终为真的条件,并且当循环结束时仍然为真。这通常是目标,例如,在插入排序时,迭代j,从j = 2开始,[1,j-1]元素始终排序。这对我来说很有意义。但对于线性搜索?我想不出任何东西,想到循环不变只是听起来太简单了。我明白了什么问题吗?我只能想到一些明显的东西(它是NIL或介于0和n之间)。非常感谢提前!
答案 0 :(得分:14)
在您查看索引i
但尚未找到v
之后,关于v
之前的数组部分,您可以对i
说些什么关于i
后的数组部分?
答案 1 :(得分:6)
在线性搜索的情况下,循环变体将是用于保存索引(输出)的后备存储。
让后备商店命名为 index ,最初设置为NIL。循环变体应符合以下三个条件:
答案 2 :(得分:3)
循环不变量
forevery 0< = i< k,其中k是循环迭代变量的当前值, A [i]!= v
循环终止:
如果A [k] == v,则循环终止并输出k
如果A [k]!= v,并且k + 1 == n(列表大小),则循环终止,值为nil
正确证明:留作练习
答案 3 :(得分:2)
LINEAR-SEARCH(A, ν)
1 for i = 1 to A.length
2 if A[i] == ν
3 return i
4 return NIL
循环不变式::在i
循环的第for
个迭代的开始处(第1-4行),
∀ k ∈ [1, i) A[k] ≠ ν.
初始化:
i == 1 ⟹ [1, i) == Ø ⟹ ∀ k ∈ Ø A[k] ≠ ν,
这是正确的,因为有关空集的任何陈述都是正确的(虚实)。
维护:让我们假设循环不变性在i
循环的第for
次迭代开始时为true。如果为A[i] == ν
,则当前迭代是最后一个迭代(请参见终止部分),因为执行了第3行;否则,如果有A[i] ≠ ν
,我们有
∀ k ∈ [1, i) A[k] ≠ ν and A[i] ≠ ν ⟺ ∀ k ∈ [1, i+1) A[k] ≠ ν,
这意味着在下一次迭代(第i+1
次)开始时不变循环仍然为真。
终止: for
循环可能由于两个原因而结束:
return i
(第3行),如果A[i] == ν
; i == A.length + 1
(for
循环的最后一次测试),在这种情况下,我们处于第A.length + 1
次迭代的开始,因此循环不变性是
∀ k ∈ [1, A.length + 1) A[k] ≠ ν ⟺ ∀ k ∈ [1, A.length] A[k] ≠ ν
,然后返回NIL
值(第4行)。
在两种情况下,LINEAR-SEARCH
都按预期结束。
答案 4 :(得分:1)
假设您有一个长度为i的数组,索引自[0 ... i-1],算法正在检查此数组中是否存在v。 我不完全确定,但我认为,循环不变量如下: 如果j是v的索引,那么[0..j-1]将是一个没有v的数组。
初始化:在从0..i-1迭代之前,检查当前数组(无),不包括v。
维护:在j处找到v时,[0..j-1]中的数组将是不带v的数组。
终止:当循环在j处找到v时终止,[0..j-1]将是没有j的数组。
如果数组本身没有v,那么j = i-1,上述条件仍然适用。
答案 5 :(得分:0)
我写的LS算法是 -
LINEARSEARCH(A, v)
for i=0 to A.length-1
if(A[i] == v)
return i
return NIL
我为循环不变量做了我自己的假设来检查线性搜索的正确性.....也许它完全错了所以我需要对我的假设提出建议。
1)在初始化时 - 在i = 0时,我们在i = 0处搜索v。
2)在连续的迭代中 - 我们正在寻找v直到i<则为a.length-1
3)在终止时,i = A.length,直到A.length,我们一直在寻找v。
答案 6 :(得分:0)
线性搜索的不变量是i之前的每个元素都不等于搜索关键字。二进制搜索的合理不变量可能是[低,高]范围,低值之前的每个元素都小于键,高位之后的每个元素都大于或等于。 请注意,二进制搜索有一些变体,其不变量和属性稍有不同 - 这是“下界”二进制搜索的不变量,它返回任何等于或大于键的元素的最低索引。
来源:https://www.reddit.com/r/compsci/comments/wvyvs/what_is_a_loop_invariant_for_linear_search/
似乎对我不对。