算法设计与分析王晓东
算法设计与分析(王晓东)

a b a b
(2)方法重载:Java允许方法重载,即允许定义有不同签名的同名方法。
上述方法ab可重载为:
public static double ab(double a, double b) { return (a+b+Math.abs(a-b))/2.0; } 12
4.异常
1.3 描述算法
6
1.2 表达算法的抽象机制
2.抽象数据类型
抽象数据类型是算法的一个数据模型连同定义在该模型上 并作为算法构件的一组运算。
抽象数据类型带给算法设计的好处有:
(1)算法顶层设计与底层实现分离; (2)算法设计与数据结构设计隔开,允许数据结构自由选择; (3)数据模型和该模型上的运算统一在ADT中,便于空间和时间耗费的折衷; (4)用抽象数据类型表述的算法具有很好的可维护性; (5)算法自然呈现模块化; (6)为自顶向下逐步求精和模块化提供有效途径和工具; (7)算法结构清晰,层次分明,便于算法正确性的证明和复杂性的分析。
中国计算机学会 “21世纪大学本科计算机专业系列教材”
算法设计与分析
王晓东 编著
1
主要内容介绍
• • • • • • 第1章 第2章 第3章 第4章 第5章 第6章 算法引论 递归与分治策略 动态规划 贪心算法 回溯法 分支限界法
算法设计与分析王晓东

习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。
解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。
解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成该算法的时间为t秒。
现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。
习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。
对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
计算机算法设计与分析(王晓东第4版)第8章

Department of Electronic Information
30
Fun Time
z
=
9
+
21x2
−
3 4
x4
−
2x5,
s.t.
x3
−
1 2
x2
+
41x4
=
3
x1 x6
+ −
5 2
x2
5 2
x2
+ −
41x4 43x4
+ +
2x5 = 10 +8x5 = 1
• 选出使目标函数增加的非基本变量作为入基变量 • z 行中的正系数非基本变量都满足要求
Department of Electronic Information
24
单纯形表
max z = −x2 + 3x3 − 2x5,
s.t.
x1
+
3x2
−
x3
+
2x5
=
7
x4 − 2x2 + 4x3 = 12
x2 x3 x5
z 0 -1 3 -2 x1 7 3 -1 2 x4 12 -2 4 0 x6 10 -4 3 8
Department of Electronic Information
23
单纯形算法的第 1 步–选取入基变量
• 查看单纯形表的第 1 行(也称之为 z 行)中标有非 基本变量的各列中的值
2x2 − 7x4 ≤ 0 x1 + x2 + x3 + x4 = 9
x2 − x3 + 2x4 ≥ 1 xi ≥ 0, i = 1, 2, 3, 4
计算机算法设计与分析(第5版)

