循环不变式证明算法的正确性

news/2024/6/17 2:42:04 标签: 数据结构与算法, matlab

循环不变式证明算法的正确性
循环不变式主要用来辅助我们理解算法的正确性,对于循环不变式,必须证明它的三个性质(有些类似于数学归纳法的意味):

初始化:它在循环的第一轮迭代开始之前,应该是正确的。
保持:如果在某一次循环迭代开始之前是正确的,那么在下一次迭代开始之前,它也应该保持正确(假设当循环变量等于k时符合,再看执行一遍循环体后是否还符合循环不变式)。
结束:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的(这一步是和数学归纳法不同的一点,用循环不变式则更进一步,数学归纳法到这里就得出了一个关系式就结束,而用循环不变式,不但要先确保一个正确的关系式,还要看最后循环结束时,循环变量最后等于多少,根据循环不变式推导是否符合自己的要求。)。
编写循环时,找到让每次循环都成立的逻辑表达式很重要。这种逻辑表达式称为循环不变式(loop invariant)。循环不变式相当于用数学归纳法证明的“断言”。循环不变式用于证明程序的正确性。在编写循环时,思考一下“这个循环的循环不变式是什么”就能减少错误。
注意:好像每个循环都可以找到一个循环不变式,并通过这个循环不变式证明循环迭代的正确性。

插入排序算法的证明
对照循环不变式的原理,下面来试着对插入排序算法的正确性进行论证。
插入算法及其实现在此已经讲过:

INSERTION_SORT(A) pseudocode
for j<--- 2 to length[A]
do key<---A[j]
//Insert A[j] into the sorted sequence A[1,2,...,j-1]
i<---j-1
while i>0 and A[i]>key
do A[i+1]<---A[i]
i<---i-1
A[i+1]<---key
初始化:在第一轮迭代开始之前,证明其正确性。此时j=2,A[1…j-1]中只有一个元素A[1],显然,一个元素是已经排序的了。所以,证明了循环不变式在第一轮迭代之前是成立的。
保持:接下来要证明在每轮迭代中,循环不变式保持成立。迭代之前,假设A[1…j-1]是已经排好序的序列,待排序的元素A[j]依次与A[j-1]、A[j-2]进行比较,如果A[j-1]等大于A[j],则依次将其向右移动一位A[i+1]<---A[i],当遇到开始小于A[j]的元素时,则A[j]找到了合适的插入位置,插入之后,整个序列又是排好序的了。即在假设j成立的情况下,j+1也成立,循环不变式在迭代过程中保持成立。
终止:最后,分析一下循环结束时候的情况。当j=n+1时,循环结束,此时A[1…n]中已经有n个元素,且已经排好序,就是排好序的数组A[1…n],所以算法正确。


原文:https://blog.csdn.net/mountzf/article/details/51866342

转载于:https://www.cnblogs.com/wisir/p/10919204.html


http://www.niftyadmin.cn/n/1055217.html

相关文章

[转]Java 编程技术中汉字问题的分析及解决

昨天同事问servlet中文字符集的问题&#xff0c;给出个结果&#xff1a;转自http://www.ibm.com/developerworks/cn/java/java_chinese/index.html 段明辉, 自由撰稿人 2000 年 11 月 01 日 在基于 Java 语言的编程中&#xff0c;我们经常碰到汉字的处理及显示的问题。一大堆看…

SpringMVC:Controller请求报错The request sent by the client was syntactically incorrect

因为Spring默认的parser是StringParser&#xff0c;而我传入的是组合类&#xff0c;SpringMVC解析出错。 Data public class QQGameGetCouponDto {private BaseParams baseParams;private QQGameGetCouponBizParam bizParams; } 对于入参为组合类的情况&#xff0c;需要提供特…

outlook 正在创建索引

环境&#xff1a;Windows Vista&#xff0c;outlook2007症状&#xff1a;经常出现outlook正在创建索引&#xff0c;你所搜索的内容可能不完整之内.....解决&#xff1a;1.查看outlook下&#xff0c;tools--即时搜索---搜索选项&#xff0c; 设置是否正确。2.控制面板下&#xf…

ambari安装 QA

1.在安装时 出现Public key for ambari-server-2.4.2.0-136.x86_64.rpm is not installed 安装ambari报错 在安装HST服务时也报一个类似的错&#xff0c;解决办法都是先执行 rpm --import http://server1/soft/AMBARI-2.4.2.0/centos7/2.4.2.0-136/RPM-GPG-KEY/RPM-GPG-KEY-Jen…

ElasticSearch的介绍及使用

1.ElasticSearchspringboot集成es配置突然操作es客户端,transportClient es学习 简介 : 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放…

Centos7--traceroute

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点&#xff08;source&#xff09;到达某一同样的目的地(destination)走的路径可能会不一样&#xff0c;但基本上来说大部分时候所走的路由是相同的。linux系统…

机器CPU load过高问题排查

load average的概念 系统平均负载定义&#xff1a;在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中&#xff1a; 它没有在等待I/O操作的结果它没有主动进入等待状态(也就是没有调用’wait’)没有被…

[转]Use Intel C++ Compiler in Eclipse (CDT) under Win32

许久了&#xff0c;都想逃离微软的开发平台&#xff0c;最初还是在gcc这样的编译平台上&#xff0c;说实在话&#xff0c;还是intel的编译平台优化效果好。无意间看到了这边文章&#xff0c;特做保留。我不是一个java的支持者&#xff0c;但是一个纯粹的C崇拜者。 官方最权威资…