算法设计与分析基础第七章作业
算法分析与设计习题集整理
算法分析与设计习题集整理第一章算法引论一、填空题:1、算法运行所需要的计算机资源的量,称为算法复杂性,主要包括时间复杂度和空间复杂度。
2、多项式10()m m A n a n a n a =+++的上界为O(n m )。
3、算法的基本特征:输入、输出、确定性、有限性 、可行性 。
4、如何从两个方面评价一个算法的优劣:时间复杂度、空间复杂度。
5、计算下面算法的时间复杂度记为: O(n 3) 。
for(i=1;i<=n;i++)for(j=1;j<=n;j++){c[i][j]=0;for(k=1;k<=n;k++)c[i][j]= c[i][j]+a[i][k]*b[k][j];}6、描述算法常用的方法:自然语言、伪代码、程序设计语言、流程图、盒图、PAD 图。
7、算法设计的基本要求:正确性 和 可读性。
8、计算下面算法的时间复杂度记为: O(n 2) 。
for (i =1;i<n; i++){ y=y+1;for (j =0;j <=2n ;j++ )x ++;}9、计算机求解问题的步骤:问题分析、数学模型建立、算法设计与选择、算法表示、算法分析、算法实现、程序调试、结果整理文档编制。
10、算法是指解决问题的 方法或过程 。
二、简答题:1、按照时间复杂度从低到高排列:O( 4n 2)、O( logn)、O( 3n )、O( 20n)、O( 2)、O( n 2/3),O( n!)应该排在哪一位?答:O( 2),O( logn),O( n 2/3),O( 20n),O( 4n 2),O( 3n ),O( n!)2、什么是算法?算法的特征有哪些?答:1)算法:指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。
通俗讲,算法:就是解决问题的方法或过程。
2)特征:1)算法有零个或多个输入;2)算法有一个或多个输出; 3)确定性 ; 4)有穷性3、给出算法的定义?何谓算法的复杂性?计算下例在最坏情况下的时间复杂性?for(j=1;j<=n;j++) (1)for(i=1;i<=n;i++) (2) {c[i][j]=0; (3)for(k=1;k<=n;k++) (4)c[i][j]= c[i][j]+a[i][k]*b[k][j]; } (5)答:1)定义:指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。
算法设计与分析习题答案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. 设某算法在输入规模为n 时的计算时间为T(n)=10*2n。
若在甲台计算机上实现并完成该算法的时间为t 秒,现有一台运行速度是甲的64倍的另一台计算机乙,问在乙计算机上用同一算法在t 秒内能解决的问题的规模是多大?2.按照渐近阶从低到高的顺序排列以下表达式:4n 2,logn ,3n,20n ,2,n 2/3。
又n!应该排在哪一位?第二章 课后作业1. 用展开法求解下列递推关系:T(n)=⎩⎨⎧>+=1n )()2/(20n )1(n O n T O,写出T(n)的大O 记号表示。
2. 下面是实现在a[0]<=a[1]<=…<=a[n-1]中搜索x 的二分搜索算法,请根据二分 搜索技术在下划线处填充语句。
算法描述如下: template<class Type>public static int BinarySearch(int []a, int x, int n) { //在a[0]<=a[1]<=…<=a[n-1]中搜索 x // 找到x 时返回其在数组中的位置,否则返回-1 int left = 0; int right = n - 1; while ( ) {int middle = ;if(x == a[middle]) return ; if(x > a[middle]) left = middle + 1; else right= ; }return -1; // 未找到x}第三章课后作业1、选择题。
(1)下列算法中通常以自底向上的方式求解最优解的是()。
A、备忘录法B、动态规划法C、贪心法D、回溯法(2)备忘录方法是那种算法的变形。
()A、分治法B、动态规划法C、贪心法D、回溯法(3)矩阵连乘问题的算法可由()设计实现。
A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法2.计算题。
《计算机算法-设计与分析导论》课后习题答案共39页word资料
4.1:在我们所了解的早期排序算法之中有一种叫做Maxsort 的算法。
它的工作流程如下:首先在未排序序列(初始时为整个序列)中选择其中最大的元素max ,然后将该元素同未排序序列中的最后一个元素交换。
这时,max 元素就包含在由每次的最大元素组成的已排序序列之中了,也就说这时的max 已经不在未排序序列之中了。
重复上述过程直到完成整个序列的排序。
(a) 写出Maxsort 算法。
其中待排序序列为E ,含有n 个元素,脚标为范围为0,,1n -K 。
void Maxsort(Element[] E) { int maxID = 0;for (int i=E.length; i>1; i--) { for (int j=0; j<i; j++) {if (E[j] > E[maxID]) maxID = k; E[i] <--> E[maxID];(b) 说明在最坏情况下和平均情况下上述算法的比较次数。
最坏情况同平均情况是相同的都是11(1)()2n i n n C n i -=-==∑。
4.2:在以下的几个练习中我们研究一种叫做“冒泡排序”的排序算法。
该算法通过连续几遍浏览序列实现。
排序策略是顺序比较相邻元素,如果这两个元素未排序则交换这两个元素的位置。
也就说,首先比较第一个元素和第二个元素,如果第一个元素大于第二个元素,这交换这两个元素的位置;然后比较第二个元素与第三个元素,按照需要交换两个元素的位置;以此类推。
(a)起泡排序的最坏情况为逆序输入,比较次数为11(1)()2n i n n C n i -=-==∑。
(b) 最好情况为已排序,需要(n-1)次比较。
4.3: (a)归纳法:当n=1时显然成立,当n=2时经过一次起泡后,也显然最大元素位于末尾;现假设当n=k-1是,命题也成立,则当n=k 时,对前k-1个元素经过一次起泡后,根据假设显然第k-1个元素是前k-1个元素中最大的,现在根据起泡定义它要同第k 个元素进行比较,当k 元素大于k-1元素时,它为k 个元素中最大的,命题成立;当k 元素小于k-1元素时,它要同k-1交换,这时处于队列末尾的显然时队列中最大的元素。
《算法设计与分析》(全)
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章 算法引论
算法设计与分析王晓东
习题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)),并简述理由。
《算法设计与分析》第07讲精品PPT课件
不同的活结点表形成不同的分枝限界法,分为: FIFO分枝限界法、LIFO分枝限界法和LC(least cost)分枝限界法。三种不同的活结点表,规定了 从活结点表中选取下一个E-结点的不同次序。
FIFO分枝限界法的活结点表是先进先出队列 LIFO分枝限界法的活结点表是堆栈; LC分枝限界法的活结点表是优先权队列,LC分 枝限界法将选取具有最高优先级的活结点出队列, 成为新的E-结点。
2
3 5 2 4
19 6
18
3
16 4 7 16
10 20 0 13 14 2 1 3 0 16 3 15 12 0 3 12
1 10
0
2
2 2
0
3
4
上海海洋大学信息学院2009-12-2
归约列
10 20 0 13 14 2 1 3 0 16 3 15 12 0 3 12
iJ,i 1..n iJ,im i m1,...,n
ĉ(X) c(X) u(X)
上海海洋大学信息学院2009-12-2
可变大小元组状态空间树
上海海洋大学信息学院2009-12-2
7. 3 货郎担问题的分支限界法
上海海洋大学信息学院2009-12-2
问题描述
旅行商问题(travelling salesperson)是一个看似 简单其实十分难解的著名难题之一,至今仍有许多 人在研究它。此问题描述为:一个旅行商准备到n 个村庄售货。他从A村出发经过其它n-1个村庄,又 回到出发地A村。现要求一条最短路径,使得每个 村庄都经过且仅经过一次。
收益之和,使得总收益最大的作业子集是问题的最
优解。如果希望以最小值为最优解,则可以适当改
数据结构与算法分析 第7章 答案 Larry Nyhoff 清华大学出版社
– 46 –
Chapter 7
//Definition of bottom(): StackElement bottom(Stack s) { if (!s.empty()) [ StackElement value; while (!s.empty()) { value = s.top(); s.pop(); } return value;
– 47 –
Chapter 7
9.
StackElement nthElement(int n); /*---------------------------------------------------------------------Retrieve the n-th element of this stack. Precondition: 1 <= n <= number of stack elements Postcondition: n-th element of the stack is returned, unless stack has fewer than n elements, in which case an error message is displayed. ----------------------------------------------------------------------* //Definition of nthElement() StackElement Stack::nthElement(int n) { if (n <= myTop + 1) return myArray[myTop + 1 - n]; //else cerr << "Stack has no " << n << "-th element" " -- returning a garbage value\n"; StackElement garbage; return garbage; }
算法设计与分析第7章作业.pdf
「算法设计与分析」第7章作业2015.10学号: 15S103172 姓名: 谢浩哲1.在下图中考虑哈密顿环问题. 将问题的解空间表示成树, 并分别利用深度优先搜索和广度优先搜索判定该图中是否存在哈密顿环.问题解空间的树状结构:算法概述:从起始点出发, 搜索从这个点出发所有可到达的点(深度优先或广度优先策略均可). 对于每到达一个点, 判断: 是否已经回到起始点, 是否经过重复的点. 若经过了重复了点, 则不再搜索. 若到达了起始点, 并且恰好经过了所有的点, 则找到了最优解.算法实现:深度优先搜索:35}广度优先搜索:!isVisited(startPoint, i,372.考虑8-魔方问题. 分别用深度优先算法, 广度优先算法, 爬山法, 最佳优先方法判定上图所示的初始格局能够通过一系列操作转换成目标格局, 将搜索过程的主要步骤书写清楚.问题的部分解空间树状结构:深度优先搜索:搜索顺序为1 -> 2 -> 4 -> 10 -> …广度优先搜索:搜索顺序为1 -> 2 -> 3-> 4 -> 5 -> 6 -> …爬山法:基于深度优先搜索, 选取当前分支上最优解;搜索顺序为1 -> 2 -> 4 -> 11 -> …最佳优先方法:基于深度优先搜索, 选取所有分支上最优解;搜索顺序为1 -> 2 -> 4 -> 11 -> …3.分别使用深度优先法和分支限界法求解子集和问题的如下实例.输入: 集合S=7, 4, 6, 13, 20, 8和整数K=18.输出: S’使得S’中元素之和等于K.深度优先搜索:问题的部分解空间如下如所示:算法实现:分枝限界法可以在深度优先搜索时进行必要的剪枝, 例如对于分支7-4. 此时的分支上的和为11, 因此该分支上的数最大不可能超过18 - 11 = 7. 因此可见, 在深度优先搜索中搜索的13和8这两个分支其实可以进行剪枝. 其他分支亦然.算法实现:只需将以上代码的17行替换为:if ( !isSelected[i] &&4.将任意一整数n划分为若干整数之和的划分, 并按照降序的序列输出出来, 例如5的划分为: 5, 4+1,3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1.问题解空间的树状图:算法实现(深度优先搜索):import java.util.ArrayList;public List<List<Integer>> getSplit(int n,1725 List<Integer> newSplit =new ArrayList<Integer>(currentSplit);5.在一个一维空间上有n个点1, 2, 3, 4, …, n, 有一个粒子它初始位置为1, 粒子从初始位置1开始做随机运动, 方向只有左右两个, 每次运动结束该粒子就会移动到相邻的位置上. 已知该粒子在i(1<i<n)点位置上向左运动的概率为p i, 该粒子在1点只能向右运动, 在n点只能向左运动, 那么请问该粒子在t次运动后它最有可能出现在哪个点上, 以及输出该粒子向右运行距离的期望值.对于n=5的问题解空间的树状图:算法实现(广度优先搜索):15public Queue<Point> getFinalPositions(25q.offer(new Point(cp.coordinate + 1,31 q.offer(new Point(cp.coordinate - 1,cp.probability * p[cp.coordinate]));。
算法设计与分析基础第七章作业
第七章习题7.11.分步计数算法是稳定的吗?解:分步计数算法是稳定的。
习题7.23.用Horspool算法在一个1000个0构成的二进制文本中查找下列模式时,分别需要进行多少次字符比较?a.00001;b.10000;c.01010;5解:a.比较次数:(1000/5)*1=200b.比较次数:[(1000-5+1]*5=4980c.比较次数:[(1000-3)/2]*2=996 (1000-3)/2取整数部分4.用Horspool算法在一个长度为n的文本中查找一个长度为m(n>=m)的模式。
请分别给出下面两种例子。
a.最差输入;b.最优输入。
解:a.模式的每次一移动的举例均为1,且没有匹配成功,或者到最后一次匹配才成功。
b.模式不需要移动,且比较了m次即成功。
7.用Boyer-Moore算法在一个1000个0构成的二进制文本中查找列模式时,分别需要进行多少次字符比较?a.00001;b.10000;c.01010;解:a.坏符号移动表:后缀移动表:d1=max{t1(0),1}=1,d2=5模式移动max(d1,d2)=5,所以每次移动5位,且每次只比较一次。
比较次数为:1000/5=200b.坏符号移动表:后缀移动表:d1=max{t1(0)-4,1}=1,d2=1模式移动max(d1,d2)=1,所以每次都移动一位,比较5次。
比较次数:[(1000-5+1]*5=4980c.坏符号移动表:后缀移动表:d1=max{t1(0)-1,1}=1,d2=2模式移动max(d1,d2)=2,所以每次都能移动2位,比较2次。
比较次数:[(1000-3)/2]*2=996习题7.32.对于输入30,20,56,75,31,19和散列函数h(K)=K mod11a.构造它们的闭散列表;b.求在本表中成功查找的最大键值比较次数;c.求在本表中成功查找的平均键值比较次数;解:a.b.最大的键值是19,k(19)=8,先将散列地址为8的中的键30与75比较,其次是散列地址为10的75与75比较,所以成功查找的比较次数是6。
算法设计与分析课后习题解答
c.该算法在位吗?
解:
a.该算法对列表”60,35,81,98,14,47”排序的过程如下所示:
b.该算法不稳定.比如对列表”2,2*”排序
c.该算法不在位.额外空间for S and Count[]
4.(古老的七桥问题)
第2章
习题2.1
7.对下列断言进行证明:(如果是错误的,请举例)
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。故gcd(m,n)=gcd(n,r)
7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?
Hint:
对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n,即
b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142和2·14142之间,所以欧几里德算法比此算法快1·14142/11≈1300与2·14142/11≈2600倍之间。
Else temp1←Min2(A[l..(l+r)/2])
Temp2←Min2(A[l..(l+r)/2]+1..r)
If temp1≤temp2 return temp1
Else return temp2
a.建立该算法所做的的操作次数的递推关系并求解
b.算法Min1和Min2哪个更快?有其他更好的算法吗?
1,2,5,10---分别代表4个人, f—手电筒
4.对于任意实系数a,b,c,某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)
《算法设计与分析》第07章
算法的时间复杂度 若G采用邻接表表示,总计算时间为:
3. 向后处理策略求解
设 BP(i,j)是一条从源点s到Vi中的结点j的最小成本路径, BCOST(i,j)是这条路径的成本。
1) 向后递推式
BCOST(k,t)=0
2) 递推过程
★ 第2段 c(1,j) COST(2,j) = ∞ <1,j>∈E
7.1.1 一般方法
最优性原理指出,一个最优策略具有这样的性 质,不论过去状态和决策如何,对前面的决策所 形成的状态而言,其余决策必定构成最优策略。 这便是最优决策序列的最优子结构特性。
利用动态规划求解问题的前提: 1) 证明问题满足最优性原理 如果对所求解问题证明满足最优性原理,则 说明用动态规划方法有可能解决该问题 2) 获得问题状态的递推关系式 获得各阶段间的递推关系式是解决问题的关 键。
根据D(5,12)的决策值向前递推求取最小成本路径: ● v4 = BD(5,12)=10 ● v3 = BD(4,BD(5,12)) = 7 ● v2 = BD(3,BD(4,BD(5,12))) = BD(3,7) = 2 故由s到t的最小成本路径是:1→2→7→10→12
7.1.4 资源分配问题
【程序7-1】多段图的向前递推算法 template<class T> void Graph<T>::FMultiGraph(int k,int *p) {//采用程序6-8的邻接表存储图G。 float *cost=new float[n]; int q,*d=new int[n]; cost[n-1]=0,d[n-1]=-1;
for (int j=n-2;j>=0;j--){ float min=INFTY; for (ENode<T> *r=a[j];r;r=r->nextArc) { int v=r->adjVex; if (r->w+cost[v]<min) { min=r->w+cost[v];q=v; } } cost[j]=min;d[j]=q; } p[0]=0;p[k-1]=n-1; for(j=1;j<=k-2;j++) p[j]=d[p[j-1]]; delete []cost;delete []d; }
算法分析与设计课件:习题选讲第七章前5题
is_root[l] = !is_root[l];
is_root[r] = !is_root[r];
p[m].Left = l; p[m].Right = r; p[m].ch = c;
}
for (int i = 1; i <= 1000; i++) if (is_root[i]) root = i;
第七章
1426 电话号码前缀检索 1310 二叉查找树,前序中序后序遍历 1210 二叉树 ,知道前序、后序求可能的方法数 1090 最小生成树 1156 二叉树的前序遍历
1
2021/8/17
1426 电话号码前缀检索
题目大意: 给出N个电话号码(N <= 10000),每个电
话号码的长度不大于10,当存在一个电话 号码是另外一个电话号码的前缀时,则会 发生冲突。如果不存在冲突输出YES,否 则输出NO
1210 二叉树
long long calc(string pre, string post) { long long ans = 1; int len=pre.size(); for(int i= 0; i < len - 1; i++) { int current = len - 1; while(pre[i] != post[current]) current--; if(current && pre[i+1] == post[current - 1]) ans *= 2; } return ans;
Postorder(p[root].right);
printf(" %d", p[root].val);
}
inline void Inorder(int root)
算法设计与分析习题解答(第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。
Eea_7_算法设计与分析
1、求解方式不同: 动态规划法:自底向上; 贪心法:自顶向下;
2、对子问题的依赖不同: 动态规划法:依赖于各子问题的解,所以应使各子问题最 优,才能保证整体最优; 贪心法:依赖于过去所作过的选择,但决不依赖于将来的 选择,也不依赖于子问题的解。
具有最优子结构性质的问题有些只能用动态规划法,13 有些可用贪心法。
达汇点t的最短路径的长度。cost(i,j)则是这些路径中的最短路
径长度。
16
9
7 源点s 0 3
2
14 2
1 2
7
3 11
6
5
2
5
4
63 5
11
7 6
48
8 4 2
9 5
10
11 t汇点
阶段 v1
v2
v3
v4
v5
使用式(7-1)向前递推式,由后向前计算最优解值—cost(1,0)
cost(5,11)=0,
矛盾。
多段图的最优子结构性质得证!
15
多段图问题的递推式(向前递推)
由多段图问题的最优子结构性质,容易得到多段图问题的递推 式,从而由子问题的最优解来计算原问题的最优解:
多段图问题的向前递推式:(式7-1)
cos t(k,t) 0
cos t(i, j)
min
c( j, p) cos t(i 1, p)
19
(0, d(1,0)=2, d(2,2)=5, d(3,5)=9, d(4,9)=11)
程序7-1:多段图的向前递推动态规划算法
FMultiGraph(int k,int*p) //共k个阶段
{//带权有向图G (多段图)采用邻接表存储(见程序6-8)
算法设计与分析做课程设计选题
算法设计与分析做课程设计选题一、课程目标知识目标:1. 理解算法设计的基本概念,掌握常见的算法设计方法;2. 了解算法分析的基本原则,掌握时间复杂度和空间复杂度的分析方法;3. 掌握至少两种算法设计选题,并能够运用所学知识对其进行分析和优化。
技能目标:1. 能够运用所学算法设计方法,独立完成中等难度的算法设计题目;2. 能够分析给定算法的时间复杂度和空间复杂度,并提出优化方案;3. 能够运用所学的算法知识,解决实际生活中的问题,提高问题解决能力。
情感态度价值观目标:1. 培养学生对算法设计和分析的热爱,激发学习兴趣;2. 培养学生的逻辑思维能力,提高分析问题和解决问题的能力;3. 培养学生的团队协作精神,学会在团队中共同探讨和解决问题;4. 培养学生具备良好的编程习惯,遵循学术道德,尊重他人成果。
课程性质:本课程为信息技术学科选修课程,旨在提高学生的算法设计和分析能力。
学生特点:学生具备一定的编程基础,对算法有一定了解,但对算法设计和分析的系统学习尚有不足。
教学要求:结合学生特点,注重理论与实践相结合,通过案例分析、讨论和实践操作,使学生掌握算法设计与分析的方法,提高实际应用能力。
将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 算法设计基本概念:介绍算法的定义、特性及分类,结合教材相关章节,让学生了解算法设计的基本框架。
- 教材章节:第一章 算法概述2. 算法设计方法:讲解常见的算法设计方法,如递归、分治、动态规划、贪心等,并通过实例分析,使学生掌握这些方法在实际问题中的应用。
- 教材章节:第二章 算法设计方法3. 算法分析:阐述时间复杂度和空间复杂度的概念,介绍分析方法,如迭代法、主定理等,结合实际案例,让学生学会评估算法性能。
- 教材章节:第三章 算法分析4. 算法设计选题:选取中等难度的算法设计题目,涵盖排序、查找、图论等领域,指导学生进行实际操作,提高问题解决能力。
算法设计与分析书中程序(第07章)
【程序7-1】多段图的向前递推算法template<class T>T Graph<T>::FMultiGraph(int k, int *p){//采用程序6-8的邻接表存储图GTc,*cost=new float[n]; int q, *d=new int[n];cost[n-1]=0, d[n-1]= -1; //设置向前递推的初值for (int j=n-2; j>=0; j--){ //按n-2, …, 0的次序计算cost和d float min=INFTY; //按式(7-1)计算最小值为cost[j]for (ENode<T> *r=a[j]; r; r=r->nextArc) {int v=r->adjVex;if (r->w+cost[v]<min) {min=r->w+cost[v];q=v;}}cost[j]=min; d[j]=q; //q是j在最短子路径上的后继结点}p[0]=0; p[k-1]=n-1; c=cost[0]; //p[0]和p[n-1]是源点和汇点for(j=1; j<=k-2; j++) p[j]=d[p[j-1]]; //p[i]是最短路径上第i阶段的结点delete []cost; delete []d; return c;}【程序7-2】弗洛伊德算法template<class T>void MGraph<T>::Floyd(T**& d, int **& path){int i, j, k;d= new T*[n]; path=new int *[n];for(i=0; i<n; i++){d[i]=new T [n]; path[i]=new int[n];for (j=0; j<n; j++){ //初始化d[i][j]=a[i][j];if (i!=j && w[i][j]<INFTY) path[i][j]=i;else path[i][j]= -1;}}for (k=0; k<n; k++) //考察结点kfor (i=0; i<n; i++)for (j=0; j<n; j++)·135·if (d[i][k]+d[k][j] < d[i][j] ){d[i][j]=d[i][k]+d[k][j];path[i][j]=path[k][j];}}【程序7-3】矩阵连乘算法class MatrixChain{public:MatrixChain(int mSize, int *q); //创建二维数组m和s,一维数组p,并初始化int MChain(); //一般动态规划法求最优解值int LookupChain(); //备忘录方法求最优解值(程序7-4)void Traceback(); //构造最优解的公有函数……private:void Traceback(int i, int j); //构造最优解的私有递归函数int LookupChain(int i, int j); //备忘录方法私有递归(程序7-4)int *p, **m, **s, n;};int MatrixChain::MChain(){ //求A[0:n-1]的最优解值for (int i=0;i<n; i++) m[i][i]=0;for (int r=2; r<=n; r++)for (int i=0; i<=n-r; i++) {int j=i+r-1;m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]; //m[i][j] 的初值s[i][j]=i;for (int k=i+1; k<j; k++) {int t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];if (t<m[i][j]) {m[i][j]=t; s[i][j]=k;}}}return m[0][n-1];}void MatrixChain::Traceback(int i, int j){if(i==j) { cout<<'A'<<i; return;}·136·if (i<s[i][j]) cout<<'('; Traceback(i, s[i][j]); if (i<s[i][j])cout<<')';if(s[i][j]+1<j)cout<<'('; Traceback(s[i][j]+1, j); if(s[i][j]+1<j) cout<<')';}void MatrixChain::Traceback(){cout<<'('; Traceback(0, n-1); cout<<')';cout<<endl;}【程序7-4】矩阵连乘的备忘录方法int MatrixChain::LookupChain(int i, int j){if (m[i][j]>0) return m[i][j]; //子问题已经求解,直接引用if(i==j) return 0; //单一矩阵无须计算int u=LookupChain(i+1, j)+p[i]*p[i+1]*p[j+1]; //按式(7-9)求最小值s[i][j]=i;for (int k=i+1; k<j; 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;}}m[i][j]=u; return u; //保存并返回子最优解值}int MatrixChain::LookupChain(){return LookupChain(0, n-1); //返回A[0:n-1]的最优解值}·137·【程序7-5】求LCS的长度class LCS{public:LCS(int nx, int ny, char *x, char*y); //创建二维数组c、s和一维数组a、b,并进行初始化void LCSLength(); //求最优解值(最长公共子序列长度)void CLCS(); //构造最优解(最长公共子序列)……private:void CLCS(int i, int j);int **c, **s.m, n;char *a, *b;};int LCS::LCSLength()·138·for(int i=1; i<=m; i++) c[i][0]=0;for(i=1; i<=n; i++) c[0][i]=0;for (i=1; i<=m; i++)for (int j=1; j<=n; j++)if (x[i]==y[j]){c[i][j]=c[i-1][j-1]+1; s[i][j]=1; //由c[i-1][j-1]计算c[i][j]}else if (c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j]; s[i][j]=2; //由c[i-1][j]得到c[i][j]}else {c[i][j]=c[i][j-1]; s[i][j]=3; //由c[i][j-1]得到c[i][j]}return c[m][n]; //返回最优解值}【程序7-6】构造最长公共子序列void LCS::CLCS(int i, int j){if (i==0||j==0) return;if (s[i][j]==1){CLCS(i-1, j-1);cout<<a[i];}else if (s[i][j]==2) CLCS(i-1, j);else CLCS(i, j-1);}【程序7-7】构造最优二叉搜索树int Find(int i, int j, int **r, float**c){float min=INFTY; int k;for (int m=i+1; m<=j; m++)if ((c[i][m-1]+c[m][j])<min) {min=c[i][m-1]+c[m][j]; k=m;}return k;}void CreateOBST(float* p, float* q, float **c, int **r, float**w, int n)·139·for (int i=0; i<=n-1; i++) { //初始化w[i][i]=q[i]; c[i][i]=0.0; r[i][i]=0;w[i][i+1]=q[i]+q[i+1]+p[i+1];c[i][i+1]=q[i]+q[i+1]+p[i+1];r[i][i+1]=i+1;}w[n][n]=q[n]; c[n][n]=0.0; r[n][n]=0;for (int m=2; m<=n; m++) //计算n-2条对角线元素for (i=0; i<=n-m; i++) {int j=i+m;w[i][j]=w[i][j-1]+p[j]+q[j];int k = Find(i, j, r, c);c[i][j] = w[i][j] + c[i][k-1] + c[k][j];r[i][j] = k;}}【程序7-8】0/1背包的递归算法template<class T>class Knapsack{public:Knapsack(int mSize, float cap, float *wei, T *prof);T RKnap();private:T f(int j, float X);float m, *w;T *p;int n;};template<class T>T Knapsack<T>::f(int j, float X){if (j<0) return ((X<0) ?-INFTY: 0);if (X<w[j]) return f(j-1, X);else {T a=f(j-1, X);T b=f(j-1, X-w[j])+p[j];if(a>b)return a; else return b;}·140··141·template<class T> T Knapsack<T>:: RKnap() { if(n>0) return f(n -1, m); else return NoAns;//NoAns 可定义为类型T 的一个代表无收益的常量}【程序7-9】 0/1背包算法的粗略描述void DKP(float *p, float *w, int n, float M, float &P, int *x) {S -1={(0, 0)};for (i =0; i <n -1; i ++){1i S ={(X , P )|(X -w i , P -p i )∈S i -1 and X M }; S i =MergerPurge(S i -1,1i S );//合并两集合,并从中舍弃应去除的阶跃点}(X 1, P 1)=S n -2中最后一个阶跃点;(X 2, P 2)=(X +w n -1, P +p n -1),其中(X , P )是S n -1中使得X +w n -1≤M 的最大的阶跃点; P =max{P 1, P 2};//P 为最优解值If (P 2>P 1) x n -1=1;else x n -1=0;回溯确定x n -2, x n -3, …, x 0; }【程序7-10】 0/1背包最优解值算法struct XP {float X, P; };template<class T> class Knapsack { public:Knapsack(int sz, float cap, float *wei, T *prof); T DKnap(int *x); …… private:T DKnap();void TraceBack(int*x);int Largest(int low, int high, int i); float m, *w;·142·XP *p; T *pf; int n, *b; };template<class T>int Knapsack<T>::Largest(int low, int high, int i) { int u=low-1;for (int j=low; j<=high; j++){ float ww=p[j].X+w[i];if(ww<=m) u=j;}return u;}template<class T>T Knapsack<T>:: DKnap() { float ww, pp; int next; b[0]=0;p[0].X=p[0].P=0.0; p[1].X=w[0]; p[1].P=pf[0]; //S 0int low=0, high=1; //S 0的起止位置b[1]=next=2;//数组p 的下一个空闲位置 for (int i=1; i<=n -1; i++) {//由S i -1产生S iint k=low;int u=Largest(low, high, i); for (int j=low; j<=u; j++) {//从S i -1生成1i S ,并合并成S i ww=p[j].X+w[i]; pp=p[j].P+pf[i];//生成1i S 中的一个阶跃点(ww, pp) while ((k<=high) && (p[k].X<ww)) {//复制S i -1中的部分阶跃点到S i 中p[next].X=p[k].X; p[next++].P=p[k++].P;}if (k<=high && p[k].X==ww) if (pp<p[k].P) pp=p[k++].P;if (pp>p[next -1].P) {//若(ww, pp)不被支配,则加入S i 中p[next].X=ww; p[next++].P=pp;}while (k<=high && p[k].P<=p[next -1].P) k++; //舍弃所有被支配的阶跃点 }while (k<=high){//复制S i -1中剩余阶跃点到S i 中p[next].X=p[k].X; p[next++].P=p[k++].P;}low=high+1; high=next-1; b[i+1]=next;//S i +1的初始化}return p[next-1].P ; //返回最大收益}【程序7-11】0/1背包最优解算法template<class T>void Knapsack<T>:: TraceBack(int*x ){float ww=p[b[n] -1].X;for (int j=n-1; j>0; j--){x[j]=1;for (int k=b[j-1]; k<b[j]; k++)if(ww==p[k].X) x[j]=0;if(x[j]) ww=ww-w[j];}if(ww==0) x[0]=0; else x[0]=1;}【程序7-12】Johnson算法struct Triplet{ //三元组结构int operator <(Triplet b)const { return t<b.t;}int jobNo,t,ab; //jobNo为作业号,t为处理时间,ab为设备号};void FlowShop(int n, int *a,int *b,int *c){Triplet d[mSize]={{0,0,0}};for(int i=0;i<n;i++) //算法步骤(1)生成三元组表dif(a[i]<b[i]) {d[i].jobNo=i;d[i].ab=0;d[i].t=a[i];}else {d[i].jobNo=i;d[i].ab=1;d[i].t=b[i];}Sort(d,n); //算法步骤(2),任意排序算法int left=0,right=n-1;for (i=0;i<n;i++) //算法步骤(3),生成最优解if(d[i].ab==0) c[left++]=d[i].jobNo;else c[right--]=d[i].jobNo;}·143·。
算法设计与分析第7章作业
算法设计与分析第7章作业第7章是关于贪心算法的设计与分析。
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而导致全局最优解的算法。
本章中将介绍贪心算法的设计思路、典型问题以及如何分析贪心算法的正确性。
在贪心算法的设计过程中,首先要明确问题的贪心选择性质。
贪心选择性质是指每一步的最优选择都可以得到最终的最优解。
其次,要证明每一步的贪心选择都是最优选择。
如果能够证明这两点,那么贪心算法就能得到正确的结果。
在分析贪心算法的正确性时,常常使用反证法来证明。
即假设贪心算法得到的结果不是最优解,然后通过推理来得出矛盾的结论,从而推翻假设。
如果找不到矛盾的结论,那么就需要重新考虑问题是否满足贪心选择性质。
在本章中介绍了两个有关贪心算法的经典问题,分别是活动选择问题和霍夫曼编码问题。
活动选择问题是指在一组互相竞争的活动中,选择出一个最大的相容活动子集。
活动之间有一定的时间限制,每个活动都有一个起始时间和结束时间。
求解活动选择问题的贪心算法思路是选择结束时间最早的活动作为第一个活动,然后依次选择下一个结束时间最早且与前一个活动相容的活动。
证明贪心选择性质时可以使用区间调度问题的贪心选择性质来证明。
霍夫曼编码问题是指用一种前缀编码方式来表示信息,使得编码后的信息的总长度最小。
在贪心算法中,每次选择频率最低的两个字符合并成一个新的字符,并更新其频率,直到只剩下一个字符。
证明贪心选择性质时可以使用反证法来证明。
除了以上两个典型问题外,贪心算法还可以应用于其他许多问题。
例如最小生成树问题、单源最短路径问题等。
对于这些问题,也要明确贪心选择性质,并证明每一步的贪心选择都是最优选择。
总结起来,贪心算法是一种简单但实用的算法设计思想。
通过选择每一步的最优选择,最终可以得到全局最优解。
在设计贪心算法时,需要明确问题的贪心选择性质,并证明每一步的贪心选择都是最优选择。
通过分析算法的正确性,可以确保得到正确的结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章
习题7.1
1.分步计数算法是稳定的吗?
解:
分步计数算法是稳定的。
习题7.2
3.用Horspool算法在一个1000个0构成的二进制文本中查找下列模式时,分别需要进行多少次字符比较?
a.00001;
b.10000;
c.01010;
5
解:
a.
比较次数:(1000/5)*1=200
b.
比较次数:[(1000-5+1]*5=4980
c.
比较次数:[(1000-3)/2]*2=996 (1000-3)/2取整数部分
4.用Horspool算法在一个长度为n的文本中查找一个长度为m(n>=m)的模式。
请分别给出下面两种例子。
a.最差输入;
b.最优输入。
解:
a.模式的每次一移动的举例均为1,且没有匹配成功,或者到最后一次匹配才成功。
b.模式不需要移动,且比较了m次即成功。
7.用Boyer-Moore算法在一个1000个0构成的二进制文本中查找
列模式时,分别需要进行多少次字符比较?
a.00001;
b.10000;
c.01010;
解:
a.
坏符号移动表:
后缀移动表:
d1=max{t1(0),1}=1,d2=5
模式移动max(d1,d2)=5,所以每次移动5位,且每次只比较一次。
比较次数为:1000/5=200
b.
坏符号移动表:
后缀移动表:
d1=max{t1(0)-4,1}=1,d2=1
模式移动max(d1,d2)=1,所以每次都移动一位,比较5次。
比较次数:[(1000-5+1]*5=4980
c.
坏符号移动表:
后缀移动表:
d1=max{t1(0)-1,1}=1,d2=2
模式移动max(d1,d2)=2,所以每次都能移动2位,比较2次。
比较次数:[(1000-3)/2]*2=996
习题7.3
2.对于输入30,20,56,75,31,19和散列函数h(K)=K mod11
a.构造它们的闭散列表;
b.求在本表中成功查找的最大键值比较次数;
c.求在本表中成功查找的平均键值比较次数;
解:a.
b.最大的键值是19,k(19)=8,先将散列地址为8的中的键30与75比较,其次是散列地址为10的75与75比较,所以成功查找的比较次数是6。
c.
查找成功的平均键值比较次数为:(1+1+1+2+3+6)/6=7/3。