《算法导论》读书笔记(一) 循环不变式

循环不变式的介绍

循环不变式是用来证明算法正确性的一种方法。当设计一个算法设计到循环时,就可以使用循环不变式来去验证算法的正确性。从个人角度来看,我认为循环不变式的使用可以使设计算法者的逻辑更加严谨。循环不变式是一种验证算法是否正确的一个过程,在这个过程中有三个重要的节点,下面介绍这三个节点。

循环不变式的三个节点

  • 初始化:在循环迭代前循环不变式为真。
  • 保持:如果循环的某次迭代之前循环不变式为真,那么下次迭代之前循环不变式仍为真。(这里可以理解成,循环不变式经过一次循环之后扔为正确的)。
  • 终止:循环终止时循环不变式的状态。

循环不变式的过程类似于数学归纳法。初始状态为真,循环迭代之后状态仍然为真。那么在终止状态(这里的终止状态是指循环结束)时,根据前两个节点可知,终止状态下的循环不变式仍然为真。因此,我们可以通过终止状态下的循环不变式与我们最终想要得到的结果是否匹配就可以验证算法的正确性。下面通过一个例子来介绍循环不变式的使用方法。

举例介绍(插入排序)

void InsertionSort(int *arr,int length){
	int i, j,temp;
	for (i = 1;i < length;i++) {
		temp = arr[i];
		for (j = i-1;j >= 0 && arr[j]>temp;j--) {
				arr[j + 1] = arr[j];
		}
		arr[j + 1] = temp;
	}
}
  1. 初始化:在初始化阶段,首先需要确定所选取的循环不变式,在该例子中arr[0,…,i-1]就是我们选取的循环不变式。之后,确定循环不变式的初始状态,初始时i为1,所以初始状态含有arr[0]一个元素。因为只含有一个元素,所以必然是有序的,因此可得出循环不变式初始状态为真。(这里定义循环不变式中元素有序时循环不变式为真)。
  2. 保持:假设i此时的值为j,arr[0,j-1]为真(0到j-1的元素有序排列)。根据循环体可知,将arr[j-1],arr[j-2]等中比arr[j]大的值后移,直到找到第一个小于arr[j]的位置后将arr[j]的值插入到该位置后。经过该次循环后循环不变式变为arr[0,j],并且该循环不变式仍然为真。
  3. 终止状态:循环终止时,i的值为length(数组的长度),此时循环不变式的状态为arr[0,length-1],意味着arr中从0到length-1位置的元素均已有序排列。arr[0,length-1]正好对应插入排序需要排序的数组。所以通过循环不变式可以证明该插入排序算法是正确的。

总结

这篇文章主要简单介绍一下循环不变式的概念和使用。该文章中使用的例子比较简单,读者可能会觉得多此一举。但我认为这是一种很严谨的思路,在之后遇到较复杂的算法时给我们提供了一种清晰证明算法是否正确的办法。所以还是有必要了解一下的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值