算法设计与分析 第3章1

合集下载

算法设计与分析王晓东

算法设计与分析王晓东

习题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)),并简述理由。

算法设计与分析王晓东

算法设计与分析王晓东

习题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)),并简述理由。

算法设计与分析-第3章-蛮力法

算法设计与分析-第3章-蛮力法

哨兵
0123456789 k 10 15 24 6 12 35 40 98 55
查找方向
i
清华大学出版社
算法设计与分析
算法3.2——改进的顺序查找
int SeqSearch2(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合 { r[0]=k; i=n; while (r[i]!=k)
清华大学出版社
算法设计与分析
第3章 蛮力法
3.1 蛮力法的设计思想 3.2 查找问题中的蛮力法 3.3 排序问题中的蛮力法 3.4 组合问题中的蛮力法 3.5 图问题中的蛮力法 3.6 几何问题中的蛮力法 3.7 实验项目——串匹配问题
清华大学出版社
算法设计与分析
3.1 蛮力法的设计思想
蛮力法的设计思想:直接基于问题的描述。 例:计算an
52 37 65 不可行 不可行 不可行 不可行 不可行
清华大学出版社
算法设计与分析
对于一个具有n个元素的集合,其子集 数量是2n,所以,不论生成子集的算法 效率有多高,蛮力法都会导致一个Ω(2n) 的算法。
清华大学出版社
算法设计与分析
3.4.4 任务分配问题
假设有n个任务需要分配给n个人执行, 每个任务只分配给一个人,每个人只分配一 个任务,且第j个任务分配给第i个人的成本 是C[i, j](1≤i , j≤n),任务分配问题要求 找出总成本最小的分配方案。
用蛮力法解决0/1背包问题,需要考虑给定n个 物品集合的所有子集,找出所有可能的子集(总重 量不超过背包容量的子集),计算每个子集的总价 值,然后在他们中找到价值最大的子集。
清华大学出版社
算法设计与分析
10

算法设计与分析课程教学大纲

算法设计与分析课程教学大纲

算法设计与分析课程教学大纲【适用专业】计算机科学与技术【课时】理论课时:32【学分】 2【课程性质、目标和要求】《算法设计与分析》是计算机科学与技术专业的专业课。

无论是计算科学还是计算实践,算法都在其中扮演着重要角色。

本课程的教学目的是讲授在计算机应用中常常遇到的实际问题的解法,讲授设计和分析各种算法的基本原理、方法和技术,培养学生对算法复杂性进行正确分析的能力。

课程基本要求是⑴掌握算法分析的基本概念和理论。

⑵掌握算法设计技术和分析算法以及算法复杂性。

【教学时间安排】本课程计 2 学分,理论课时32, 学时分配如下:【教学内容要点】第一章算法引论一、学习目的要求1.了解算法的计算复杂性分析方法2.理解算法分析的基本理论3.掌握算法分析的基本概念二、主要教学内容1. 算法的基本概念2. 表达算法的抽象机制3. 采用Java语言与自然语言相结合的方式描述算法的方法4. 算法的计算复杂性分析方法第二章递归与分治策略一、学习目的要求1.理解典型范例中递归与分治策略应用技巧2.掌握递归与分治策略3.掌握数学归纳法证明算法正确性方法二、主要教学内容1. 递归的概念2. 分治法的基本思想3. 二分搜索技术4. 大整数的乘法5. Strassen阵乘法6. 棋盘覆盖7. 合并排序8. 快速排序9. 线性时间选择10. 最接近点对问题11. 循环赛日程表第三章动态规划一、学习目的要求1.理解典型范例中动态规划算法的设计思想2.掌握动态规划算法的基本要求以及算法的设计要点二、主要教学内容1. 矩阵连乘问题2. 动态规划算法的基本要素3. 最长公共子序列4. 最大子段和5. 凸多边形最优三角剖分6. 多边形游戏7. 图像压缩8. 电路布线9. 流水作业调度10. 0—l背包问题11. 最优二叉搜索树12. 动态规划加速原理三、课堂讨论选题1. 最长公共子序列2. 0—l背包问题第四章贪心算法一、学习目的要求1.了解贪心算法的理论基础及基本要素2. 理解典型范例中贪心算法的设计思想3. 掌握贪心算法的设计要点二、主要教学内容1. 活动安排问题2. 贪心算法的基本要素3. 最优装载4. 哈夫曼编码5. 单源最短路径6. 最小生成树7. 多机调度问题8. 贪心算法的理论基础三、课堂讨论选题1. 最优装载2. 单源最短路径第五章回溯法一、学习目的要求1.理解回溯法的效率分析方法2.掌握回溯法的算法框架和应用技巧二、主要教学内容1. 回溯法的算法框架2. 装载问题3. 批处理作业调度4. 符号三角形问题5. n后问题6. 0—l背包问题7. 最大团问题8. 图的m着色问题9. 旅行售货员问题10. 圆排列问题11. 电路板排列问题12. 连续邮资问题13. 回溯法的效率分三、课堂讨论选题1. 0—l背包问题2. 图的m着色问题第六章分支限界法一、学习目的要求1.理解分支限界法的基本思想2.掌握典型范例中分支限界法的应用技巧二、主要教学内容1. 分支限界法的基本思想2. 单源最短路径问题3. 装载问题4. 布线问题5. 0-1背包问题6. 最大团问题7. 旅行售货员问题8. 电路板排列问题9. 批处理作业调度三、课堂讨论选题1. 0-1背包问题2. 批处理作业调度第七章概率算法一、学习目的要求1.理解概率算法的基本思想2.掌握典型范例中概率算法的应用技巧二、主要教学内容1. 随机数2. 数值概率算法3. 舍伍德算法4. 拉斯维加斯算法5. 蒙特卡罗算法第八章 NP完全性理论一、学习目的要求1.了解P类与NP类问题2.了解典型的NP完全问题二、主要教学内容1. 计算模型2. P类与NP类问题3. NP完全问题4. 一些典型的NP完全问题第九章近似算法一、学习目的要求1.掌握近似算法的基本思想2.掌握常用近似算法的应用二、主要教学内容1. 近似算法的性能2. 顶点覆盖问题的近似算法3. 旅行售货员问题近似算法4. 集合覆盖问题的近似算法5. 子集和问题的近似算法第十章算法优化策略一、学习目的要求1.掌握算法优化策略2.掌握算法优化的基本方法二、主要教学内容1. 算法优化策略的比较与选择2. 动态规划加速原理3. 问题的算法特征4. 优化数据结构5. 优化搜索策略【教学(实验)内容要点】算法设计与分析实验是算法设计与分析课的一个实践性教学环节。

《算法设计与分析》第3章 动态规划法

《算法设计与分析》第3章 动态规划法

最优解的递推关系 定义m[i:j],表示矩阵连乘A[i:j]所需的最少计算 量 则有: i j 0 m[i ][ j ] i j minj{m[i ][ k ] m[k 1][ j ] pi 1 pk p j } i k
假设:N个矩阵的维数依序放在一维数组p中, 其中Ai的维数记为Pi-1×Pi
A=A1×A2×A3×…×An
A=(A1×A2×…×Ak) × (Ak+1×Ak+2×…×An)
B
C
1.2 穷举法
穷举法:列举出所有可能的计算次序,并计算出 每一种计算次序相应需要的数乘次数,从中找出 一种数乘次数最少的计算次序。
穷举法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序有P(n)种。 由于每种加括号方式都可以分解为两个子连乘的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
【程序】矩阵连乘的 穷举法实现 int MatrixChain::LookupChain(int i, int j) { if(i==j) return 0; int u=LookupChain(i+1,j)+p[i-1]*p[i]*p[j]; //k=i s[i][j]=i; //记录最优分解位置 for ( int k=i+1;k<j; k++ ) { //遍历k int t=LookupChain(i,k)+LookupChain(k+1,j) +p[i]*p[k+1]*p[j+1]; if (t<u) { u=t; s[i][j]=k; //记录最优分解位置 } } int MatrixChain::LookupChain() return u; { } return LookupChain(1,n);

算法设计技巧与分析答案

算法设计技巧与分析答案

算法设计技巧与分析参考答案第1章算法分析基本概念(a)6 (b)5 (c)6 (d)6算法执行了7+6+5+4+3+2+1=28次比较(a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。

(b) 算法MODSELECTIONSORT执行的元素赋值的最多次数是3(1)2n n ,元素已按非升序排列的时候达到最小值。

由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。

由上图可以得出比较次数为5+6+6+9=26次。

FTF,TTT,FTF,TFF,FTF(a) 执行该算法,元素比较的最少次数是n-1。

元素已按非降序排列时候达到最小值。

(b) 执行该算法,元素比较的最多次数是(1)2n n -。

元素已按非升序排列时候达到最大值。

(c) 执行该算法,元素赋值的最少次数是0。

元素已按非降序排列时候达到最小值。

(d) 执行该算法,元素赋值的最多次数是3(1)2n n -。

元素已按非升序排列时候达到最大值。

(e)n 用O 符号和Ω符号表示算法BUBBLESORT 的运行时间:2()t O n =,()t n =Ω(f)不可以用Θ符号来表示算法的运行时间:Θ是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列,因此不能用这一符号表示。

不能用p 关系来比较2n 和2100n 增长的阶。

∵221lim0100100n n n →∞=≠ 2n ∴不是2(100)o n 的,即不能用p 关系来比较2n 和2100n 增长的阶。

(a)当n 为2的幂时,第六步执行的最大次数是:12,2k k n j -==时,11[log ]log n ni i k n n n ====∑∑(b)由(a)可以得到:当每一次循环j 都为2的幂时,第六步执行的次数最大,则当33,22k kmn j ===(其中32k 取整)时,11[log(31)]log(1)n nkii i m n n ===-=-∑∑(c)用O 符号表示的算法的时间复杂性是(log )O n n 已证明n=2k 的情况,下面证明n=2k +1的情况:因为有⎥⎦⎥⎢⎣⎢+=⎥⎦⎥⎢⎣⎢21222k k所以n=2k +1时,第六步执行的最大次数仍是n log n 。

《算法设计与分析》(全)

《算法设计与分析》(全)
巢湖学院计算机科学与技术系
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论

大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

计算机算法设计与分析第4版(王晓东著)课后答
案下载
计算机算法设计与分析第4版内容简介
第1章算法概述
1.1 算法与程序
1.2 算法复杂性分析
1.3 NP完全性理论
算法分析题1
算法实现题1
第2章递归与分治策略
2.1 递归的概念
2.2 分治法的基本思想
2.3 二分搜索技术
2.4 大整数的乘法
2.5 Strassen矩阵乘法
2.6 棋盘覆盖
2.7 合并排序
2.8 快速排序
2.9 线性时间选择
2.10 最接近点对问题
第3章动态规划
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
附录A C++概要
参考文献
计算机算法设计与分析第4版目录
本书是普通高等教育“十一五”__规划教材和国家精品课程教材。

全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。

主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、__化算法、线性规划与网络流等。

书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。

为突出教材的`可读性和可用性,章首增加了学习要点提示,章末配有难易适度的算法分析题和算法实现题;配套出版了《计算机算法设计与分析习题解答(第2版)》;并免费提供电子课件和教学服务。

算法设计与分析知识点

算法设计与分析知识点

第一章算法概述1、算法的五个性质:有穷性、确定性、能行性、输入、输出。

2、算法的复杂性取决于:(1)求解问题的规模(N) , (2)具体的输入数据(I),( 3)算法本身的设计(A),C=F(N,I,A。

3、算法的时间复杂度的上界,下界,同阶,低阶的表示。

4、常用算法的设计技术:分治法、动态规划法、贪心法、回溯法和分支界限法。

5、常用的几种数据结构:线性表、树、图。

第二章递归与分治1、递归算法的思想:将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。

递归的时间复杂性可归结为递归方程:1 11= 1T(n) <aT(n—b) + D(n) n> 1其中,a是子问题的个数,b是递减的步长,~表示递减方式,D(n)是合成子问题的开销。

递归元的递减方式~有两种:1、减法,即n -b,的形式。

2、除法,即n / b,的形式。

2、D(n)为常数c:这时,T(n) = 0(n P)。

D(n)为线形函数cn:r O(n) 当a. < b(NT(n) = < Ofnlog^n) "n = blljI O(I1P)二"A bl吋其中.p = log b a oD(n)为幕函数n x:r O(n x) 当a< D(b)II JT{ii) = O(ni1og b n) 'ia = D(b)ll].O(nr)D(b)lHJI:中,p= log b ao考虑下列递归方程:T(1) = 1⑴ T( n) = 4T(n/2) +n⑵ T(n) = 4T(n/2)+n2⑶ T(n) = 4T(n/2)+n3解:方程中均为a = 4,b = 2,其齐次解为n2。

对⑴,T a > b (D(n) = n) /• T(n) = 0(n);对⑵,•/ a = b2 (D(n) = n2) T(n) = O(n2iog n);对⑶,•/ a < b3(D(n) = n3) - T(n) = 0(n3);证明一个算法的正确性需要证明两点:1、算法的部分正确性。

算法设计与分析 第2版 吕国英 第三章课后习题答案

算法设计与分析 第2版 吕国英 第三章课后习题答案

3.1//计算2+22+222+...+222 (2)void main(){int i,n,sum=0;print("请输入最后一个因子的位数\n");scanf("%d",&n);for(i=1;i<=n;i++)sum=sum+((int)pow(10,i)-1)/9*2;print("2+22+222+...+222……2=%d\n",sum); }3.2显示{5,7,4,8,9,1}的方阵方式main(){int i,j,t,ori[6]={5,7,4,8,9,1};for(i=0;i<6;i++){for(j=0;j<6;j++){t=(j-i)<0?j-i+6:j-i;printf("%d ",ori[t]);}printf("\n");}}3.3main(){int n;int **up(int **array);scanf("%d",&n);int arr[1][1]={{n*n}};for(j=1;j<n;j++)arr=up(**arr,j);}int **up(int **array,n){int upN=n+1;int[upN][upN] tem;tem[1][1]=array[1][1]-pow(n+1,2);for(i=1;i<=n;i++)tem[1][i]=tem[1][i-1]+1;for(i=1;i<=n;i++)tem[n][i]=tem[n][i-1]+1;for(i=1;i<=n;i++)tem[n][n-i]=tem[n][n+1-i]+1;for(i=1;i<n;i++)tem[1][n-i]=tem[1][n-i+1]+1return **tem;}3.4main(){int i,j,t=0,next=1,n;printf("请输入n\n");scanf("%d",&n);printf("显示效果如下\n");for(i=1;i<=n;i++){for(j=1;j<=n-i+1;j++){if(j==1)t=next;elset=t+i+j-1;if(j==2)next=t-1;printf("%d ",t);}printf("\n");}}//思想:每一行的第二个数为next,下一行的第一个数为next-13.5main(){int n,i,j,k;int arr[100][100]={{0}};//动态定义数组太难,所以在系统直接定义一个100*100的方阵,可以处理部分小问题for(i=0;i<100;i++)for(j=0;j<100;j++)arr[i][j]=0;printf("请输入n\n");scanf("%d",&n);/*if(n%2==0){for(k=0;k<n/2;k++)for(i=k;i<n-k;i++)for(j=k;j<n-k;j++)arr[i][j]=k+1;}else{for(k=0;k<(n+1)/2;k++)for(i=k;i<n-k;i++)for(j=k;j<n-k;j++)arr[i][j]=k+1;}*///可将第一个for循环中的判断条件统一改为k<(n+1)/2 for(k=0;k<(n+1)/2;k++)for(i=k;i<n-k;i++)for(j=k;j<n-k;j++)arr[i][j]=k+1;printf("显示效果如下:\n")for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%2d",arr[i][j]);printf("\n");}}3.7main(){int ack(int m,int n);int m,n,score;printf("请输入ackermann函数的m,n:\n");printf("m:");scanf("%d",&m);printf("n:");scanf("%d",&n);score=ack(m,n);printf("ack(%d,%d)=%d\n",m,n,score);}int ack(int m,int n){if(m==0)return n+1;elseif(n==0)return ack(m-1,1);elsereturn ack(m-1,ack(m,n-1));}3.8main(){char str[40];int i,l,t=1;printf("Please input a string!\n");scanf("%s",str);l=strlen(str);for(i=0;i<l/2;i++)if(str[i]!=str[l-i-1])t=0;if(t)printf("The string is Huiwen!\n");elseprintf("The string is not Huiwen!\n");}3.11main(){int i,n,sum=0;//sum为零的个数int zero(int pro);printf("此程序用于计算1*2*3*…*n所得的数末尾有多少个零。

算法分析与设计第二版习题答案-第三章到第五章

算法分析与设计第二版习题答案-第三章到第五章
{
int bool=1;
int min;
int j;
int i;
int k;
int flag;
for(i=0;i<count;i++)
{
if(buf[i]=='(')
push(buf[i],i);
if(buf[i]==')')
{
flag=pop();
算法设计与分析(第二版)习题答案 主编:吕国英
算法设计与分析(第二版)习题答案(第三章)
第三章:
1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");
;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return
0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list *link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode- >flag=flag;newnode-

《算法设计与分析基础》课件-3.蛮力法

《算法设计与分析基础》课件-3.蛮力法

if A[j] < A[min] min j
swap A[i] and A[min]
7
2017/12/31
例题:对序列 {89,45,68,90,29,34,17}用选择排序 算法进行排序
• 第1遍: {89,45,68,90,29,34,17} //求最小元素 {17,45,68,90,29,34,89} //交换
• 第5遍: {17,29,34,45,90,68,89} {17,29,34,45,68,90,89}
• 第6遍: {17,29,34,45,68,90,89} {17,29,34,45,68,89,90} //排序结束
8
CHD
(本动画中,参与排序的是R[1]到R[n],R[0]作为交换中转的空 间;变量j对应前面算法中的变量min)
2017/12/31
ALGORITHM BubbleSort(A[0,…,n – 1]) // 冒泡排序算法在数组上的应用 // 输入:数组A,数组中的元素属于某偏序集 // 输出:按升序排列的数组A for i 0 to n – 2 do
for j 0 to n – 2 – i do if A[j+1] < A[j] swap(A[j], A[j+1])
CHD
(4)对解决一些小规模的问题实例仍然有效
(5)可作为衡量其他算法的参照。
2
2017/12/31
Brute Force Examples:
1. Computing an (a > 0, n a nonnegative integer)
2. Computing n!
3. Multiplying two matrices

算法设计与分析习题答案1-6章

算法设计与分析习题答案1-6章

习题11.图论诞生于七桥问题。

出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。

七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图1.7是这条河以及河上的两个岛和七座桥的草图。

请将该问题的数据模型抽象出来,并判断此问题是否有解。

七桥问题属于一笔画问题。

输入:一个起点 输出:相同的点 1, 一次步行2, 经过七座桥,且每次只经历过一次 3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。

另一类是只有二个奇点的图形。

2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。

请用伪代码描述这个版本的欧几里德算法 1.r=m-n2.循环直到r=0 2.1 m=n 2.2 n=r 2.3 r=m-n 3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。

要求分别给出伪代码和C ++描述。

//采用分治法//对数组先进行快速排序 //在依次比较相邻的差 #include <iostream> using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。

算法设计与分析习题答案1-6章

算法设计与分析习题答案1-6章

习题11. 图论诞生于七桥问题。

出生于瑞士的伟大数学家欧拉(LeonhardEuler ,1707—1783)提出并解决了该问题。

七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图是这条河以及河上的两个岛和七座桥的草图。

请将该问题的数据模型抽象出来,并判断此问题是否有解。

七桥问题属于一笔画问题。

输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。

另一类是只有二个奇点的图形。

图 七桥问题南2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。

请用伪代码描述这个版本的欧几里德算法=m-n2.循环直到r=0m=nn=rr=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。

要求分别给出伪代码和C++描述。

编写程序,求n至少为多大时,n个“1”组成的整数能被2013整除。

#include<iostream>using namespace std;int main(){double value=0;for(int n=1;n<=10000 ;++n){value=value*10+1;if(value%2013==0){cout<<"n至少为:"<<n<<endl;break;}}计算π值的问题能精确求解吗编写程序,求解满足给定精度要求的π值#include <iostream>using namespace std;int main (){double a,b;double arctan(double x);圣经上说:神6天创造天地万有,第7日安歇。

为什么是6天呢任何一个自然数的因数中都有1和它本身,所有小于它本身的因数称为这个数的真因数,如果一个自然数的真因数之和等于它本身,这个自然数称为完美数。

算法设计与分析习题解答(第2版)

算法设计与分析习题解答(第2版)

第1章算法引论11.1 算法与程序11.2 表达算法的抽象机制11.3 描述算法31.4 算法复杂性分析13小结16习题17第2章递归与分治策略192.1 递归的概念192.2 分治法的基本思想262.3 二分搜索技术272.4 大整数的乘法282.5 Strassen矩阵乘法302.6 棋盘覆盖322.7 合并排序342.8 快速排序372.9 线性时间选择392.10 最接近点对问题432.11 循环赛日程表53小结54习题54第3章动态规划613.1 矩阵连乘问题62目录算法设计与分析(第2版)3.2 动态规划算法的基本要素67 3.3 最长公共子序列713.4 凸多边形最优三角剖分753.5 多边形游戏793.6 图像压缩823.7 电路布线853.8 流水作业调度883.9 0-1背包问题923.10 最优二叉搜索树98小结101习题102第4章贪心算法1074.1 活动安排问题1074.2 贪心算法的基本要素1104.2.1 贪心选择性质1114.2.2 最优子结构性质1114.2.3 贪心算法与动态规划算法的差异1114.3 最优装载1144.4 哈夫曼编码1164.4.1 前缀码1174.4.2 构造哈夫曼编码1174.4.3 哈夫曼算法的正确性1194.5 单源最短路径1214.5.1 算法基本思想1214.5.2 算法的正确性和计算复杂性123 4.6 最小生成树1254.6.1 最小生成树性质1254.6.2 Prim算法1264.6.3 Kruskal算法1284.7 多机调度问题1304.8 贪心算法的理论基础1334.8.1 拟阵1334.8.2 带权拟阵的贪心算法1344.8.3 任务时间表问题137小结141习题141第5章回溯法1465.1 回溯法的算法框架1465.1.1 问题的解空间1465.1.2 回溯法的基本思想1475.1.3 递归回溯1495.1.4 迭代回溯1505.1.5 子集树与排列树1515.2 装载问题1525.3 批处理作业调度1605.4 符号三角形问题1625.5 n后问题1655.6 0\|1背包问题1685.7 最大团问题1715.8 图的m着色问题1745.9 旅行售货员问题1775.10 圆排列问题1795.11 电路板排列问题1815.12 连续邮资问题1855.13 回溯法的效率分析187小结190习题191第6章分支限界法1956.1 分支限界法的基本思想1956.2 单源最短路径问题1986.3 装载问题2026.4 布线问题2116.5 0\|1背包问题2166.6 最大团问题2226.7 旅行售货员问题2256.8 电路板排列问题2296.9 批处理作业调度232小结237习题238第7章概率算法2407.1 随机数2417.2 数值概率算法2447.2.1 用随机投点法计算π值2447.2.2 计算定积分2457.2.3 解非线性方程组2477.3 舍伍德算法2507.3.1 线性时间选择算法2507.3.2 跳跃表2527.4 拉斯维加斯算法2597.4.1 n 后问题2607.4.2 整数因子分解2647.5 蒙特卡罗算法2667.5.1 蒙特卡罗算法的基本思想2667.5.2 主元素问题2687.5.3 素数测试270小结273习题273第8章 NP完全性理论2788.1 计算模型2798.1.1 随机存取机RAM2798.1.2 随机存取存储程序机RASP2878.1.3 RAM模型的变形与简化2918.1.4 图灵机2958.1.5 图灵机模型与RAM模型的关系297 8.1.6 问题变换与计算复杂性归约299 8.2 P类与NP类问题3018.2.1 非确定性图灵机3018.2.2 P类与NP类语言3028.2.3 多项式时间验证3048.3 NP完全问题3058.3.1 多项式时间变换3058.3.2 Cook定理3078.4 一些典型的NP完全问题3108.4.1 合取范式的可满足性问题3118.4.2 3元合取范式的可满足性问题312 8.4.3 团问题3138.4.4 顶点覆盖问题3148.4.5 子集和问题3158.4.6 哈密顿回路问题3178.4.7 旅行售货员问题322小结323习题323第9章近似算法3269.1 近似算法的性能3279.2 顶点覆盖问题的近似算法3289.3 旅行售货员问题近似算法3299.3.1 具有三角不等式性质的旅行售货员问题330 9.3.2 一般的旅行售货员问题3319.4 集合覆盖问题的近似算法3339.5 子集和问题的近似算法3369.5.1 子集和问题的指数时间算法3369.5.2 子集和问题的完全多项式时间近似格式337 小结340习题340第10章算法优化策略34510.1 算法设计策略的比较与选择34510.1.1 最大子段和问题的简单算法34510.1.2 最大子段和问题的分治算法34610.1.3 最大子段和问题的动态规划算法34810.1.4 最大子段和问题与动态规划算法的推广349 10.2 动态规划加速原理35210.2.1 货物储运问题35210.2.2 算法及其优化35310.3 问题的算法特征35710.3.1 贪心策略35710.3.2 对贪心策略的改进35710.3.3 算法三部曲35910.3.4 算法实现36010.3.5 算法复杂性36610.4 优化数据结构36610.4.1 带权区间最短路问题36610.4.2 算法设计思想36710.4.3 算法实现方案36910.4.4 并查集37310.4.5 可并优先队列37610.5 优化搜索策略380小结388习题388第11章在线算法设计39111.1 在线算法设计的基本概念39111.2 页调度问题39311.3 势函数分析39511.4 k 服务问题39711.4.1 竞争比的下界39711.4.2 平衡算法39911.4.3 对称移动算法39911.5 Steiner树问题40311.6 在线任务调度40511.7 负载平衡406小结407习题407词汇索引409参考文献415习题1-1 实参交换1习题1-2 方法头签名1习题1-3 数组排序判定1习题1-4 函数的渐近表达式2习题1-5 O(1) 和 O(2) 的区别2习题1-7 按渐近阶排列表达式2习题1-8 算法效率2习题1-9 硬件效率3习题1-10 函数渐近阶3习题1-11 n !的阶4习题1-12 平均情况下的计算时间复杂性4算法实现题1-1 统计数字问题4算法实现题1-2 字典序问题5算法实现题1-3 最多约数问题6算法实现题1-4 金币阵列问题8算法实现题1-5 最大间隙问题11第2章递归与分治策略14 习题2-1 Hanoi 塔问题的非递归算法14习题2-2 7个二分搜索算法15习题2-3 改写二分搜索算法18习题2-4 大整数乘法的 O(nm log(3/2))算法19习题2-5 5次 n /3位整数的乘法19习题2-6 矩阵乘法21习题2-7 多项式乘积21习题2-8 不动点问题的 O( log n) 时间算法22习题2-9 主元素问题的线性时间算法22习题2-10 无序集主元素问题的线性时间算法22习题2-11 O (1)空间子数组换位算法23习题2-12 O (1)空间合并算法25习题2-13 n 段合并排序算法32习题2-14 自然合并排序算法32习题2-15 最大值和最小值问题的最优算法35习题2-16 最大值和次大值问题的最优算法35习题2-17 整数集合排序35习题2-18 第 k 小元素问题的计算时间下界36习题2-19 非增序快速排序算法37习题2-20 随机化算法37习题2-21 随机化快速排序算法38习题2-22 随机排列算法38习题2-23 算法qSort中的尾递归38习题2-24 用栈模拟递归38习题2-25 算法select中的元素划分39习题2-26 O(n log n) 时间快速排序算法40习题2-27 最接近中位数的 k 个数40习题2-28 X和Y 的中位数40习题2-29 网络开关设计41习题2-32 带权中位数问题42习题2-34 构造Gray码的分治算法43习题2-35 网球循环赛日程表44目录算法设计与分析习题解答(第2版)算法实现题2-1 输油管道问题(习题2-30) 49算法实现题2-2 众数问题(习题2-31) 50算法实现题2-3 邮局选址问题(习题2-32) 51算法实现题2-4 马的Hamilton周游路线问题(习题2-33) 51算法实现题2-5 半数集问题60算法实现题2-6 半数单集问题62算法实现题2-7 士兵站队问题63算法实现题2-8 有重复元素的排列问题63算法实现题2-9 排列的字典序问题65算法实现题2-10 集合划分问题(一)67算法实现题2-11 集合划分问题(二)68算法实现题2-12 双色Hanoi塔问题69算法实现题2-13 标准二维表问题71算法实现题2-14 整数因子分解问题72算法实现题2-15 有向直线2中值问题72第3章动态规划76习题3-1 最长单调递增子序列76习题3-2 最长单调递增子序列的 O(n log n) 算法77习题3-7 漂亮打印78习题3-11 整数线性规划问题79习题3-12 二维背包问题80习题3-14 Ackermann函数81习题3-17 最短行驶路线83习题3-19 最优旅行路线83算法实现题3-1 独立任务最优调度问题(习题3-3) 83算法实现题3-2 最少硬币问题(习题3-4) 85算法实现题3-3 序关系计数问题(习题3-5) 86算法实现题3-4 多重幂计数问题(习题3-6) 87算法实现题3-5 编辑距离问题(习题3-8) 87算法实现题3-6 石子合并问题(习题3-9) 89算法实现题3-7 数字三角形问题(习题3-10) 91算法实现题3-8 乘法表问题(习题3-13) 92算法实现题3-9 租用游艇问题(习题3-15) 93算法实现题3-10 汽车加油行驶问题(习题3-16) 95算法实现题3-11 圈乘运算问题(习题3-18) 96算法实现题3-12 最少费用购物(习题3-20) 102算法实现题3-13 最大长方体问题(习题3-21) 104算法实现题3-14 正则表达式匹配问题(习题3-22) 105算法实现题3-15 双调旅行售货员问题(习题3-23) 110算法实现题3-16 最大 k 乘积问题(习题5-24) 111算法实现题3-17 最小 m 段和问题113算法实现题3-18 红黑树的红色内结点问题115第4章贪心算法123 习题4-2 活动安排问题的贪心选择123习题4-3 背包问题的贪心选择性质123习题4-4 特殊的0-1背包问题124习题4-10 程序最优存储问题124习题4-13 最优装载问题的贪心算法125习题4-18 Fibonacci序列的Huffman编码125习题4-19 最优前缀码的编码序列125习题4-21 任务集独立性问题126习题4-22 矩阵拟阵126习题4-23 最小权最大独立子集拟阵126习题4-27 整数边权Prim算法126习题4-28 最大权最小生成树127习题4-29 最短路径的负边权127习题4-30 整数边权Dijkstra算法127算法实现题4-1 会场安排问题(习题4-1) 128算法实现题4-2 最优合并问题(习题4-5) 129算法实现题4-3 磁带最优存储问题(习题4-6) 130算法实现题4-4 磁盘文件最优存储问题(习题4-7) 131算法实现题4-5 程序存储问题(习题4-8) 132算法实现题4-6 最优服务次序问题(习题4-11) 133算法实现题4-7 多处最优服务次序问题(习题4-12) 134算法实现题4-8 d 森林问题(习题4-14) 135算法实现题4-9 汽车加油问题(习题4-16) 137算法实现题4-10 区间覆盖问题(习题4-17) 138算法实现题4-11 硬币找钱问题(习题4-24) 138算法实现题4-12 删数问题(习题4-25) 139算法实现题4-13 数列极差问题(习题4-26) 140算法实现题4-14 嵌套箱问题(习题4-31) 140算法实现题4-15 套汇问题(习题4-32) 142算法实现题4-16 信号增强装置问题(习题5-17) 143算法实现题4-17 磁带最大利用率问题(习题4-9) 144算法实现题4-18 非单位时间任务安排问题(习题4-15) 145算法实现题4-19 多元Huffman编码问题(习题4-20) 147算法实现题4-20 多元Huffman编码变形149算法实现题4-21 区间相交问题151算法实现题4-22 任务时间表问题151第5章回溯法153习题5\|1 装载问题改进回溯法(一)153习题5\|2 装载问题改进回溯法(二)154习题5\|4 0-1背包问题的最优解155习题5\|5 最大团问题的迭代回溯法156习题5\|7 旅行售货员问题的费用上界157习题5\|8 旅行售货员问题的上界函数158算法实现题5-1 子集和问题(习题5-3) 159算法实现题5-2 最小长度电路板排列问题(习题5-9) 160算法实现题5-3 最小重量机器设计问题(习题5-10) 163算法实现题5-4 运动员最佳匹配问题(习题5-11) 164算法实现题5-5 无分隔符字典问题(习题5-12) 165算法实现题5-6 无和集问题(习题5-13) 167算法实现题5-7 n 色方柱问题(习题5-14) 168算法实现题5-8 整数变换问题(习题5-15) 173算法实现题5-9 拉丁矩阵问题(习题5-16) 175算法实现题5-10 排列宝石问题(习题5-16) 176算法实现题5-11 重复拉丁矩阵问题(习题5-16) 179算法实现题5-12 罗密欧与朱丽叶的迷宫问题181算法实现题5-13 工作分配问题(习题5-18) 183算法实现题5-14 独立钻石跳棋问题(习题5-19) 184算法实现题5-15 智力拼图问题(习题5-20) 191算法实现题5-16 布线问题(习题5-21) 198算法实现题5-17 最佳调度问题(习题5-22) 200算法实现题5-18 无优先级运算问题(习题5-23) 201算法实现题5-19 世界名画陈列馆问题(习题5-25) 203算法实现题5-20 世界名画陈列馆问题(不重复监视)(习题5-26) 207 算法实现题5-21 部落卫队问题(习题5-6) 209算法实现题5-22 虫蚀算式问题211算法实现题5-23 完备环序列问题214算法实现题5-24 离散01串问题217算法实现题5-25 喷漆机器人问题218算法实现题5-26 n 2-1谜问题221第6章分支限界法229习题6-1 0-1背包问题的栈式分支限界法229习题6-2 用最大堆存储活结点的优先队列式分支限界法231习题6-3 团顶点数的上界234习题6-4 团顶点数改进的上界235习题6-5 修改解旅行售货员问题的分支限界法235习题6-6 解旅行售货员问题的分支限界法中保存已产生的排列树237 习题6-7 电路板排列问题的队列式分支限界法239算法实现题6-1 最小长度电路板排列问题一(习题6-8) 241算法实现题6-2 最小长度电路板排列问题二(习题6-9) 244算法实现题6-3 最小权顶点覆盖问题(习题6-10) 247算法实现题6-4 无向图的最大割问题(习题6-11) 250算法实现题6-5 最小重量机器设计问题(习题6-12) 253算法实现题6-6 运动员最佳匹配问题(习题6-13) 256算法实现题6-7 n 后问题(习题6-15) 259算法实现题6-8 圆排列问题(习题6-16) 260算法实现题6-9 布线问题(习题6-17) 263算法实现题6-10 最佳调度问题(习题6-18) 265算法实现题6-11 无优先级运算问题(习题6-19) 268算法实现题6-12 世界名画陈列馆问题(习题6-21) 271算法实现题6-13 骑士征途问题274算法实现题6-14 推箱子问题275算法实现题6-15 图形变换问题281算法实现题6-16 行列变换问题284算法实现题6-17 重排 n 2宫问题285算法实现题6-18 最长距离问题290第7章概率算法296习题7-1 模拟正态分布随机变量296习题7-2 随机抽样算法297习题7-3 随机产生 m 个整数297习题7-4 集合大小的概率算法298习题7-5 生日问题299习题7-6 易验证问题的拉斯维加斯算法300习题7-7 用数组模拟有序链表300习题7-8 O(n 3/2)舍伍德型排序算法300习题7-9 n 后问题解的存在性301习题7-11 整数因子分解算法302习题7-12 非蒙特卡罗算法的例子302习题7-13 重复3次的蒙特卡罗算法303习题7-14 集合随机元素算法304习题7-15 由蒙特卡罗算法构造拉斯维加斯算法305习题7-16 产生素数算法306习题7-18 矩阵方程问题306算法实现题7-1 模平方根问题(习题7-10) 307算法实现题7-2 集合相等问题(习题7-17) 309算法实现题7-3 逆矩阵问题(习题7-19) 309算法实现题7-4 多项式乘积问题(习题7-20) 310算法实现题7-5 皇后控制问题311算法实现题7-6 3-SAT问题314算法实现题7-7 战车问题315算法实现题7-8 圆排列问题317算法实现题7-9 骑士控制问题319算法实现题7-10 骑士对攻问题320第8章NP完全性理论322 习题8-1 RAM和RASP程序322习题8-2 RAM和RASP程序的复杂性322习题8-3 计算 n n 的RAM程序322习题8-4 没有MULT和DIV指令的RAM程序324习题8-5 MULT和DIV指令的计算能力324习题8-6 RAM和RASP的空间复杂性325习题8-7 行列式的直线式程序325习题8-8 求和的3带图灵机325习题8-9 模拟RAM指令325习题8-10 计算2 2 n 的RAM程序325习题8-11 计算 g(m,n)的程序 326习题8-12 图灵机模拟RAM的时间上界326习题8-13 图的同构问题326习题8-14 哈密顿回路327习题8-15 P类语言的封闭性327习题8-16 NP类语言的封闭性328习题8-17 语言的2 O (n k) 时间判定算法328习题8-18 P CO -NP329习题8-19 NP≠CO -NP329习题8-20 重言布尔表达式329习题8-21 关系∝ p的传递性329习题8-22 L ∝ p 330习题8-23 语言的完全性330习题8-24 的CO-NP完全性330习题8-25 判定重言式的CO-NP完全性331习题8-26 析取范式的可满足性331习题8-27 2-SAT问题的线性时间算法331习题8-28 整数规划问题332习题8-29 划分问题333习题8-30 最长简单回路问题334第9章近似算法336习题9-1 平面图着色问题的绝对近似算法336习题9-2 最优程序存储问题336习题9-4 树的最优顶点覆盖337习题9-5 顶点覆盖算法的性能比339习题9-6 团的常数性能比近似算法339习题9-9 售货员问题的常数性能比近似算法340习题9-10 瓶颈旅行售货员问题340习题9-11 最优旅行售货员回路不自相交342习题9-14 集合覆盖问题的实例342习题9-16 多机调度问题的近似算法343习题9-17 LPT算法的最坏情况实例345习题9-18 多机调度问题的多项式时间近似算法345算法实现题9-1 旅行售货员问题的近似算法(习题9-9) 346 算法实现题9-2 可满足问题的近似算法(习题9-20) 348算法实现题9-3 最大可满足问题的近似算法(习题9-21) 349 算法实现题9-4 子集和问题的近似算法(习题9-15) 351算法实现题9-5 子集和问题的完全多项式时间近似算法352算法实现题9-6 实现算法greedySetCover(习题9-13) 352算法实现题9-7 装箱问题的近似算法First Fit(习题9-19) 356算法实现题9-8 装箱问题的近似算法Best Fit(习题9-19) 358算法实现题9-9 装箱问题的近似算法First Fit Decreasing(习题9-19) 360算法实现题9-10 装箱问题的近似算法Best Fit Decreasing(习题9-19) 361算法实现题9-11 装箱问题的近似算法Next Fit361第10章算法优化策略365 习题10-1 算法obst的正确性365习题10-2 矩阵连乘问题的 O(n 2) 时间算法365习题10-6 货物储运问题的费用371习题10-7 Garsia算法371算法实现题10-1 货物储运问题(习题10-3) 374算法实现题10-2 石子合并问题(习题10-4) 374算法实现题10-3 最大运输费用货物储运问题(习题10-5) 375算法实现题10-4 五边形问题377算法实现题10-5 区间图最短路问题(习题10-8) 381算法实现题10-6 圆弧区间最短路问题(习题10-9) 381算法实现题10-7 双机调度问题(习题10-10) 382算法实现题10-8 离线最小值问题(习题10-11) 390算法实现题10-9 最近公共祖先问题(习题10-12) 393算法实现题10-10 达尔文芯片问题395算法实现题10-11 多柱Hanoi塔问题397算法实现题10-12 线性时间Huffman算法400算法实现题10-13 单机调度问题402算法实现题10-14 最大费用单机调度问题405算法实现题10-15 飞机加油问题408第11章在线算法设计410习题11-1 在线算法LFU的竞争性410习题11-4 多读写头磁盘问题的在线算法410习题11-6 带权页调度问题410算法实现题11-1 最优页调度问题(习题11-2) 411算法实现题11-2 在线LRU页调度(习题11-3) 414算法实现题11-3 k 服务问题(习题11-5) 416参考文献422。

算法设计与分析_第3章_动态规划1

算法设计与分析_第3章_动态规划1
8
引言
分治技术的问题
子问题是相互独立的
Why?
问题:
如果子问题不是相互独立的,分治方法将重复 计算公共子问题,效率很低,甚至在多项式量 级的子问题数目时也可能耗费指数时间
解决方案:动态规划
用表来保存所有已解决子问题的答案 不同算法的填表格式是相同的
9
引言
最优化问题
Why?
可能有多个可行解,每个解对应一个 值,需要找出最优值的解。
MATRIX-MULTIPLY(A, B) 1 if columns[A] ≠ rows[B] 2 then return “error: incompatible dimensions” 3 else for i ← 1 to rows[A] 4 for j ← 1 to columns[B] 5 C[i, j] ← 0 6 for k ← 1 to columns[A] 7 C[i, j]←C[i, j]+A[i, k]·B[k, j] 8 return C
(A1 (A2 (A3 A4))) , (A1 ((A2 A3) A4)) , ((A1 A2) (A3 A4)) , ((A1 (A2 A3)) A4) , (((A1 A2) A3) A4).
15
矩阵连乘问题
采用不同的加括号方式,可导致不同的、 甚至及其富有戏剧性差别的乘法开销
设有四个矩阵A,B,C,D,它们的维数分别 是: A=50×10 B=10×40 C=40×30 D=30×5 总共有五种完全加括号的方式: (A((BC)D)) ——16000 (A(B(CD))) ——10500 ((AB)(CD)) ——36000 (((AB)C)D) ——87500 ((A(BC))D) ——34500
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

23
• 3.由具体到抽象设计循环结构 • 对于不太熟悉的问题,其数学模型或“机械化操作步 对于不太熟悉的问题,其数学模型或“ 的不易抽象, 骤”的不易抽象,下面看一个由具体到抽象设计循环 细节的例题。 细节的例题。 • 【例4】编写算法:打印具有下面规律的图形。 4】编写算法:打印具有下面规律的图形。 1 5 2 8 6 3 10 9 7 4
19
• 1)顶层算法 ) for(i=0;i<n;i=i+1) {找第 行上最小的元素 及所在列 找第i行上最小的元素 及所在列minj; 找第 行上最小的元素t及所在列 检验t是否第 列的最大值,是则输出这个鞍点;} 检验 是否第minj 列的最大值,是则输出这个鞍点 是否第 • 2)找第i行上最小的元素 及所在列 )找第 行上最小的元素 及所在列minj 行上最小的元素t及所在列 t=a[i][0]; minj=1; for(j=1;j<n;j=j+1) if(a[i][j]<t) {t=a[i][j]; minj=j;}
14
• 1)顶层算法 )
for(i=2;i<n;i=i+1) {判断 是否是“完数”; 判断i是否是 完数” 判断 是否是“ 是“完数”则按格式输出;} 完数”则按格式输出
• 2)判断 i是否是“完数”的算法 ) 是否是“ 是否是 完数”
for(j=2;j<i;j=j+1) 的因子, 找i的因子,并累加; 的因子 并累加; 如果加值等于i, 是 完数” 如果加值等于 ,i是“完数”
13
问题分析: 问题分析: 1)这里不是要质因数,所以找到因数后也无需将其从 )这里不是要质因数, 数据中“除掉” 数据中“除掉”。 2)每个因数只记一次,如8的因数为 ,2,4而不是 )每个因数只记一次, 的因数为1, , 而不是 而不是1 的因数为 。(注 ,2,2,2,4。(注:本题限定因数不包括这个数 , , , 。( 本身) 本身)
10
Hale Waihona Puke • 数学模型 :Sn=Sn-1+(-1)n+1An; 数学模型2: ( ) ; An=An-1 *1/((2*n-2)*(2*n-1))
main( ) {int i,n, sign; float s,t=1; input(n); s=1; ; sign=1; for(i=2;i<=n;i=i+1) 或 for(i=1;i<=n-1;i=i+1) {sign=-sign; { sign=-sign; t= t*(2*i-2)*(2*i-1)}; t= t*2*i*(2*i+1)}; s=s+ sign/t; } s=s+ sign/t; } print(“Sum=”,s); }
7
• 算法如下: 算法如下:
main( ) {int i,n,j,sign=1; float s,t=1; input(n); s=1; ; for(i=2;i<=n;i=i+1) {t=1; //求阶乘 求阶乘// 求阶乘 for(j=1;j<=2*i-1;j=j+1) t=t*j; //求阶乘 求阶乘// 求阶乘 sign =1; //求(-1)n+1// 求 ) for(j=1;j<=i+1;j=j+1) sign = sign *(-1); s=s+ sign/t; } print(“Snm=”,s); }
17
k=0;
• 算法如下:
main( ) {int i,k,j,s,a[20]; for(i=1;i<=1000;i++) { s=1; /*两个赋初值语句 两个赋初值语句s=1,k=0 两个赋初值语句 k=0; 一定要位于外部循环的内部*/ 一定要位于外部循环的内部 for(j=2;j<i;j++) if (i mod j)==0) {s=s+j; a[k]=j; k++;} if(i==s) {print(s, “it’s factors are :”,1); for(j=0;i<k;j++) print(“,”,a[k]); } } }
22
for(i=0;i<n;i++) /*行标号 行标号*/ 行标号 {t=a[i][0]; minj=0; 请改写算法实现多个 for(j=1;j<n;j++) /*列标号 列标号*/ 列标号 鞍点的求解。 鞍点的求解。 if(a[i][j]<t) {t=a[i][j];minj=j;} for(k=0;k<n;k++) if(a[k][minj]>t) break; if(k<n) continue; print(“the result is a[“,i ,“][”,minj,“]=”,a[i][minj]); , kz=1; break; } if(kz==0) print(“no solution!”); }
11
• 算法分析: 算法分析: 按照数学模型2 按照数学模型2,只需一重循环就能解决问题 算法的时间复杂性为O(n) O(n)。 算法的时间复杂性为O(n)。
12
• 2.“自顶向下”的设计方法 自顶向下” 自顶向下的方法是从全局走向局部、 自顶向下的方法是从全局走向局部、从概略走向详尽 的设计方法。自上而下是系统分解和细化的过程。 的设计方法。自上而下是系统分解和细化的过程。 【例2】编算法找出1000以内所有完数 编算法找出1000以内所有完数 1000 例如,28的因子为 的因子为1 14, 例如,28的因子为1、2、4、7,14,而 28=1+2+4+7+14。因此28 28是 完数” 28=1+2+4+7+14。因此28是“完数”。编算法找出 1000之内的所有完数 并按下面格式输出其因子: 之内的所有完数, 1000之内的所有完数,并按下面格式输出其因子: 1, 14。 28 it’s factors are 1,2,4,7,14。
8
• 算法分析: 算法分析:
– 以上算法是二重循环来完成 ,算法的效率太低 是O(n2) 算法的效率太低,是 – 思考是否可以改进算法模型 ??? 思考是否可以改进算法模型1 – 数学模型 :Sn=Sn-1+(-1)n+1/(2n-1)! 数学模型1: ( )
9
– 当前一次循环已求出 !,当这次要想求 !时,没必要再从 当前一次循环已求出7!,当这次要想求9! !,当这次要想求 1去累乘到 ,只需要充分利用前一次的结果,用7!*8*9即 去累乘到9, 去累乘到 只需要充分利用前一次的结果, ! 即 可得到9!; 可得到 !; – 模型为An=An-1*1/((2*n-2)*(2*n-1)。 模型为 。 – 另外运算 另外运算sign = sign *(-1);总共也要进行 总共也要进行n*(n-1)/2次乘法,这 次乘法, 总共也要进行 次乘法 也是没有必要的。下面我们就进行改进。 也是没有必要的。下面我们就进行改进。
15
• 3)进一步细化——判断 是否“完数”算法 )进一步细化 判断i是否 判断 是否“完数”
s=1 for(j=2;j<i;j=j+1) if (i mod j=0) (j是i的因素 s=s+j; 的因素) 是 的因素 if (s==i) i是“完数”; s==i) i是 完数”
16
• 4)考虑输出格式——判断 是否“完数”算法 )考虑输出格式 判断i是否 判断 是否“完数” 考虑到要按格式输出结果,应该开辟数组存储数据 的 考虑到要按格式输出结果,应该开辟数组存储数据i的 所有因子,并记录其因子的个数,算法细化如下: 所有因子,并记录其因子的个数,算法细化如下: 定义数组a, 定义数组 ,s=1; for(j=2;j<i;j=j+1) if (i mod j=0) (j是i的因素 的因素) 是 的因素 {s=s+j; a[k]=j;k=k+1;} if (s==i) ) {按格式输出结果 按格式输出结果} 按格式输出结果
18
• 【例3】求一个矩阵的鞍点. (即在行上最小而在列上最大的点)。 算法设计: 1)在第一行找最小值,并记录其列号。 )在第一行找最小值,并记录其列号。 2)然后验证其是否为所在列的最大值,如果是,则 )然后验证其是否为所在列的最大值,如果是, 找到问题的解;否则, 找到问题的解;否则,则继续在下一行找最小值 ……
20
• 3)检验t是否第 )检验 是否第 是否第minj 列的最大值,是则输出这个鞍点 列的最大值,是则输出这个鞍点; for(k=0;k<n;k=k+1) if(a[k][minj]>t) break; if(k<n) continue; print(“the result is a[“,i ,“][” ,minj, “]=”,t); “]=”, • 考虑到会有无解的情况,设置标志量kz,kz=0代表无 考虑到会有无解的情况,设置标志量 , 代表无 找到一个解后, 被赋值为 被赋值为1, 解,找到一个解后,kz被赋值为 ,就不再继续找鞍 点的工作。请读者考虑是否有多解的可能性吗? 点的工作。请读者考虑是否有多解的可能性吗?若有 ,请改写算法,找出矩阵中所有的鞍点。 请改写算法,找出矩阵中所有的鞍点。
3
3.1循环与递归 3.1.1 循环设计要点 3.1.2 递归设计要点 3.1.3 递归与循环的比较
4
3.1.1 循环设计要点
• 1.设计中要注意算法的效率 . • 2.“自顶向下”的设计方法 . 自顶向下” • 3.由具体到抽象设计循环结构 .
5
1.循环设计中要注意算法的效率 . • 循环体的特点是:“以不变应万变”。 循环体的特点是: 以不变应万变” • 所谓“不变”是指循环体内运算的表现形式是不变 所谓“不变” 而每次具体的执行内容却是不尽相同的。 的,而每次具体的执行内容却是不尽相同的。在循 环体内用不变的运算表现形式去描述各种相似的重 复运算。 复运算。
相关文档
最新文档