作者简介
王晓东:男,1957年生,山东人,福建工程学院副院长,教授,博士生导师,福建省计算机学会理事长。主 讲课程:算法与数据结构、算法设计与分析、文献阅读与选题报告 。
目录
(注:目录排版顺序为从左列至右列 )
教学资源
《计算机算法设计与分析(第5版)》有配套教材——《计算机算法设计与分析习题解答(第5版)》 。
教材特色
《计算机算法设计与分析(第5版)》修正了第4版中发现的一些错误,并将各章的习题分为算法分析题和算 法实现题两部分,增加了算法实践性内容,增加了有关串和序列的算法内容。
《计算机算法设计与分析(第5版)》由王晓东担任主编;傅清祥教授、吴英杰教授、傅仰耿博士和朱达欣教 授参加了该教材有关章节的讨论,对该教材内容及各章节的编排提出了意见;田俊教授审阅了全书。该教材在编 写过程中,得到了全国高等学校计算机专业教学指导委员会的支持。福州大学“211工程”计算机与信息工程重 点学科实验室和福建工程学院为该教材的写作提供了设备和工作环境 。
该教材各章的论述中,首先介绍一种算法设计策略的基本思想,然后从解决计算机科学和应用中的实际问题 入手,描述几个算法。同时对每个算法所需的时间和空间进行分析,使读者既能学到一些常用的算法,也能通过 对算法设计策略的反复应用,牢固掌握这些算法设计的基本策略。该教材选择某些问题,通过对解同一问题的不 同算法的比较,使读者体会到每种算法的设计要点。
2018年8月,该教材由电子工业出版社出版 。
计算机算法设计与分析(第4版)[王晓东][电子教案]第2章
![计算机算法设计与分析(第4版)[王晓东][电子教案]第2章](https://img.taocdn.com/s3/m/6ef58047f7ec4afe04a1df38.png)
2.1 递归的概念
例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。
A(1,0) 2 A(0, m) 1 m0 A(n,0) n 2 n2 A(n, m) A( A(n 1, m), m 1) n, m 1
2.1 递归的概念
例3 Ackerman函数 前2例中的函都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
T(n)
n/2
=
n/2
n
n/2 n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
1 q ( n, n ) q ( n, m ) 1 q (n, n 1) q ( n, m 1) q (n m, m)
正整数n的划分数p(n)=q(n,n)。
n 1, m 1 nm nm n m 1
2.1 递归的概念
例6 Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍 按同样顺序叠臵。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中 任一塔座上。
计算机算法设计与分析(王晓东) 第5章 回溯法

n=3时的0-1背包问题用完全二叉树表示的解空间
5
生成问题状态的基本方法
扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的节点称 做活结点 死结点:一个所有儿子已经产生的结点称做死结点 深度优先的问题状态生成法:如果对一个扩展结点R,一旦 产生了它的一个儿子C,就把C当做新的扩展结点。在完成 对子树C(以C为根的子树)的穷尽搜索之后,将R重新变 成扩展结点,继续生成R的下一个儿子(如果存在) 宽度优先的问题状态生成法:在一个扩展结点变成死结点 之前,它一直是扩展结点 回溯法:为了避免生成那些不可能产生最佳解的问题状态, 要不断地利用限界函数(bounding function)来处死那些实际 上不可能产生所需解的活结点,以减少问题的计算量。具 有限界函数的深度优先生成法称为回溯法
}
18
n后问题
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象 棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线 上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任 何2个皇后不放在同一行或同一列或同一斜线上。
1 2 3 4 5 6 7 8 Q Q Q Q Q Q Q
void backtrack (int i) {// 搜索第i层结点 if (i > n) // 到达叶结点 更新最优解bestx,bestw; return; r -= w[i]; if (cw + w[i] <= c) {// 搜索左子树 x[i] = 1; cw += w[i]; backtrack(i + 1); cw -= w[i]; } if (cw + r > bestw) { x[i] = 0; // 搜索右子树 backtrack(i + 1); } r += w[i];
计算机算法设计与分析(第4版) 王晓东习题解答

第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。
算法设计与分析(第4版)

内容简介
《算法设计与分析(第4版)》以算法设计策略为知识单元,系统地介绍计算机算法的设计方法与分析技巧, 以期为计算机科学与技术学科的学生提供广泛而坚实的计算机算法基础知识。
第1章中首先介绍算法的基本概念,接着简要阐述算法的计算复杂性和算法的描述,然后围绕设计算法常用的 基本设计策略组织第2章至第10章的内容。第2章介绍递归与分治策略,这是设计有效算法常用的策略,是必须掌 握的方法。第3章是动态规划算法,以实例详述动态规划算法的设计思想、适用性以及算法的设计要点。第4章介 绍贪心算法,它与动态规划算法的设计思想有一定的。第5章和第6章分别介绍回溯法和分支限界法,这两章所介 绍的算法适合处理难解问题。第7章介绍概率算法,对许多难解问题提供解决途径。第8章介绍NP完全性理论和解 NP难问题的近似算法。第9章介绍有关串和序列的算法。第10章通过实例介绍算法设计中常用的算法优化策略。 第11章介绍算法设计中较新的研究领域——在线算法设计。
《算法设计与分析(第4版)》按照教育部制定的“计算机科学与技术专业规范的教学大纲”编写,在前三版 的基础下作了相应修改,按照国际计算机学科的教学要求进行整编。
《算法设计与分析(第4版)》是在21世纪大学本科计算机专业系列教材编委会的指导下完成出版。 2018年10月1日,《算法设计与分析(第4版)》由清华大学出版社出版。
全书共分11章,由算法引论、递归与分治策略、动态规划、章贪心算法、回溯法、分支限界法、概率算法、 NP完全性理论与近似算法、串与序列的算法、算法优化策略、在线算法设计组成。
成培养中国21世纪计算机各类人才的需要,结合中国高等学校教育工作的现状,立足培养学生能跟上 国际计算机科学技术的发展水平,更新教学内容和教学方法,提高教学质量,作者编写了该书。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。
解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。
解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成该算法的时间为t秒。
现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。
习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。
对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
解答:(1)f(n)=logn^2;g(n)=logn+5. logn^2=θ(logn+5)(2)f(n)=logn^2;g(n)=根号n. logn^2=O(根号n)(3)f(n)=n;g(n)=(logn)^2. n=Ω((logn)^2)(4)f(n)=nlogn+n;g(n)=logn. nlogn+n=Ω(logn)(5)f(n)=10;g(n)=log10. 10=θ(log10)(6)f(n)=(logn)^2;g(n)=logn. (logn)^2=Ω(logn)(7)f(n)=2^n;g(n)=100n^2. 2^n=Ω(100n^2)(8)f(n)=2^n;g(n)=3^n. 2^n=O(3^n)习题2-7 证明:如果一个算法在平均情况下的计算时间复杂性为θ(f(n)),则该算法在最坏情况下所需的计算时间为Ω(f(n))。
证明:Tavg(N)=IeDn∑P(I)T(N,I)≤IeDn∑P(I)IeDnmaxT(N,I')=T(N,I*)IeDn∑P(I)=T(N,I*)=Tmax(N)因此,Tmax(N)=Ω(Tavg(N))=Ω(θ(f(n)))=Ω(f(n))习题2-8 求解下列递归方程:So=0;Sn=2Sn-1+2^n-1.解答: 1应用零化子化为齐次方程,2解此齐次方程的特征方程,3由特征根构造一般解,4再由初始条件确定待定系数,得到解为:Sn=(n-1)2^n+1习题2-9 求解下列递归方程Ho=2;H1=8;Hn=4Hn-1-4Hn-2.解:Hn=2^(n+1)(n+1)第三章递归与分治策略习题3-1 下面的7个算法都是解决二分搜索问题的算法。
请判断这7个算法的正确性。
如果算法不正确,请说明产生错误的原因。
如果算法正确,请给出算法的正确性证明。
public static int binarySearch1(int []a,int x,int n){int left=0; int right =n-1;while (left<=right) {int middle = ( left + right )/2;if ( x == a[middle]) return middle;if ( x> a[middle]) left = middle;else right = middle;return -1;}public static int binarySearch2(int []a, int x, int n){int left = 0; int right = n-1;while ( left < right-1 ) {int middle = ( left + right )/2;if ( x < a[middle]) right = middle;else left = middle;}if (x == a[left]) return left;else return -1}public static int binarySearch3(int []a, int x, int n) {int left = 0; int right = n-1;while ( left +1 != right) {int middle = ( left + right)/2;if ( x>= a[middle]) left = middle;else right = middle;}if ( x == a[left]) return left ;else return -1;}public static int binarySearch4(int []a, int x, int n) {if (n>0 && x>= a[0]) {int left = 0; int right = n-1;while (left < right ) {int middle = (left + right )/2;if ( x < a[middle]) right = middle -1 ;else left = middle;}if ( x == a[left]) return left;}return -1;}public static int binarySearch5(int []a, int x, int n) {if ( n>0 && x >= a[0] ) {int left = 0; int right = n-1;while (left < right ) {int middle = ( left + right +1)/2;if ( x < a[middle]) right = middle -1;else left = middle ;}if ( x == a[left]) return left;}return -1;}public static int binarySearch6(int []a, int x, int n) {if ( n>0 && x>= a[0]) {int left = 0; int right = n-1;while ( left < right) {int middle = (left + right +1)/2;if (x < a[middle]) right = middle – 1;else left = middle + 1;}if ( x == a[left]) return left ;}return -1;}public static int binarySearch7(int []a, int x, int n){if ( n>0 && x>=a[0]) {int left = 0; int right = n-1;while ( left < right) {int middle = ( left + right + 1)/2;if ( x < a[middle]) right = middle;else left = middle;}if ( x == a[left]) return left;}return -1;}分析与解答:算法binarySearch1数组段左右游标left和right的调整不正确,导致陷入死循环。
算法binarySearch2数组段左右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
算法binarySearch3数组段左右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
算法binarySearch4数组段左右游标left和right的调整不正确,导致陷入死循环。
算法binarySearch5正确,且当数组中有重复元素时,返回满足条件的最右元素。
算法binarySearch6数组段左右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
算法binarySearch7数组段左右游标left和right的调整不正确,导致当x=a[n-1]时陷入死循环。
习题3-2 设a[0:n-1] 是已排好序的数组。
请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。
当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
分析与解答:改写二分搜索算法如下:public static boolean binarySearch(int []a, int x, int left, int right, int []ind){int middle;while ( left <= right ) {middle = (left + right)/2;if (x == a[middle]) { ind[0]=ind[1]=middle; return true;}if (x > a[middle]) left = middle + 1;else right = middle -1;}ind[0] = right; ind[1]=left;return false;}返回的ind[1]是小于x的最大元素位置,ind[0]是大于x的最小元素的位置。
习题3-3 设a[0:n-1] 是有n个元素的数组,是非负整数。
试设计一个算法讲子数组与换位。