2.1循环不变式(loop invariant)
- 性质
- 初始化:循环第一次迭代前为真(即第一次赋值是否有效);
- 保持:如果循环的某次迭代前它为真,那么下次迭代之前它仍为真(循环体内一次运算后回到下一个初始位置);
- 终止:循环终止时提供一个有用的性质,有助于证明算法的正确性(终止时的检验);
- 注意点:不要过分形式主义;
2.2 伪代码中的约定
- to:迭代递增1;
- downto:迭代减少1;
- 变量一般为局部的;
- 参数为按值传递,指针为按引用传递;
- return可返回多个值;
- 布尔运算短路运算;
- error:错误,但不用说明具体发生什么错误;
2.3 RAM模型与运行时间
- RAM模型
- 通用的单处理器模型
- 设计贴近真实计算机
- 不涉及高速缓存与虚拟内存
指数运算有时可以用位运算简化
- 运行时间
- 分最佳情况与最坏情况,一般考虑最坏情况
- 运行时间是指执行的基本操作数
- 一般以常数乘次数表示
- 增长量级往往是最重要的标志
2.4归并排序及其分析
循环不变式的验证
初始化
A[p..k-1]总是有序的,且当k=p时,A中共有0个元素,必然有序,故成立;保持
每次k必然递增1,同时有i或j递增1,即i+j=k-p;终止
终止时k=r+1,对应两个哨兵牌
运行时间分析
T(n)=⎧⎩⎨Θ(1)aT(n/b)+D(n)+C(n)
其中T(n/b)表示子问题,D(n)表示分解所需时间,C(n)表示合并子问题所需时间。
化简后得
T(n)=2T(n/2)+Θ(n)
其中渐进次数与匿名函数出现次数有关,与数学含义无关,即
∑i=1nΘ(i)⇎Θ(1)+Θ(2)+⋯+Θ(n)
目前由数学归纳法或画树状图的方法,可以求出T(n)=Θ(nlgn)