算法导论第二章中提出了一个概念---“循环不变式”,书上说:
在for循环(循环变量为j)的每次迭代开始,包含a[1..j-1]的子数组构成了当前排序好的子数组,余下的子数组a[j+1..n]对应于仍未处理的部分,而元素a[1..j-1]实际上就是原来排在桌子上的那a[1..j-1]的部分,但现在已接按序排列。把a[1..j-1]的这些性质形式地表示为一个循环不变式。
我的理解是,循环不变式表达的是在循环过程中的一种状态。第一、对于插入排序来说,每轮循环利用的都是原数组中的前j-1个元素,这里体现的是“不变”,意思是对于每一轮的子集a[1..j-1],它所有的元素就是原数组中前j-1个元素这个事实是不变的。而对于选择排序来讲,这里的不变指的又是前j-1个元素是整个数组中最小的j-1个元素这个事实不变。对于其他的循环在特定环境下表现出的意义也不尽相同。第二、在第j轮循环中,元数组的前j-1个元素已经是按约定排好序的了。循环是外部动作,而“不变”及“排好序”是相对的一种状态,只有这样才有充足的理由去类似按归纳法的思想来证明结论的正确性。我觉得这个概念给的相对模糊,看个人理解。
循环不变式的作用:
主要用来帮助理解算法的正确性,关于循环不变式,必须证明以下三个性质:
初始化:循环的第一次迭代之前,它为真。(归纳中的n=1)
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。(如果n=i正确,则n=i+1也正确)
终止:在循环终止时,不变式为我们提供了一个有用的性质,该性质有助于证明算法是正确的。(得出结论当n->无穷时,当然,这里一般是有界的n,则我们要借助循环终止时的状态来利用“保持”一条的规则来推出结论是正确的)
对于这三个性质的使用,书上有对插入排序分析的一个例子,尤其是第三条的终止条件是和归纳法思想差别比较明显的一步。