算法中不变的东西
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
等于 a
和 b
中的元素个数。由于我们正在遍历 a
中的元素,一个不错的选择是:k
等于 a[i]
中也在 b
.[=40 中的元素数量=]
我们现在需要证明这个不变量成立。我会保持它有点粗略,所以它仍然由你来正式化。
最初,我们需要证明 k = 0
是 a[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>
.
我会留给你来证明这些。
k :=0
for i ←1 to n
c←a[i]
k←k+1
这是知道元素个数的算法
从技术上讲,是的,k <= i
是一个不变量,但不是很有用。我们使用不变量的原因是我们可以用它们来证明循环后的状态。使用不变量,您可以证明 k <= n
在循环后成立。虽然非常正确,但这并不能真正帮助您尝试证明循环的真正作用。
那么什么样的不变量会有用呢?我们要证明 k
等于 a
和 b
中的元素个数。由于我们正在遍历 a
中的元素,一个不错的选择是:k
等于 a[i]
中也在 b
.[=40 中的元素数量=]
我们现在需要证明这个不变量成立。我会保持它有点粗略,所以它仍然由你来正式化。
最初,我们需要证明 k = 0
是 a[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>
.
我会留给你来证明这些。