在论述插入排序的正确性的时候, 书中引入了循环不变量的概念, 刚开始稍微有点不太明白, 早上查了一波资料之后决定把自己的理解记录下来.

什么是循环不变量 ?

在我看来, 所谓循环不变量的就是一个在循环前, 每次循环后(当然也包括循环结束)都成立的性质.

如何证明算法的正确性 ?

首先要知道循环不变量是用来辅助我们证明算法的正确性的. 所以首先我们需要找出能够帮助我们证明算法正确性的性质作为我们的循环不变量(之后给出具体例子). 然后分三个角度进行证明其正确性 :

  1. 循环前
  2. 每次循环之后
  3. 循环结束后

具体的例子 :

为了详细阐述这个论述的过程, 我采用了书中习题2.1-3中的例子 :

输入 : 给出一个数组array以及一个数v

输出 : 若存在array[i] = v, 输出i, 否则输出NIL

给出伪代码并证明其正确性.

for i <- 0 to n - 1
    if array[i] = v
        return i
return NIL

loop invariant : for any [0 .. x < i], there does not exist array[x] = v

Initialization : before the loop i = 0, x < 0 is out of the array bound.

Maintenance : when loop did not terminate, then it's obvious that no array[x] = v in 0 .. i - 1.

Termination : If it terminate because of array[i] = v, then in [0 .. i - 1], there is no array[x] = v; otherwise when i = n, then it is correct for [0 .. n-1], then there is no such x for the whole array.

循环不变量loop invariant 与 算法的正确性的更多相关文章

  1. 心智与认知(1): 反馈循环(Feedback loop)

    目录: ** 0x01 反馈循环(Feedback loop) | How to see System in everyday life ** 0x02 如何像视频游戏一样剖析你的人生?| 打怪升级这 ...

  2. oracle的控制语句if和循环语句loop while for

    pl/sql的控制结构if-then if-then-else if-then-elsif-else 案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10% ...

  3. for循环之初学者N多算法小练习

    for循环之初学者N多算法小练习 显示1到100的数,每行显示5个. for (int i=1;i<=100;i++){     if (i%5==0){         System.out. ...

  4. LDA工程实践之算法篇之(一)算法实现正确性验证(转)

    研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...

  5. 简单了解一下事件循环(Event Loop)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  6. JS事件循环(Event Loop)机制

    前言 众所周知,为了与浏览器进行交互,Javascript是一门非阻塞单线程脚本语言. 为何单线程? 因为如果在DOM操作中,有两个线程一个添加节点,一个删除节点,浏览器并不知道以哪个为准,所以只能选 ...

  7. 【JMeter_07】JMeter逻辑控制器__循环控制器<Loop Controller>

    循环控制器<Loop Controller> 业务逻辑: 根据所填写的循环次数,对当前节点下的取样器进行响应次数的循环请求,这里可以填写变量.整数.小数.字母.负数.各种符号等: 当填写整 ...

  8. 事件循环 event loop 究竟是什么

    事件循环 event loop 究竟是什么 一些概念 浏览器运行时是多进程,从任务管理器或者活动监视器上可以验证. 打开新标签页和增加一个插件都会增加一个进程,如下图:  浏览器渲染进程是多线程,包 ...

  9. 事件循环Event loop到底是什么

    摘要:本文通过结合官方文档MDN和其他博客深入解析浏览器的事件循环机制,而NodeJS有另一套事件循环机制,不在本文讨论范围中.process.nextTick和setImmediate是NodeJS ...

随机推荐

  1. HTML适应手机浏览器宽度

    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scal ...

  2. PHP安装所最到的问题-解决方案

    Although Drupals 7+ run smoothly on PHP 5.3, Drupal 6 still feels much better with PHP 5.2. Even tho ...

  3. ADF_ManagedBean的概念和管理(概念)

    20150623 Created By BaoXinjian

  4. [MySQL] 忘记root账户密码怎么办

    一.缘由 由于各种原因,我们会忘记mysql的root密码. 二.解决办法 方法一:skip-grant-tables方式启动 1.停止mysql服 务 service mysqld stop 2.以 ...

  5. sqlite 报错:database is locked

    在sqlite批量添加数据时,报错:database is locked. 解决办法:将db路径由相对路径设置为绝对路径.

  6. go1.6.2 linux/amd64 的一个bug: gcc: 无法识别的选项‘-no-pie’

    如果你的linux是中文版的. 即:执行 # echo $LANG 命令,返回的是 zh_CN.UTF-8 则会出现这个bug, 如果是 en_US.UTF-8 则没有这个问题.   这个bug的一个 ...

  7. AndroidManifest.xml

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  8. 构造方法Constructor

    构造函数的名称与类名相同,没有返回值类型,主要用于在创建对象的时候进行一些初始化操作,如一个类中没有构造方法,java会默认给一个无参的构造方法

  9. USB编程研究之二(常见设备类型的GUID)

    在USB编程之前要事先了解一下GUID的概念. 应用其他网页中的定义: 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装.在许多流行软件应用程序(例如 Web 浏览器和媒体 ...

  10. ORacle初级题

    一. 选择(每题1分,共15分) 1.在linux系统中,可以通过以下命令查看内核版本(). * A.who B.hostname C.uname -r D.release 2.登入linux系统后, ...