《算法导论》:关于循环不变式

《算法导论》:关于循环不变式

试着理解一下《算法导论》中提到的循环不变式的概念,作者水平有限,如果内容存在纰漏的话希望大家批评指出。

算法导论在讨论插入排序算法的时候引入了循环不变式的概念,书中的描述是这样的:

事实上,元素A[1…j-1]就是原来在位置1到j-1的元素,但现在已按序排列。我们把A[1…j-1]的这些性质形式地表示为一个循环不变式

其中元素A[1…j-1]指的是排序算法左端已经按序排列的元素。

显然,我们能从原书的描述中明确几点:

  1. 循环不变式是算法性质的抽象,以插入排序为例,循环不变式表示的是左端元素的有序性和不变性(即没有引入循环上界外的元素到其中)
  2. 循环不变式能够帮我们证明算法的正确性,证明循环不变式的正确性即为证明算法的某些性质

那么问题来了,循环不变式的目的是为了帮助我们理解算法和证明算法的正确性,但具体该怎么做呢?

书上给出了解法:

关于循环不变式,我们必须证明三条性质:
初始化: 循环的第一次迭代之前,它为真
保持: 如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真
终止: 在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的

简单来说,就是证明一个过程的初值符合要求,每次递归关系符合要求,结果符合要求。(很容易联想到数学归纳法,但循环不变式的证明存在终止,并不是无限地循环)

拿书中给出的插入排序的伪代码为例:

这里用循环不变式代表左侧已排序序列的有序性和元素不变性

1	for j=2 to A.length
2		key = A[j]
3		i = j - 1
4		while i>0 and A[i]>key
5			A[i+1] = A[i]
6			i = i - 1
7		A[i+1] = key

初始化: 在第一次循环迭代前(即j=1时)此时已排序序列仅有元素A[1],显然有序且符合元素不变性

保持: 因为在循环中j的不断右移并向左侧插入数据,显然在循环时左侧的循环不变性是保持的(这里仅用来理解循环不变式所以不给出详细的数学证明)

终止: 当循环终止时(即j =A.length+1时),此时A[1…j-1]为整个数组,显然满足元素不变性,且可推断出数组已经有序,满足有序性

三者证正,即可证明循环不变式的正确性

猜你喜欢

转载自blog.csdn.net/weixin_43662405/article/details/109005414