算法中不变的东西

The thing that doesnt change in the algorithm

k :=0
for i ←1 to n
     c←a[i]
           k←k+1

这是知道元素个数的算法

从技术上讲,是的,k <= i 是一个不变量,但不是很有用。我们使用不变量的原因是我们可以用它们来证明循环后的状态。使用不变量,您可以证明 k <= n 在循环后成立。虽然非常正确,但这并不能真正帮助您尝试证明循环的真正作用。

那么什么样的不变量会有用呢?我们要证明 k 等于 ab 中的元素个数。由于我们正在遍历 a 中的元素,一个不错的选择是:k 等于 a[i] 中也在 b.[=40 中的元素数量=]


我们现在需要证明这个不变量成立。我会保持它有点粗略,所以它仍然由你来正式化。

最初,我们需要证明 k = 0a[1] 之前也在 b 中的元素的数量。没有这样的元素,所以 k = 0 是正确的。

现在,假定 k<sub>i</sub>a[i] 中也在 [=14 中的元素数=],我们需要证明不变量对i+1成立。有两个选项:要么 a[i+1]b 中,要么不在

  • 如果b中有a[i+1],那么b中的a[i + 1]之前的元素个数比[=]之前的元素个数大1 17=] 在 b 中。因此,使用我们的不变量,我们需要证明 k<sub>i+1</sub> = k<sub>i</sub> + 1
  • 如果 a[i+1] 不在 b 中,则 b 中不超过 a[i + 1] 的元素数等于不超过 b 的元素数17=] 在 b 中。使用我们的不变量,我们因此需要证明 k<sub>i+1</sub> = k<sub>i</sub>.

我会留给你来证明这些。