算法的概念
算法的特点:确定性、可行性、输入和输出及有穷性。
正确的算法;停机并给出符合问题的定义的输出。
研究算法的基本意义
算法涉及到解决问题的:正确性、可行性以及效率。
以效率为例:对1M数据进行排序
算法与其他技术的关系
硬件设计——布线算法
图形界面——图形生成、处理等
面向对象——编译器设计
局域网和广域网——冲突避免、路由、交换
算法无处不在。
算法设计方法简介
增量式
逐步求解的过程,如插入排序
思考题:
给定一个整数数组A,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入:[-2,1,-3,4,-1,2,1,-5,4]
分治策略:一归并排序为例
归并过程示意图:
伪码:
1: n1←q − p + 1
2: n2←r − q
3: create arrays L[1 · · · n1 + 1] and R[1 · · · n2 + 1]
4: for i←1 to n1 do
5: L[i]←A[p + i − 1]
6: end for
7: for j←1 to n2 do
8: R[j]←A[q + j]
9: end for
10: L[n1 + 1]←∞
11: R[n2 + 1]←∞
12: i←1
13: j←1
14: for k←p to r do
15: if L[i] ≤ R[j] then
16: A[k]←L[i]
17: i←i + 1
18: else
19: A[k]←R[j]
20: j←j + 1
21: end if
22: end for
23: if p < r then
24: q←b p+r 2 c
25: MERGE-SORT(A, p, q)
26: MERGE-SORT(A, q + 1, r)
27: MERGE(A, p, q, r)
28: end if
动态规划:
一种强有力的技术;
从小的子问题的解逐步计算出大问题的解;
计算过程通过动态填表实现;
贪心策略:
最常用的启发策略;
但常常"贪心"不能保证得到好的结果
有些问题满足一些特定性质,可以保证"贪心"一定可以产生最好的结果。
搜索
几乎是通用的办法;
不过开销巨大
循环不变性法
算法正确性分析循环是关键、
以插入排序正确性分析:
L emma 1
在每次循环开始时(第j步) ,A[1,j- 1]是有序的。
Proof.
初始时: A[1,j- 1]中只有一个数,显然成立。
保持性:在循环迭代开始前成立,迭代中,while循环找到正确位
置插入A[j]。所以,这步迭代后命题仍成立。
终止时:将循环退出时的j值带人引理,得到插入排序的正确性。
分析算法,归纳出循环不变性(循环迭代过程,始终成立的命
题)。
Initialization:在第一次循环开始前不变性是满足的。
Maintenance:如果在某次迭代前不变性满足,在这次迭代后也
满足不变性。
Termination:循环结束后,不变性可以提供程序正确性的有用信
息。
例2,归并过程的正确性
Lemma 2
在MERGE中,第14步循环每次开始时,有Ap, k―1]是有序的;
Alp, k一1]是最小的k 一 p个元素;
L[i]是L中待合并的元素中最小的;
R[j]是R中待合并的元素中最小的。
Initialization: k = p,i= 1,j = 1,显然成立。o Maintenance:若L[团]≤R[i],则
L[i]是所有剩下的元素中最小的;
而A[p….k-1]中的元素均大于等于L[i],因此。A[p…k]是所有元素中最小的k 一p+1个元素;
由于L中的数是排好序的,因此L[+1]将是L中剩下元素中最小的;
R[i]仍然是R中最小的。
若L[团]>R[i],可以进行类似讨论。
Termination:循环结束后,k=r+1,代入不变性1,得A[p…r]有序。