什么是循环不变量?
我正在阅读CLRS的“算法简介”。在第2章中,作者提到了“循环不变量”。什么是循环不变量?
没有找到相关结果
已邀请:
15 个回复
苦诫
循环,如下所示:
在这个例子中,它是真的(对于每次迭代)
。一个较弱的不变量也是如此
。
旦彤
条目进行排序。如果你可以证明这确实是一个循环不变量(即它在每次循环迭代之前和之后保持),你可以用它来证明排序算法的正确性:在循环终止时,循环不变量仍然满足,计数器
是数组的长度。因此,第一个
条目被排序意味着整个数组被排序。 一个更简单的例子:循环不变量,正确性和程序派生。 我理解循环不变量的方式是作为推理程序的系统的,正式的工具。我们做一个单独的陈述,我们专注于证明是真的,我们称之为循环不变量。这组织了我们的逻辑。虽然我们也可以非正式地讨论某些算法的正确性,但使用循环不变量会迫使我们仔细思考并确保我们的推理是不透明的。
帆攀缺锯欧
所以循环条件看起来非常简单 - 当开始>结束时循环终止。但为什么循环正确?什么是循环不变量证明它的正确性? 不变量是逻辑陈述:
这个陈述是一个逻辑重言式 - 在我们试图证明的特定循环/算法的上下文中总是如此。它提供了有关循环终止后循环正确性的有用信息。 如果我们返回因为我们在数组中找到了元素,那么语句显然是正确的,因为如果
那么
在数组中,
必须在start和end之间。如果循环终止因为
那么就不会有number13ѭ和
这样的数字,因此我们知道语句
必须是假的。但是,因此整体逻辑语句在空意义上仍然是正确的。 (在逻辑中,语句if(false)then(something)总是如此。) 那么当循环终止时,我所说的循环条件必然是假的呢?看起来当在数组中找到元素时,当循环终止时,循环条件为真!它实际上不是,因为隐含的循环条件实际上是
但是我们缩短了实际测试,因为第一部分是隐含的。无论循环如何终止,这个条件在循环后显然都是假的。
咖哀烈
在这种情况下循环不变(来源:CLRS书): 子阵列[1到j-1]始终排序。 现在让我们检查一下并证明算法是正确的。 初始化:在第一次迭代之前j = 2。所以Subarray [1:1]是要测试的数组。因为它只有一个元素所以它被排序。因此Invariant是满意的。 维护:通过在每次迭代后检查不变量可以很容易地验证这一点。在这种情况下,它是满意的。 终止:这是我们证明算法正确性的步骤。 当循环终止时,则j = n + 1的值。再次满足循环不变量。这意味着应该对子阵列[1到n]进行排序。 这就是我们想要用算法做的事情。因此我们的算法是正确的。
浩挎
嗓瑰
凰葱崎济邯
瞥同忙接
谷靛
嗓瑰
香腔弥胯瓤
抽法
。在该示例中,
和
表示循环中的两个变量。考虑到在整个代码执行过程中这些变量的行为发生变化,几乎不可能测试所有可能的
和
值,看看它们是否产生任何错误。可以说
是一个整数。整数可以在内存中保留32位空间。如果该数量超过,则发生缓冲区溢出。所以我们需要确保在整个代码执行过程中,它永远不会超过这个空间。为此,我们需要了解一个显示变量之间关系的通用公式。 毕竟,我们只是试图了解程序的行为。
骚瓤
在这里我们可以说我的状态是
爆刺疤灯
缕嚏冻