循环不变量

要证明循环正确,必须在以下三个环节中,考虑循环不变量的真假。

循环初始状态:在所有循环体执行前,循环不变量成立。

循环进行时:如果在一个循环体开始执行之前,不变量成立,那么在下一个循环体执行之前,不变量仍然成立。

循环终结后:当整个循环结束时,不变量可以直接说明算法的正确性。


以Insert sort为例,要证明其外循环的正确性。

复制代码

INSERTION-SORT(A)
1  for j ← 2 to length[A]
2       do key ← A[j]
3          ▹ Insert A[j] into the sorted sequence A[1 ‥ j - 1].
4          i ← j - 1
5          while i > 0 and A[i] > key
6              do A[i + 1] ← A[i]
7                 i ← i - 1
8          A[i + 1] ← key
复制代码

 

首先,用语言来描述本例的“循环不变量”——循环变量为j但循环未执行前,即A[1....j-1]来自输入且有序。

初始状态: j为2时,A[1...j-1] 就是 A[1],明显来自输入且有序,不变量成立。

进行时:我们来判断,每一步循环体执行后,A[1...j-1]是否仍然有序。 假设循环变量为j时成立,则在循环变量为j+1时,A[1...j-1]来自输入且有序,添加的A[j+1]数据来自输入,且插入后整个数组呈有序状态,因此,每轮循环体执行后,不变量保持成立。

循环结束后:j此时为n+1, A[1....j-1]为A[1....n],即整个数组,根据以上两条,不变量至此仍然是成立的,即整个数组为有序状态,达到算法预期的目的,可以判断循环正确!

你可能感兴趣的:(循环不变量)