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

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

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

事实上,元素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]为整个数组,显然满足元素不变性,且可推断出数组已经有序,满足有序性

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

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

  1. 算法导论之图的最小生成树

    引出最小生成树,是提到电子线路设计时,要把数个元件的引脚连接在一起,使其电位相同.使n个引脚互相连通,可以使用n-1条连接线,每条连接线连接两个引脚.寻求连接线最少的方案,是最小生成树的应用.将电子线 ...

  2. 你是如何坚持读完《算法导论》这本书的?(帖子收集)

    你是如何坚持读完<算法导论>这本书的? <算法导论>不够猛,答者顺便补充 "你是如何坚持读完<计算机编程的艺术>这本书的?" 罗必成: CLRS ...

  3. 算法导论第一,第二部分总结

    最近正在看一部大著<算法导论>,这本书无论从严密还是从思维上面都达到了一个难以企及的高度.里面的算法分析与设计基本上都在理论性上,如果想实用的话自己还需要看点其它的东西.接下来,就自己学了 ...

  4. 算法导论-3.递归部分习题选

    这一部分主要算法导论中递归式.堆排序和快速排序章节里选择的对我而言较有价值的题目. 练习4.1-1 证明 $T(n)=T(\lceil n/2\rceil)+1$ 的解为 $O(\lg n)$ . 解 ...

  5. 《算法导论》习题5.3-1 ~ 5.3-7

    <算法导论>习题 5.3.1 - 5.3.7  5.3-5 带星号我抄了一下题目, 5.3-6 比较有意思我抄了一下题目, 其他的题可以自己对照书(原书第三版). 5.3-1   直接考虑 ...

  6. 算法导论中英文版下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 算法导论 ...

  7. 你是如何坚持读完《算法导论》这本书的?

    你是如何坚持读完<算法导论>这本书的? <算法导论>不够猛,答者顺便补充 "你是如何坚持读完<计算机编程的艺术>这本书的?" 罗必成: CLRS ...

  8. 我眼中的算法导论 | 第一章——算法在计算中的作用、第二章——算法基础

    一个小白的算法学习之路.读<算法导论>第一天.本文仅作为学习的心得记录. 算法(Algorithm) 对于一个程序员来说,无论资历深浅,对算法一词的含义一定会或多或少有自己的体会,在< ...

  9. 算法导论第三版第二章思考题答案

    算法导论第三版第二章思考题答案 第二章思考题 算法导论第三版第二章思考题答案 2.1 2.2 2.3 2.4 汇总传送门 2.1 #include<iostream> using name ...

  10. 算法导论/第一部分_基础知识

    算法导论: 基础知识 Chapter 1 算法在计算中的作用 1.1 算法 1.2 作为技术的算法 Chapter 2 算法基础 2.1 插入排序 练习: 2.2 分析算法 插入算法的分析 增长量级 ...

最新文章

  1. 长篇自动驾驶技术综述论文(上)
  2. Node.js 报语法错误 SyntaxError: Unexpected identifier
  3. 高性能WEB开发 - HTTP服务器篇
  4. 施一公:让科技工作成为富有吸引力的工作
  5. java 非静态 初始化_Java非静态代码块和实例初始化过程
  6. Vue 封装的过渡与动画
  7. JSP听课笔记(一)
  8. 没有方案你抱怨;有了方案你会认真看吗?
  9. 【语音去噪】基于matlab先验信噪比的维纳滤波算法语音去噪【含Matlab源码 572期】
  10. SAP WM + PDA项目 来料入库流程
  11. 移动端实现点击按钮复制文本功能
  12. SARS-CoV2_ARTIC_Illumina新冠病毒分型和突变分析
  13. 钉钉群机器人通知中的图片,突然不显示了
  14. 迪文串口屏幕通信问题
  15. 润雅信息完成B轮融资 大数据平台赋能汽车销售 1
  16. Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
  17. 永久60服务器消息,魔兽世界怀旧服:永久60级已经成为了另一个游戏,这如你所愿吗?...
  18. 毒蛙(Vuze)执行文件Azureus.exe再分析
  19. docker和kvm的区别,简洁大白话篇,两者的优势对比
  20. 【Kettle Spoon】课程要点简记

热门文章

  1. 在html页面中加入矢量图,在html中引用矢量图
  2. 虚拟机(VMWARE)安装的系统如何访问本地磁盘
  3. 【渝粤题库】国家开放大学2021春2018货币银行学题目
  4. 计算机程序文献类别代码,论文参考文献类型代码参考
  5. ResNet网络结构搭建
  6. 移植LLDP协议到mips架构设备
  7. 蔡勒公式整理——给日期计算星期几
  8. oracle awr报告 开关,【Oracle之AWR报告解析】
  9. 【Unity】对接Steam
  10. 使用微信同声传译插件开发一款翻译类的小程序