关于循环不变式的思考

        循环不变式,百度的解释:一般而言,用这个式子表示希望得到的结果,如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确,并得到了期望的结果。这就算定义了吧。

        它的三个性质,初始化、保持和终止,基本意思就是,在循环的第一轮迭代开始前、循环中每一轮迭代开始前和循环结束时,这个式子或性质都是正确的。

        拿插入排序算法来说吧,有数组A[1...n],包含了n个待排序的数,要求按由小到大顺序排列。用变量key来临时存储数组元素。

        开始:在整个循环开始前,只取数组的第一个元素A[1]作为已经排好序的序列,不妨称之为“完成序列”。显然,此时的完成序列是满足“有序”这一性质的,只有一个元素嘛。也就是说,“初始化”这一点有保证了。

        循环中:从第二个数组元素开始,执行排序算法。取出第二个元素,key=A[2],拿key跟A[2]之前的所有“有序”的元素作比较,找个适当的位置插入。这时完成序列只有A[1]一个元素,若此时key<A[1],则把A[1]放在A[2]的位置,把key的值放入A[1]的位置,否则不变。这就完成了前两个元素的排序。现在的完成序列包含了两个元素,并且满足“有序”这一性质,保证了在下一轮迭代前,完成序列的有序性。接下来开始第三轮循环,key=A[3],同第二步,拿key跟A[3]之前的所有“有序”的元素作比较,找个适当的位置插入。此轮插入结束后,完成序列包含三个已经排好序的序列,从而保证了第四轮迭代前的“有序”这一性质……直至整个循环结束。从分析中可以看出,循环不变式的第二个性质,“保持”这一点得到了保证。

        最后:当整个循环结束时,完成序列已然是“有序”的,这个性质在每轮迭代后保持了下来。“终止”这一点得到了保证。

        因此,插入排序算法满足循环不变式的思想。

        感觉拿打牌的例子来理解插入排序和循环不变式更形象,“初始化”时左手中只有一张牌,显然是有序的;中途每揭一张牌插入已有的序列,都保证其有序性,即满足了“保持”的性质;最后所有的牌必然是有序的,所以满足“终止”的性质。

        总结一下,就是循环不变式满足:如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确。

      

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值