1
算法分析与设计
清华大学
宋斌恒
清华大学 宋斌恒 2
授课内容 【 按照层次分 】
n 设计理论
n 分析方法
n 实现技术
n 测试技术
n 应用范围
清华大学 宋斌恒 3
Contents【 按照内容分 】
n Divide and conquer【 分治 】
n Dynamic Programming【 动态规划 】
n Greedy method【 贪婪算法 】
n Amortized Analysis【 均摊分析法 】
n Algorithms in Graphics【 图论中算法 】
n NP-Completeness【 NP完全问题 , 算法理
论 】
n Selected Topics【 专题讲座 】
n Comprehensive Training【 综合训练 】
清华大学 宋斌恒 4
教学目的
n 理论分析能力培养 : 掌握算法分析与设计的基
本理论和方法 , 具有设计新算法和分析复杂性
的能力
n 实践能力的培养 : 学会如何实现设计好的算
法 , 如何测试其正确性和效率 , 应用与实际问
题
n 团队能力培养 : 和各种人员合作工作能力
n 交流能力的培养 : 表达和接受能力
n 独立研究能力培养 : 具有独立开展研究的能力
清华大学 宋斌恒 5
上课的必要条件
n 数据结构 ( 没修过的请修过后再选 )
n 掌握一门对面向对象编程语言 ( C++ 或
Java)
清华大学 宋斌恒 6
基本要求
n 上课不应迟到 , 迟到一次扣 1分 , 自己申报 , 如果迟到
没有申报被发现扣 10分 。
n 不得抄袭 、 剽窃 。 参考文献 、 著作 、 教材和包括其它
同学的作业在内的所有资料 , 必须指明出处 。 其中
n 文献 、 著作 、 教材类公开出版的参考资料 , 按照文献索
引方式引用 。 有可能的话最好提供电子拷贝 。
n 网络资料 , 除指出网络路径 URL, 还应当提供资料电子
拷贝 。
n 参考同学作业应当指出作业编号和提供原作业拷贝 。 多
人讨论的成果 , 应当在作业中反映 。
n 引用他人成果而没有指出出处的以抄袭论处 。 如有抄
袭 , 第一次发现 , 总成绩减去该阶段分值 , 第二次发
现 , 成绩记 0分 , 并以考试作弊向上汇报 。
2
清华大学 宋斌恒 7
鼓励
n 创新
n 提出问题
n 讨论
n 根据平时情况 , 可以得到加分 。
清华大学 宋斌恒 8
教学网站
n 清华大学网络学堂
清华大学 宋斌恒 9
主要参考书
n Introduction to algorithms, Thomas H. Cormen,
etc., second edition, The MIT Press.
n The Art of Computer Programming, Donald E.
Knuth. Volume 1-3, Second Edition.
n Data Structures, Algorithms, and Applications
in C++(Part 3) Sartaj Sahni, China Machine
Press
n算法设计与分析 , 王晓东 , 清华大学出版社
清华大学 宋斌恒 10
综合训练报告框架和要求
1. 问题表述
2. 该问题的研究历史综述 【 该问题与参考资料的关系 】
1. 该问题的最新算法 【 如果有比上述典型算法效率更好的算法 】 介绍
3. 该问题的典型算法介绍 :
1. 该算法主要思想
2. 算法描述
3. 算法正确性说明或者证明
4. 算法复杂度理论分析
5. *涉及到的理论方法总结和推广
4. 算法的实现与测试 【 分别用 Java和 C++ 】 :
1. 算法接口设计
2. 算法使用说明
3. 典型算法的实现 , 包括异常处理和性能估计
4. 典型算法实现的测试分析报告 :
1. 结果是否正确 ?
2. 不同规模输入情况下的效率分析 , 是否与理论分析一致 , 如果不一致 , 为什么 ?
5. 该问题的应用介绍 :
1. 应用背景 , 使用条件等等
2. *部分典型算法的演示软件 。
6. *提出该问题自己的算法
7. 参考资料
清华大学 宋斌恒 11
综合训练问题集
n 大整数运算 【 大整数表示 、 加法 、 减法 、 乘法 、 除
法 、 密指数 , 及其模运算下的上述运算 】
n 密码支撑运算 1【 随机数生成 】
n 密码支撑运算 2【 素数生成算法 】
n 密码支撑运算 3【 标准和经典文献算法 5个左右 Hash运
算 】
n 对称加密算法 【 标准和经典文献算法 5个左右对称加密
算法 】
n 非对称加密算法 【 标准和经典文献算法 5个左右非对称
加密算法 】
清华大学 宋斌恒 12
综合练习问题集 【 续 】
n 字符串 【 模式 】 匹配
n 字符串相似度理论 【 字符串距离编辑等 】
n 索引与查找
n 图文排版优化
n 网络任务调度
3
清华大学 宋斌恒 13
综合练习问题集 【 续 2】
n 图的所有点最短距离问题
n 应用 : 纹理合成中的缝合法 。
n 图的单源最短路径
n 贪婪算法理论 : Matroid、 Greedoid、 GreedSet
n 旅行商问题 【 精确解 、 近似解 】
n 背包问题 【 同上 】
n 自选
清华大学 宋斌恒 14
课程安排介绍
n 前面以介绍设计方法为主
n 后面以解决问题为主
清华大学 宋斌恒 15
算法简介
n 什么是算法 : 算法是一个定义好的用来计算 , 或者更
加一般地说 , 是用于把一定的输入转换成需要的输出
的过程 。 大家最熟悉不过的算法就是算术中的加法和
乘法 。 下面我们通过一个二进制的加法来说明问题 :
n 10011011101
n + 111011010001
n = 1001110101110
n 算法 : 一个循环 :
n i=0; i++; i<length(第二个数 ):
n 如果第二个数 [i]==1 plus(第一个数 , i)
n plus(数 , i): //在数的第 i位加 1
n 如果 数 [i]==1 数 [i]=0; plus( 数 , i+ 1);
清华大学 宋斌恒 16
本课程要回答算法的几个基本问题
n 它会停下来吗 ?
n 它的结果正确吗 ?
n 它运算快吗 ?
n 它使用了多少内存 ?
n 进一步我们需要回答 :
n 它能够应用到那些领域 ?
n 利用不同语言实现需要那些技巧 ?
清华大学 宋斌恒 17
算术
n 历史上 , 算术运算是一件非常有意思的工作 ,
现在看起来人人都会用的算术 , 其广泛应用也
只是最近的事 。 算术的关键是表示 , 如十进
制 、 罗马进制 。 利用罗马进制进行算术运算并
不是一件轻松的事 。
清华大学 宋斌恒 18
进制问题
n 中国一直使用十进制来表示数字 , 而通过算盘
这种 2- 5- 10进制可以进行快速算术计算 , 宋
朝开始普及 。
4
清华大学 宋斌恒 19
半坡时代
n 中国最早使用十进制 , 可以追溯到半坡时代
( 约公元前 4000年 , 陕西地区 )。
n 根据出土的陶器上面记录的数字符号 , 半坡人
至少掌握了三十以内的自然数 , 并且使用十进
制计数 ⑴ 。
n 不过这时候的计数称之为十进制有一些勉强 。
因为它还没有 “零 ”和 “空位 ”的概念 。
n 半坡人只会记录 “10”, “20”, “30”这些整十倍的
数 , 而对于其他十以上的数就没有办法了 。
清华大学 宋斌恒 20
商朝
n 到了商朝 ( 约公元前 1400年 ), 出现了甲骨
文 。 甲骨文比半坡计数更进了一步 , 出现了表
示 “百 ”“千 ”“万 ”的专门符号 , 并通过这些符号与
基本数字的组合可以记录高达几万的整数 ⑴ 。
n 说明这时的人已经有了 “位 ”的概念 。 周朝 《 周
易 》 书中 , 就有 “万有一千五百二十 ”的记载 。
清华大学 宋斌恒 21
春秋战国时期
n 到春秋战国时期出现了 “算筹 ”这种计算工具 。 算筹分横
式和纵式两种摆法 。 在计数时个位放纵式 , 十位放横
式 , 依此类推 。 若是两个横式或者纵式连在了一起 ,
就表示中间存在一个 “空位 ”⑴ 。 “空位 ”概念的出现 , 应
该是现代计数方法的一个里程碑 。 根据 《 孙子算经 》
中记载 : “凡算之法 , 先识其位 , 一从十横 , 百立千
僵 , 千十相望 , 万百相当 ”。 可以说 , 这时候的计数虽
然还没有表示 “零 ”的符号 , 但已经意识到了 “零 ”这个概
念 。 除了不能准确表达多个连续的空位等问题以外 ,
与阿拉伯十进制计数已经没什么区别了 。 这个时期的
田齐量制 , 也采用了 “升 — 斗 — 石 ”的十进位制 ⑷ , 可见
十进制在这个时期开始已经开始被广泛应用了 。
清华大学 宋斌恒 22
汉代
n 汉代蔡伦 ( 约公元 100年 ) 发明造纸术 , 大大
推动了数学的发展 。 不久之后为了避免混淆采
用方框来表示空位 , 后来又演变为圆圈 ⑴ 。 可
以说 , 完备的十进制计数法最终形成了 。
清华大学 宋斌恒 23
全球
n 作为四大文明古国之一 , 中国在十进制计数方
面走在了最前面 。 古巴比伦人 ( 公元前 2400~
前 1600年 ) 使用的是六十进制 ; 古埃及 ( 公元
前 1850~ 前 1650年 ) 的数学虽然以十为基
数 , 但没有形成 “位 ”的概念 ; 而印度直到公元
825年才有著作描述了 “完备的印度数系 ”⑴ , 我
们所采用的阿拉伯数字及计数法 , 便是这之前
不久 ( 约公元 600年 ) 由印度经阿拉伯流传到
世界各地的 ⑶ 。
清华大学 宋斌恒 24
参考文献
n ⑴ 潘天骥 , 十进位值制的记数法首创于中国 , 九江
师专学报 , 1995年 05期
n ⑵ 王永建 , 进位制的由来 , 江苏教育 , 1997年 01期
n ⑶ C.Marchal., 刘义燧 , 计数法的简史及展望 , 自然
杂志 , 1995年 05期
n ⑷ 宁可 , 有关汉代农业生产的几个数字
n http://www.guoxue.com/economics/ReadNews.asp?
NewsID=455&BigClassID=26&SmallClassID=44&Sp
ecialID=120
n ⑸ 数学大事年表
http://jamesjoe.51.net/refrence/matheven.html
5
清华大学 宋斌恒 25
算盘
n 算盘被誉作中国贡献于世界的 “第五大发明 ”,
可谓地道中国特产了 。
n 随着对陜西歧山出土文物西周陶丸的研究 , 中
国算盘的发明时间已经提前到二千多年前的西
周时期 。 陕西岐山县西周宫室遗址中出土的 90
粒青黄两色陶丸 , 青色 20粒 , 黄色 70粒 。 【 但
有学术争论 】
清华大学 宋斌恒 26
陈聪同学 2004年秋天的文献综述
n “陶丸是珠算工具 ”的这种说法 , 可以在网上搜索到很
多 , 姑且找一个比较权威的网站 。 新华网 2003年 10月
2日报道 “记者日前在岐山县采访时获悉 , 全县最小的
乡 ――― 京当乡近年来出土了大批的珍贵文物 , 其中
有 18件占据了中国考古之最 ”, “出土的陶丸 , 是我国
最早的计算工具算珠 ”。 标明稿件来源 : 西安晚报 。 ①
“中国珠算协会副会长 、 陕西数学史研究会会长李培业
对数学史最大的贡献是在珠算史研究方面 ”, “根据陕西
岐山县西周宫室遗址中出土的 90粒青黄两色陶丸 , 结
合 《 数术记遗 》 中对珠算算具的文字注释 , 证明了这
是珠算工具 , 从而把中国古珠算的历史年代推前了
1000余年 , 证明中国是最早发明珠算的国家 ”②
清华大学 宋斌恒 27
续
n 可见 , 新华网的这种说法的根据是李培业先生
的研究结果 。 而李培业的文章 《 对西周宫室遗
址出土陶丸之考察 》 发表于 1984年 《 珠算 》 04
期 , 同时期研究者发表类似意见的文章还有 :
陕西周原岐山文管所刘亮的 《 试说周原遗址出
土的陶丸 》 ( 《 珠算 》 1984年 04期 ), 户谷清
一 ( 日本 ) 的 《 从西周宫室遗址出土的陶丸探
索算盘的起源 》 ( 《 珠算 》 1985年 05期 , 《 齐
鲁珠坛 》 1994年 04期 ) ③ , 以及姜克华的 《 西
周陶丸之研究 》 ( 《 齐鲁珠坛 》 1994年 02期 )
等等 。
清华大学 宋斌恒 28
n 而近十年来考古界的研究成果 , 很多都否定了这种说
法 。 1996 年 12 月 11 日至 13 日在陕西省岐山县召开的
“中国珠算协会第四届珠算史专业委员会暨陶丸鉴定会 ”
认为陶丸与 “三才算 ”有关 , 而不是珠算 。 ④ 王为桐和王
世玉的 《 驳西周陶丸异义 》 ( 《 齐鲁珠坛 》 1997年 06
期 ) 也认为陶丸与珠算无关 。
n 考古界对此看法纷纭 。 张福汉和肖宗史认为 “三才算 ”也
属于 “珠算 ”的范畴 , 关键是确定陶丸是 “哪一种珠算的
算珠 ”⑤ ; 王为桐 , 王世玉和公维萍更是认为 “西周陶丸
不是珠算用珠 , 而是弹丸 ”⑥
n 从以上资料可以看出 , 学术界对于西周陶丸究竟何用
并无一个统一的说法 。
清华大学 宋斌恒 29
参考文献
n ① 新华网 《 陕西岐山最小乡出土 18件文物居中国考古之最 》
http://www.xinhuanet.com/chinanews/2003-
10/23/content_1094597.htm
n ② 新华网 《 康熙数学专著发现经过大解密 》
http://news.xinhuanet.com/newscenter/2003-
03/03/content_755023.htm
n ③ 齐鲁珠坛 , 1997年 04期 , 王为桐 , 王世玉 , 贺西周陶丸研究的
突破
n ④ 齐鲁珠坛 , 1997年 06期 , 王为桐 , 王世玉 , 驳西周陶丸异义
n ⑤ 陕西经贸学院学报 , 1997年 03期 , 张福汉 , 肖宗史 , 岐山 “西
周陶丸 ”再考
n ⑥ 齐鲁珠坛 , 1999年 01期 , 王为桐 , 王世玉 , 公维萍 , 西周陶丸
用途的结论
清华大学 宋斌恒 30
Some of major successes fields
n Parsing algorithms - these form the basis of
the field of programming languages
n Fast Fourier transform - the field of digital
signal processing is built upon this algorithm.
n Linear programming - this algorithm is
extensively used in resource scheduling.
n Sorting algorithms - until recently, sorting
used up the bulk of computer cycles.
n String matching algorithms - these are
extensively used in computational biology.
6
清华大学 宋斌恒 31
Number of major successes fields
n Number theoretic algorithms - these
algorithms make it possible to implement
cryptosystems such as the RSA public key
cryptosystem.
n Compression algorithms - these algorithms
allow us to transmit data more efficiently over,
for example, phone lines.
n Geometric algorithms - displaying images
quickly on a screen often makes use of
sophisticated algorithmic techniques.
清华大学 宋斌恒 32
Related aspect
n Abstract model of computer:
n High level of languanges
清华大学 宋斌恒 33
Divide and Conquer
n Divide and Conquer is a method
n Applying cases:
n A large size problem, how to solve it?
n We can solve small size problems!
n Divide it into several small size problems,
n Solve these small size sub-problems!
n Next, what shall we do?
n Combine the sub-solution to get the solution of
the original problem.
清华大学 宋斌恒 34
Example of a Divide and Conquer
n Problem: sorting {12,3,45,5,21,7,9,1,10}
n Divide: it is too big to solve, if it is smaller we
may solve it, so we divide it into two problem:
n Sub-problem1: sorting{12,3,45,5,21}
n Sub-problem2: sorting{7,9,1,10}
清华大学 宋斌恒 35
n Conquer: we use some methods (any kind of)
to solve it and get the sub-problems’solutions,
that means we sort the two sub-problems:
n Solution of sub-problem1:{3,5,12,21,45}
n Solution of sub-problem2:{1,7,9,10}
n Combine: we should use these two solutions
to construct the solution of the original
problem, see next page
清华大学 宋斌恒 36
1. Merge(A, B) //A and B are two sorted Arrays
1. r=s=0;
2. Create array C //to store the result
3. i=0 //index of C
4. While not end of A and B //r<A.length & s<B.length
1. If(A[r]<B[s]) then
1. C[i]=A[r];
2. r++; i++;
2. Else
1. C[i]=B[s];
2. s++; i++;
5. If(r==A.length)
1. Append B[s,… ,B.length-1] to C
6. Else
1. Append A[r,… ,A.length-1] to C
7. Return C
7
清华大学 宋斌恒 37
Solution!
n Using the merge algorithm we get the
solution:{1,3,5,7,9,10,12,21,45}
n Any left problems?
清华大学 宋斌恒 38
Correctness
n Is your solution correct?
n Does your merge algorithm outcome a sorted
array in any case?
n Is the condition for merge algorithm fulfilled?
n How to fulfill the condition?
n Using other method
n Using the same divide and conquer method
n To a trivial state: for example there are only one
element for sorting.
清华大学 宋斌恒 39
Complexity Analysis
n How many memories does the algorithm use?
n How many steps does the algorithm use?
n Let T(n) be the number of steps used in the algorithm
for an array of length n, then we know that by the
divide and conquer that:
n T(n)=2T(n/2)+Θ( n), where Θ is an asymptotic
expression means tighten bound, its definition will be
given in the next page【 我们假设每次均分 , 而且正好
可以均分 】
清华大学 宋斌恒 40
Notation Θ
n If there exists two positive constants c and d such
that when n tends to infinity we have cg(n) ≤ f(n) ≤
dg(n) then we call g(n) is an asymptotically tight
bounds of f(n) and denote it as
f(n)= Θ(g(n))
n Other notations o[not tight upper bound], O[upper
bound] and ?[lower bound], ω[not tight lower bound]
can be found in p.41 in the reference book.
清华大学 宋斌恒 41
Left problems
n What is the upper bounds and lower bounds for the
sorting problem?
n How to solve the recursive equality(or inequality)?
n T(n)=2T(n/2)+Θ( n)
n How to converge the above equality to a well posed
problem?
n How to solve the problem?[Master theorem see p.76]
清华大学 宋斌恒 42
Exercise
n Big integer’s expression, addition and
multiplication in a 32-bits microcomputer.
n How to express a big integer?
n We use an n-length of array of integers
A[0,… ,n-1] to express a big integer which is
less than or equal to 232(n+1)-1 but is bigger
than 232n
n Attention! We use 232 radix.
8
清华大学 宋斌恒 43
Addition of big integer
n Can you ever do a plus for big integers?
n can you do a plus for small integers which is
32-bits or less?
n How to divide the big integers summation to a
series of small integers summations?
n How to combine it together?
n How many steps do you use in your algorithm?
清华大学 宋斌恒 44
Multiplication of big integers
n A=a1 232r + a2
n B=b1 232s + b 2
n Where r=A.length/2, s=B.length/2, hence the
size of a1, a2 are half size of A, it is similar for
B, b1, b2
n AB=a1 b1 232(s+r) +b1 a2 232s +a1 b2 232r +a2 b2
n Converge the multiplication to 4 smaller
integers multiplications and summations
清华大学 宋斌恒 45
Complexity analysis
n T(n,m)----the steps used for multiplication of a
32n-bits and 32m -bits integers
n T(n,m)=4T(n/2,m/2)+Θ(m+n)
n Result?
n Let n=m then
n T(n)=4T(n/2)+Θ(n)
n T(n)= Θ( n2 )
清华大学 宋斌恒 46
The above performance can be
obtained by a directed method
n Can you give a na?ve algorithm for
multiplication of big integers?
清华大学 宋斌恒 47
An improved algorithm
n A=a1 232r + a2
n B=b1 232r + b2
n Let n=A.length= B.length and r=n/2,
n AB=a1 b1 264r +(b1 a2 +a1 b2) 232r +a2 b2
n We can converge the multiplication to 4
smaller integers multiplications and 3
summations
n Can we do better?
清华大学 宋斌恒 48
We need only 3 multiplications!
n u= a1 b1
n v= a2 b2
n (b1 a2 +a1 b2) =(a1 + a2) (b1 + b 2)-u-v
n We needs only 3 multiplications to get:
n a1 b1, a2 b2, (b1 a2 +a1 b2)
9
清华大学 宋斌恒 49
More Divide Conquer Examples
n Can you give more?
n二路归并排序
n最接近点对
n二分搜索