《算法分析与设计》作业参考答案
算法分析与设计(线下作业二)

算法分析与设计(线下作业⼆)《算法分析与设计》学习中⼼:专业:学号:姓名:作业练习⼆⼀、名词解释1、MST性质2、⼦问题的重叠性质递归算法求解问题时,每次产⽣的⼦问题并不总是新问题,有些⼦问题被反复计算多次,这种性质称为⼦问题的重叠性质。
⼆、简答题1、简述动态规划算法求解的基本要素。
答:动态规划算法求解的基本要素包括:1)最优⼦结构是问题能⽤动态规划算法求解的前提;2)动态规划算法,对每⼀个⼦问题只解⼀次,⽽后将其解保存在⼀个表格中,当再次需要解此⼦问题时,只是简单地⽤常数时间查看⼀下结果,即重叠⼦问题。
2、备忘录⽅法和动态规划算法相⽐有何异同简述之。
答:备忘录⽅法是动态规划算法的变形。
与动态规划算法⼀样,备忘录⽅法⽤表格保存已解决的⼦问题的答案,在下次需要解此问题时,只要简单地查看该⼦问题的解答,⽽不必重新计算。
备忘录⽅法与动态规划算法不同的是,备忘录⽅法的递归⽅式是⾃顶向下的,⽽动态规划算法则是⾃底向上递归的。
因此,备忘录⽅法的控制结构与直接递归⽅法的控制结构相同,区别在于备忘录⽅法为每个解过的⼦问题建⽴了备忘录以备需要时查看,避免了相同的⼦问题的重复求解,⽽直接递归⽅法没有此功能。
3、贪⼼算法求解的问题主要具有哪些性质简述之。
答:贪⼼算法求解的问题⼀般具有⼆个重要的性质:⼀是贪⼼选择性质,这是贪⼼算法可⾏的第⼀个基本要素;另⼀个是最优⼦结构性质,问题的最优⼦结构性质是该问题可⽤贪⼼算法求解的关键特征。
三、算法编写及算法应⽤分析题1、设计求解如下最⼤⼦段和问题的动态规划算法。
只需给出其递推计算公式即可。
最⼤⼦段和问题:给定由n 个整数(可能为负整数)组成的序列a1a2 … an,求该序列形如Σi≤k≤j ak的⼦段和的最⼤值。
当所有整数均为负整数时定义其最⼤⼦段和为0。
依次定义,所求的最优值为max{0, max1≤i≤j≤n Σi≤k≤j ak }。
2、关于多段图问题。
设G =(V ,E)是⼀个赋权有向图,其顶点集V 被划分成k>2个不相交的⼦集V i :1i k ≤≤,其中,V 1和V k 分别只有⼀个顶点s (称为源)和⼀个顶点t (称为汇),图中所有的边(u,v ),i u V ∈,1i v V +∈。
算法分析与设计作业参考答案

算法分析与设计作业参考答案《算法分析与设计》作业参考答案作业⼀⼀、名词解释:1.递归算法:直接或间接地调⽤⾃⾝的算法称为递归算法。
2.程序:程序是算法⽤某种程序设计语⾔的具体实现。
⼆、简答题:1.算法需要满⾜哪些性质?简述之。
答:算法是若⼲指令的有穷序列,满⾜性质:(1)输⼊:有零个或多个外部量作为算法的输⼊。
(2)输出:算法产⽣⾄少⼀个量作为输出。
(3)确定性:组成算法的每条指令清晰、⽆歧义。
(4)有限性:算法中每条指令的执⾏次数有限,执⾏每条指令的时间也有限。
2.简要分析分治法能解决的问题具有的特征。
答:分析分治法能解决的问题主要具有如下特征:(1)该问题的规模缩⼩到⼀定的程度就可以容易地解决;(2)该问题可以分解为若⼲个规模较⼩的相同问题,即该问题具有最优⼦结构性质;(3)利⽤该问题分解出的⼦问题的解可以合并为该问题的解;(4)该问题所分解出的各个⼦问题是相互独⽴的,即⼦问题之间不包含公共的⼦问题。
3.简要分析在递归算法中消除递归调⽤,将递归算法转化为⾮递归算法的⽅法。
答:将递归算法转化为⾮递归算法的⽅法主要有:(1)采⽤⼀个⽤户定义的栈来模拟系统的递归调⽤⼯作栈。
该⽅法通⽤性强,但本质上还是递归,只不过⼈⼯做了本来由编译器做的事情,优化效果不明显。
(2)⽤递推来实现递归函数。
(3)通过Cooper 变换、反演变换能将⼀些递归转化为尾递归,从⽽迭代求出结果。
后两种⽅法在时空复杂度上均有较⼤改善,但其适⽤范围有限。
三、算法编写及算法应⽤分析题: 1.冒泡排序算法的基本运算如下: for i ←1 to n-1 dofor j ←1 to n-i do if a[j]交换a[j]、a[j+1];分析该算法的时间复杂性。
答:排序算法的基本运算步为元素⽐较,冒泡排序算法的时间复杂性就是求⽐较次数与n 的关系。
(1)设⽐较⼀次花时间1;(2)内循环次数为:n-i 次,(i=1,…n ),花时间为:∑-=-=in j i n 1)(1(3)外循环次数为:n-1,花时间为:2.设计⼀个分治算法计算⼀棵⼆叉树的⾼度。
算法设计与分析(A)评分标准和参考答案

(占 1 分) 当调度方案是 2,3,1 时:
(占 1 分)
第
1 页 共
2 页
当调度方案是 3,1,2 时: 机器 1 机器 2 作业 3 2 作业 2 2+3=5 作业 1 5+2=7 完成时间和=5+6+8=19
2+3=5 5+1=6 7+1=8 (占 1 分)
它们所对应的完成时间和分别是 19,18,20,21,19,19; 因此最佳调度方案是 1,3,2; .其完成时间为 18。 (占 2 分)
2. 证明:设 F(N)=O(f)), 根据 O 的定义,存在正常数 C1 和 N1, 使得对所有 N>= N1 有 F(N)<=C1f(N); (占 2 分) 再设 G(N)= O(g), 根据 O 的定义,存在正常数 C2 和 N2, 使得对所有 N>= n2 有 G(N)<= C2f(n); (占 2 分) 令 C3=max{C1,C2},N3=max{N1,N2},h(N)=max{f,g},则对所有的 N>=N3,有:(占 2 分) F(N)<= C1f(N)<= C1h(N)<= C3h (N); 类似地有: G(N)<= C2f(N)<= C2h(N)<= C3h (N); 则: (占 2 分) O(f)+O(g)=F(N)+G(N)<= C3h (N)+ C3h (N) =2 C3h (N)=O(h)=O(max(f,g))
五、綜合题(每小题 12 分,共 24 分)
1.(每小问为 2 分) ①:i<=n ②:0 ③:i<=n-r+1 ④:i+r-1 ⑤:t[i][k]+ t[k+1][j]+w(i-1,k,j) ⑥: t[i][j] 2. 1 1 1 .这三个作业的可能的调度方案总数是:P3 P2 P1 =3*2*1=6; 具体的调度方案是 1,2,3; 1,3,2; 2,1,3; 2,3,1; 3,1,2; 3,2,1; .当调度方案是 1,2,3 时: 机器 1 机器 2 作业 1 2 2+1=3 作业 2 2+3=5 5+1=6 作业 3 5+2=7 7+3=10 完成时间和=3+6+10=19 . 当调度方案是 1,3,2 时: 机器 1 机器 2 作业 1 2 2+1=3 作业 3 2+2=4 4+3=7 作业 2 4+3=7 7+1=8 完成时间和=3+7+8=18 (占 1 分) 当调度方案是 2,1,3 时: 机器 1 机器 2 作业 2 3 3+1=4 作业 1 3+2=5 5+1=6 作业 3 5+2=7 7+3=10 完成时间和=4+6+10=20 机器 1 机器 2 作业 2 3 3+1=4 作业 3 3+2=5 5+3=8 作业 1 5+2=7 8+1=9 完成时间和=4+8+9=21
算法分析与设计作业(一)及参考答案

《算法分析与设计》作业(一)本课程作业由两部分组成。
第一部分为“客观题部分”,由15个选择题组成,每题1分,共15分。
第二部分为“主观题部分”,由简答题和论述题组成,共15分。
作业总分30分,将作为平时成绩记入课程总成绩。
客观题部分:一、选择题(每题1分,共15题)1、递归算法:(C )A、直接调用自身B、间接调用自身C、直接或间接调用自身D、不调用自身2、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的字问题,这些子问题:(D )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同3、备忘录方法的递归方式是:(C )A、自顶向下B、自底向上C、和动态规划算法相同D、非递归的4、回溯法的求解目标是找出解空间中满足约束条件的:(A )A、所有解B、一些解C、极大解D、极小解5、贪心算法和动态规划算法共有特点是:(A )A、最优子结构B、重叠子问题C、贪心选择D、形函数6、哈夫曼编码是:(B)A、定长编码B、变长编码C、随机编码D、定长或变长编码7、多机调度的贪心策略是:(A)A、最长处理时间作业优先B、最短处理时间作业优先C、随机调度D、最优调度8、程序可以不满足如下性质:(D )A、零个或多个外部输入B、至少一个输出C、指令的确定性D、指令的有限性9、用分治法设计出的程序一般是:(A )A、递归算法B、动态规划算法C、贪心算法D、回溯法10、采用动态规划算法分解得到的子问题:( C )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同11、回溯法搜索解空间的方法是:(A )A、深度优先B、广度优先C、最小耗费优先D、随机搜索12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策有可能导致算法:( C )A、所需时间变化B、一定找到解C、找不到所需的解D、性能变差13、贪心算法能得到:(C )A、全局最优解B、0-1背包问题的解C、背包问题的解D、无解14、能求解单源最短路径问题的算法是:(A )A、分支限界法B、动态规划C、线形规划D、蒙特卡罗算法15、快速排序算法和线性时间选择算法的随机化版本是:( A )A、舍伍德算法B、蒙特卡罗算法C、拉斯维加斯算法D、数值随机化算法主观题部分:二、写出下列程序的答案(每题2.5分,共2题)1、请写出批处理作业调度的回溯算法。
算法设计与分析第二版课后习题及解答(可编辑)

算法设计与分析第二版课后习题及解答算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求 //输入:一个正整数n2//输出:。
step1:a1; step2:若a*an 转step 3,否则输出a; step3:aa+1转step 2;5. a.用欧几里德算法求gcd(31415,14142)。
b. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
a. gcd31415, 14142 gcd14142, 3131 gcd3131, 1618 gcd1618, 1513 gcd1513, 105 gcd1513, 105 gcd105, 43 gcd43, 19 gcd19, 5 gcd5, 4 gcd4, 1 gcd1, 0 1.b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1?14142 和 2?14142之间,所以欧几里德算法比此算法快1?14142/11 ≈1300 与2?14142/11 ≈ 2600 倍之间。
6.证明等式gcdm,ngcdn,m mod n对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和rm mod nm-qn;显然,若d能整除n和r,也一定能整除mr+qn和n。
数对m,n和n,r具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcdm,ngcdn,r7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0mn的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcdm,ngcdn,m并且这种交换处理只发生一次.8.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?1次b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?5次gcd5,8习题1.21.农夫过河P?农夫W?狼 G?山羊 C?白菜2.过桥问题1,2,5,10---分别代表4个人, f?手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c0的实根,写出上述算法的伪代码可以假设sqrtx是求平方根的函数算法Quadratica,b,c//求方程ax^2+bx+c0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D0temp←2*ax1←-b+sqrtD/tempx2←-b-sqrtD/tempreturn x1,x2else if D0 return ?b/2*ael se return “no real roots”else //a0if b≠0 return ?c/belse //ab0if c0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Kii0,1,2,商赋给n第二步:如果n0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBinn//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1n]中i1while n!0 doBin[i]n%2;nintn/2;i++;while i!0 doprint Bin[i];i--;9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.算法略对这个算法做尽可能多的改进.算法 MinDistanceA[0..n-1]//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements 习题1.3考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count[]4.古老的七桥问题第2章习题2.17.对下列断言进行证明:如果是错误的,请举例a. 如果tn∈Ogn,则gn∈Ωtnb.α0时,Θαgn Θgn解:a这个断言是正确的。
算法设计与分析习题解答

算法设计与分析习题解答第一章作业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!)=∑=ni i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
由于对所有的偶数n 有,log(n!)= ∑=ni i 1log ≥∑=nn i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法及其分析》课后选择题答案及详解第1 章——概论1.下列关于算法的说法中正确的有()。
Ⅰ.求解某一类问题的算法是唯一的Ⅱ.算法必须在有限步操作之后停止Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产生确定的结果A.1个B.2个C.3个D.4个2.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是()。
A.T(n)=T(n-1)+1,T(1)=1B.T(n)=2nC.T(n)= T(n/2)+1,T(1)=1D.T(n)=3nlog2n答案解析:1.答:由于算法具有有穷性、确定性和输出性,因而Ⅱ、Ⅲ、Ⅳ正确,而解决某一类问题的算法不一定是唯一的。
答案为C。
2.答:选项A的时间复杂度为O(n)。
选项B的时间复杂度为O(n)。
选项C 的时间复杂度为O(log2n)。
选项D的时间复杂度为O(nlog2n)。
答案为C。
第3 章─分治法1.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。
这要求原问题和子问题()。
A.问题规模相同,问题性质相同B.问题规模相同,问题性质不同C.问题规模不同,问题性质相同D.问题规模不同,问题性质不同2.在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面()答案解释最合理。
A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。
但不同方法,算法复杂度上界可能不同3.对于下列二分查找算法,以下正确的是()。
A.intbinarySearch(inta[],intn,int x){intlow=0,high=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;if(x>a[mid])low=mid;elsehigh=mid;}return –1;}B.intbinarySearch(inta[],intn,int x) { intlow=0,high=n-1;while(low+1!=high){intmid=(low+high)/2;if(x>=a[mid])low=mid;elsehigh=mid;}if(x==a[low])returnlow;elsereturn –1;}C.intbinarySearch(inta[],intn,intx) { intlow=0,high=n-1;while(low<high-1){intmid=(low+high)/2;if(x<a[mid])high=mid;elselow=mid;}if(x==a[low])returnlow;elsereturn –1;}D.intbinarySearch(inta[],intn,int x) {if(n>0&&x>=a[0]){intlow= 0,high=n-1;while(low<high){intmid=(low+high+1)/2;if(x<a[mid])high=mid-1;elselow=mid;}if(x==a[low])returnlow;}return –1;}答案解析:1.答:C。
《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案一、简要回答下列问题:1.算法重要特性是什么?1. 确定性、可行性、输入、输出、有穷性2.2.算法分析的目的是什么?2. 分析算法占用计算机资源的情况,对算法做出比较和评价,设计出额更好的算法。
3.3.算法的时间复杂性与问题的什么因素相关?3. 算法的时间复杂性与问题的规模相关,是问题大小n的函数。
4.算法的渐进时间复杂性的含义?4.当问题的规模n趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。
时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。
5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?5. 最坏情况下的时间复杂性和平均时间复杂性考察的是n固定时,不同输入实例下的算法所耗时间。
最坏情况下的时间复杂性取的输入实例中最大的时间复杂度:W(n) = max{ T(n,I) } , I∈Dn平均时间复杂性是所有输入实例的处理时间与各自概率的乘积和:A(n) =∑P(I)T(n,I) I∈Dn6.简述二分检索(折半查找)算法的基本过程。
6. 设输入是一个按非降次序排列的元素表A[i:j] 和x,选取A[(i+j)/2]与x比较,如果A[(i+j)/2]=x,则返回(i+j)/2,如果A[(i+j)/2]<x,则A[i:(i+j)/2-1]找x,否则在A[ (i+j)/2+1:j] 找x。
上述过程被反复递归调用。
7.背包问题的目标函数和贪心算法最优化量度相同吗?7. 不相同。
目标函数:获得最大利润。
最优量度:最大利润/重量比。
8.采用回溯法求解的问题,其解如何表示?有什么规定?8. 问题的解可以表示为n元组:(x1,x2,……x n),x i∈S i, S i为有穷集合,x i∈S i, (x1,x2,……x n)具备完备性,即(x1,x2,……x n)是合理的,则(x1,x2,……x i)(i<n)一定合理。
算法分析与设计试题及答案

算法分析与设计试题及答案一、选择题1. 下列哪个是属于分治算法的例子?A. 冒泡排序B. 归并排序C. 顺序查找D. 选择排序答案:B2. 在排序算法中,时间复杂度最优的是:A. 冒泡排序B. 插入排序C. 归并排序D. 快速排序答案:C3. 哪个不是动态规划的特点?A. 具有重叠子问题B. 通过递归求解C. 需要保存子问题的解D. 具有最优子结构答案:B4. 在图的广度优先搜索算法中,使用的数据结构是:A. 栈B. 队列C. 数组D. 堆栈答案:B5. 在最小生成树算法中,下列哪个不属于贪心策略?A. Kruskal算法B. Prim算法C. Dijkstra算法D. Prim-Kruskal混合算法答案:C二、简答题1. 请简述分治算法的思想和应用场景。
答案:分治算法的思想是将原问题分解成若干个规模较小且类似的子问题,然后解决子问题,最后将子问题的解合并得到原问题的解。
其应用场景包括排序算法(如归并排序、快速排序)、搜索算法(如二分查找)等。
2. 什么是动态规划算法?请给出一个动态规划算法的示例。
答案:动态规划算法是一种通过将问题分解成子问题并解决子问题来解决复杂问题的方法。
它的特点是具有重叠子问题和最优子结构性质。
以斐波那契数列为例,可以使用动态规划算法求解每一项的值,而不需要重复计算。
3. 图的深度优先搜索和广度优先搜索有什么区别?答案:图的深度优先搜索(Depth First Search,DFS)是一种先访问子节点再访问兄弟节点的遍历算法,通常使用递归或者栈实现。
而广度优先搜索(Breadth First Search,BFS)则是以层次遍历的方式展开搜索,使用队列来实现。
DFS更适合用于搜索路径,BFS则适用于寻找最短路径等。
4. 请简述贪心算法的特点及其应用场景。
答案:贪心算法的特点是每一步都采取当前状态下最优的选择,以期望得到全局最优解。
然而,贪心算法并不一定能求解所有问题的最优解,但对于一些特定问题,贪心算法往往能得到近似最优解。
算法设计与分析(王多强)作业参考答案.docx

第二章递归习题导论4.1-17(/?) = 27(b / 2)+ 1=> M = 2T5 /2) + 1%)习题导论4.1-6Tin) = 2T(0) + 1做代换:m=log2n另 S(m)=T(2m )则有: S(/z?) = 2S(zz? / 2) + 1 化简有:S(m)=O(m) 所以 T(n)=O(logn)习题4.2-27(/7)= T(n / 3) + 7(2/7 / 3) + 劲 注意最长分支 2n/3-*(2n/3)2 -*(2n/3)3...-*(2n^)log3/2n 习题4.3-1a) T(n) = 4T(n/2) + nb) T(n) = 4T(n/2) + n 2c 取大于1/2小于1的数即可,如珈习题4.3-4f(n )/nlogba = n 2log n/n'°g"二 log nvn所以不满足规则3直接化简即可,T(n)=O(n 2log 2n)c) T(n) = 4T(n/2) + n 3情况 3, ◎ (r?). 验证 4f(n/2)=4(n/2)3=n 3/2^cn 3,这里7X2")27(2"/彳)+情况4 0(n 2)情况 2, © (n 2logn)第三章习题4.5注意三分Z—和三分Z二分割点的计算ml = (2low+high)^m2 = (low+2high)/3习题4.20主要是验证T(n/r) + T(0)>|« n/r+O的数量级是否小于n的1次方(线性) 利用关系式:\n / r」n (/7 - r - 1) / /进行化简r=3:\r / 2~|~|_/2 / /_] / 2~| > 2 z? / r / 2 = n / r」> (/? 一2) / 3则,刀一卜/2北刀 / 厂」/ 2] < /? - (/? - 2) / 3 = 2/7 / 3 + 2 / 3 则,n〃 +羊n +厉超线性了r=7:\r / 2]\n / r\/ 2〕>/ 7」/2 = 2山 / 7」> 2(刀一6) / 7则,n - \r / i\\n / /」/ 2〕v 刀一2(刀一6) / 7 = 5刀 / 7 + 12 / 7可证,当n>48的时候,上式小于3伙则,n/7+3nA = 25n/28 <n 成立r=9:\r / 2][n / 厂」/ 2〕> 5[刀 / 9」/ 2 = (5 / 2)^/9」> 5(刀-8)/18n一\r / 2\[n / /」/ 2〕< 13/?/18 + 40/18可证,当n>20的时候,上式小于7n/8 则,n/9+7n/8 = 71n/72 <n 成立r=ll习题4.25肓接带入验证即可棋盘覆盖问题角上用一个骨牌覆盖,认为构造有特殊方格的区域,然后在四个区域上递归求解即可第四章中位数中位数习题导论9-2A)比较明显。
算法分析与设计作业及参考答案

算法分析与设计作业及参考答案作业题目1、请分析冒泡排序算法的时间复杂度和空间复杂度,并举例说明其在实际中的应用场景。
2、设计一个算法,用于在一个未排序的整数数组中找到第二大的元素,并分析其时间复杂度。
3、比较贪心算法和动态规划算法的异同,并分别举例说明它们在解决问题中的应用。
参考答案1、冒泡排序算法时间复杂度:冒泡排序的基本思想是通过相邻元素的比较和交换,将最大的元素逐步“浮”到数组的末尾。
在最坏情况下,数组完全逆序,需要进行 n 1 轮比较和交换,每一轮比较 n i 次(i 表示当前轮数),所以总的比较次数为 n(n 1) / 2,时间复杂度为 O(n^2)。
在最好情况下,数组已经有序,只需要进行一轮比较,时间复杂度为 O(n)。
平均情况下,时间复杂度也为 O(n^2)。
空间复杂度:冒泡排序只在原数组上进行操作,不需要额外的存储空间,空间复杂度为 O(1)。
应用场景:冒泡排序算法简单易懂,对于规模较小的数组,或者对算法的简单性要求较高而对性能要求不是特别苛刻的场景,如对少量数据进行简单排序时,可以使用冒泡排序。
例如,在一个小型的学生成绩管理系统中,需要对一个班级的少量学生成绩进行排序展示,冒泡排序就可以满足需求。
2、找到第二大元素的算法以下是一种使用遍历的方法来找到未排序整数数组中第二大元素的算法:```pythondef find_second_largest(arr):largest = arr0second_largest = float('inf')for num in arr:if num > largest:second_largest = largestlargest = numelif num > second_largest and num!= largest:second_largest = numreturn second_largest```时间复杂度分析:这个算法需要遍历数组一次,所以时间复杂度为O(n)。
算法分析与设计(李清勇)课后习题答案

算法分析与设计(李清勇)课后习题答案5-1凸多边形最优三⾓剖分问题//3d5 凸多边形最优三⾓剖分#include "stdafx.h"#includeusing namespace std;constint N = 7;//凸多边形边数+1int weight[][N] = {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};//凸多边形的权intMinWeightTriangulation(intn,int **t,int **s);void Traceback(inti,intj,int **s);//构造最优解int Weight(inta,intb,int c);//权函数int main(){int **s = new int *[N];int **t = new int *[N];for(inti=0;is[i] = new int[N];t[i] = new int[N];}cout<<"此多边形的最优三⾓剖分值为:"<cout<<"最优三⾓剖分结构为:"<Traceback(1,5,s); //s[i][j]记录了Vi-1和Vj构成三⾓形的第3个顶点的位置return 0;}intMinWeightTriangulation(intn,int **t,int **s){for(inti=1; i<=n; i++){t[i][i] = 0;}for(int r=2; r<=n; r++) //r为当前计算的链长(⼦问题规模){for(inti=1; i<=n-r+1; i++)//n-r+1为最后⼀个r链的前边界{int j = i+r-1;//计算前边界为r,链长为r的链的后边界t[i][j] = t[i+1][j] + Weight(i-1,i,j);//将链ij划分为A(i) * ( A[i+1:j] )这⾥实际上就是k=i s[i][j] = i; for(int k=i+1; k//将链ij划分为( A[i:k] )* (A[k+1:j])int u = t[i][k] + t[k+1][j] + Weight(i-1,k,j);if(ut[i][j] = u;s[i][j] = k;}}}}return t[1][N-2];}voidTraceback(inti,intj,int **s){if(i==j) return;Traceback(i,s[i][j],s);Traceback(s[i][j]+1,j,s);cout<<"三⾓剖分顶点:V"<int Weight(inta,intb,int c){return weight[a][b] + weight[b][c] + weight[a][c];}5-4 数字三⾓形最短路径5-2 游艇租赁问题#includeusing namespace std;#define N 210int cost[N][N];int m[N];int main(){intn,i,j;while(cin>>n){for(i=1;ifor(j=i+1;j<=n;j++)cin>>cost[i][j];m[1]=0;int min;for(i=2;i<=n;i++){min=cost[1][i];for(j=1;j<=i-1;j++){if(cost[j][i]!=0 && m[j]+cost[j][i]min=m[j]+cost[j][i];}m[i]=min;}cout<}return 0;}5-6 合唱队形问题#include/doc/d0aa713f51e79b8969022686.html ing namespace std; 2.3.//⽤于保存⼦问题最优解的备忘录4.typedef struct5.{6.int maxlen; //当前⼦问题最优解7.int prev; //构造该⼦问题所⽤到的下⼀级⼦问题序号(⽤于跟踪输出最优队列)8.}Memo;9.10.//⽤于递归输出Memo B中的解11.void Display(int* A, Memo* M, int i)12.{13.if (M[i].prev == -1)14. {15. cout<16.return;17. }18. Display(A, M, M[i].prev);19. cout<20.}21.22.//算法主要部分23.void GetBestQuence(int* A, int n)24.{25.//定义备忘录并作必要的初始化26. Memo *B = new Memo[n]; //B[i]代表从A[0]到A[i]满⾜升序剔除部分元素后能得到的最多元素个数27. Memo *C = new Memo[n]; //C[i]代表从A[i]到A[n-1]满⾜降序剔除部分元素后能得到的最多元素个数28. B[0].maxlen = 1; //由于B[i]由前向后构造初始化最前⾯的⼦问题 (元素本⾝就是⼀个满⾜升序降序的序列)29. C[n-1].maxlen = 1; //同样C[i]由后向前构造30.for (int i=0; i31.//⽤于在跟踪路径时终⽌递归或迭代(因为我们并不知道最终队列从哪⾥开始)32. {33. B[i].prev = -1;34. C[i].prev = -1;35. }36.37.for (i=1; i38. {39.int max=1;40.for (int j=i-1; j>=0; j--) //查看前⾯的⼦问题找出满⾜条件的最优解并且记录41. {42.if (A[j]max)43. {44. max = B[j].maxlen+1; //跟踪当前最优解45. B[i].prev = j; //跟踪构造路径46. }47. }48. B[i].maxlen = max; //构造最优解49. }50.51.for (i=n-1; i>0; i--)52. {53.int max=1;54.for (int j=i; j解时可以直接⽤B[i]+C[i]-155.//否则我们得到的最优解始终为B[n-1]+C[n-1]56. {57.if (A[j]max) //⽐当前长度更长记录并构造58. {59. max = C[j].maxlen+1;60. C[i].prev = j;61. }62. }63. C[i].maxlen = max;64. }65.66.//遍历i 得到最⼤的B[i]+C[i]-1(-1是因为我们在B[i]和C[i]中均加上了A[i]这个数因此需要减去重复的)67.int maxQuence = 0; //记录当前最优解68.int MostTall; //记录i ⽤于跟踪构造路径69.for (i=0; i70. {71.if (B[i].maxlen+C[i].maxlen-1 > maxQuence)72. {73. maxQuence = B[i].maxlen+C[i].maxlen-1;74. MostTall = i;75. }76. }77.78. cout<<"最⼤合唱队形长度: "<79.80.//B由前向后构造因此prev指向前⾯的元素需要递归输出81. Display( A, B, MostTall);82.//C的prev指向后⾯元素直接迭代输出83.while (C[MostTall].prev != -1)84. {85. MostTall = C[MostTall].prev;86. cout<87. }88. cout<89.90.delete []B;91.delete []C;92.}93.int main()94.{95.//测试96.int *A;97.int n;98. cout<<"请输⼊合唱队员个数: "<99. cin>>n;100.101. A = new int[n];102. cout<<"输⼊队员⾝⾼ :"<103.for (int i=0; i104. {105. cin>>A[i];106. }107. GetBestQuence(A, n);108.delete []A;109.return 0;110.}5-7买票问题状态转移⽅程是f[i] := min(f[i - 1] + t[i], f[i - 2] + r[i - 1]); {i = 2 ~ n} 初值f[0] := 0; f[1] := t[1]; constmaxn = 1000;vari, j, n : longint;f, t, r : array[0..maxn] of longint;function min(a, b : longint) : longint;begin if a < b then exit(a); exit(b); end;beginreadln(n);for i := 1 to n do read(t[i]);for i := 1 to n - 1 do read(r[i]);f[0] := 0; f[1] := t[1];for i := 2 to n dof[i] := min(f[i - 1] + t[i], f[i - 2] + r[i - 1]);writeln(f[n]);end.伪代码BuyTicks(T, R)1n ← length[T]2f[0] ← 03f[1] ← T[1]4for i ← 2to n do5f[i] ← f[i-2]+R[i-1]6if f[i] > f[i-1]+T[i] then7f[i] ← f[i-1]+T[i]8return f5-8最⼤⼦段和问题#include#includeintmax_sum(intn,int *a,int *besti,int *bestj){ int *b = (int *)malloc(n * sizeof(int));int sum = 0;int i = -1;int temp = 0;for (i=0;i<=n-1;i++) {if (temp > 0)temp += a[i];elsetemp = a[i];b[i] = temp;}sum = b[0];for (i=1;i<=n-1;i++) {if (sum < b[i]) {sum = b[i];*bestj = i;}}for (i = *bestj;i>= 0;i--) {if (b[i] == a[i]) {*besti = i;break;}}free(b);return sum;}int main(void){int a[] = {-2,1,-4,13,-5,-2,-10,20,100};int length = sizeof(a)/sizeof(int);intbesti = -1;intbestj = -1;sum = max_sum(length,a,&besti,&bestj);printf("besti = %d,bestj = %d,max_sum=%d\n",besti,bestj,sum); return 0;}5-9 装箱问题发现就是0-1背包问题每个物品的体积就是花费同时也是价值,也就是说这题可以转化为在总体积为w下,可以得到最⼤的价值最后⽤总体积减去最⼤的价值就是剩下最少的空间状态转移⽅程d[j] = max(d[j], d[j - a[i]] + a[i]);第⼆⾏为⼀个整数,表⽰有n个物品;接下来n⾏,每⾏⼀个整数表⽰这n个物品的各⾃体积。
黄宇《算法设计与分析》课后习题解析(二)精选全文

黄宇《算法设计与分析》课后习题解析(⼆)第2章:从算法的视⾓重新审视数学的概念2.1:(向下取整)题⽬:请计算满⾜下⾯两个条件的实数的区间解析:根据向下取整的含义,令,讨论a的取值范围即可解答:令,则可得:即:故的取值区间为:2.2: (取整函数)题⽬:证明:对于任意整数,(提⽰:将n划分为)。
解析:根据提⽰将n进⾏划分,根据取整函数的定义⽤k表⽰取整函数,即可证明;证明如下:因为对于任意整数,可划分为,则:① ;② ;综上:对于任意整数,, 得证;2.3: (斐波拉契数列)对于斐波拉契数列,请证明:1)题⽬:是偶数当且仅当n能被3整除解析:由斐波拉契数列的递归定义式,容易联想到数学归纳法;证明如下:(采⽤数学归纳法)i)当n = 1,2,3时,依次为1,1,2,符合命题;ii)假设当(k>=1)时命题均成⽴,则:① 当n = 3k+1时,是奇数,成⽴;② 当n = 3k+2时,是奇数,成⽴;③ 当 n = 3(k+1)时,是偶数,成⽴;综上:归纳可得为偶数当且仅当,得证;2)题⽬:x x =1+a (0<a <1)x =1+a (0<a <1)⌊x ⌋=1⇒⌊x ⌋=21⌊x ⌋=2⌊1+a +22a ⌋=1a +22a <1⇒0<a <−21⇒1<a +1<⇒21<x <2x (1,)2n ≥1⌈log (n +1)⌉=⌊logn ⌋+12≤k n ≤2−k +11n ≥12≤k n ≤2−k +11k +1=⌈log (2+k 1)⌉≤⌈log (n +1)⌉≤⌈log (2)⌉=k +1k +1=>⌈log (n +1)⌉=k +1k =⌊log (2)⌋≤k ⌊logn ⌋≤⌊log (2−k +11)⌋=k =>⌊logn ⌋=k n ≥1⌈log (n +1)⌉=k +1=⌊logn ⌋+1F n F n n ≤3k F =n F +n −1F =n −2F +3k F =3k −1>F 3k +1F =n F +3k +1F =3k >F 3k +2F =n F +3k +2F =3k +1>F 3k +3F n 3∣n F −n 2F F =n +1n −1(−1)n +1解析:同1)理,容易联想到数学归纳法证明如下:(采⽤数学归纳法)i)当n = 2时,, 易知成⽴;ii)假设当 n = k 时命题成⽴,① 若k = 2m, 则,当n = k+1 = 2m+1时,要证命题成⽴,即证: => ,代⼊递推式, 得:, 易知是恒等式,故命题成⽴;②当 k=2m+1时,同①理可证命题成⽴;综上:归纳可得,得证;2.4:(完美⼆叉树)给定⼀棵完美⼆叉树,记其节点数为,⾼度为,叶节点数为,内部节点数为1)题⽬:给定上述4个量中的任意⼀个,请推导出其他3个量解析:根据完美⼆叉树的结构特点易得解答:(仅以已知⾼度h推导其他三个量为例,其余同理)已知⾼度为h,可得:节点数:叶节点数:内部节点数:2)题⽬:请计算完美⼆叉树任意⼀层的节点个数:① 如果任意指定深度为的⼀层节点,请计算该层节点个数;② 如果任意指定⾼度为的⼀层节点,请计算该层节点个数;解析:根据完美⼆叉树的结构特点易得(注意节点深度和节点⾼度是互补的,相加为树⾼)解答:① ; ② ;2.5: (⼆叉树的性质)对于⼀棵⾮空的⼆叉树T,记其中叶节点的个数为,有1个⼦节点的节点个数为,有两个⼦节点的节点个数为1)题⽬:如果T是⼀棵2-tree,请证明。
《算法分析与设计》练习题一答案.docx

《算法分析与设计》练习题一答案1.程序书写格式应该遵循哪四个原则?参考答案:(1)正确使用缩进:一定要有缩进,否则代码的层次不明显。
(2)在一行内只写一条语句。
(3), '}'位置不可随意放置。
(4)变量和运算符之间最好加1个空格2.什么是算法?参考答案:用计算机解决问题的过程可以分成三个阶段:分析问题、设计算法和实现算法。
算法可以理解为冇基本运算及规定的运算顺序所构成的完整的解题步骤,它是求解问题类的、机械的、统一的方法,它由有限多个步骤组成,对于问题类屮每个给定的具体问题,机械地执行这些步骤就可以得到问题的解答。
或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
3.什么是线性结构?什么是非线性结构?参考答案:线性结构:数据逻辑结构屮的一类。
它的特征是若结构为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所冇结点都冇R只冇一个直接前趋和一个直接后继。
线性表就是一个典型的线性结构。
栈、队列、串等都是线性结构。
非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接而趋和直接后继。
数组、广义表、树和图等数据结构都是非线性结构。
4.已知二叉树后序遍丿力序列是DABEC,屮序遍丿力序列是DEBAC,则前序遍历序列是什么?参考答案:前序遍历序列是CEDBA5.什么是数制?参考答案:数制是人们利用符号进行计数的一种科学方法。
数制也称计数制,是用一组固定的符号和统一的规则來表示数值的方法。
6.如果将十进制数106转换为八进制数,结果是多少?参考答案:1527.请问查找算法的效率用什么进行度量?参考答案:平均查找长度ASL:在查找其关键字等于给定值的过程小,需要和给定值进行比较的关键字个数的期望值称为查找成功吋的平均查找长度。
AS厶=£皿/=1其屮,n是结点的个数;是杳找第i个结点的概率,是找到第i个结点所需要的比较次数。
算法分析与设计(习题答案)

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
《算法分析与设计》作业答案

《算法分析与设计》作业1、考虑,10≤≤i x 而不是x i ∈{0,1}的连续背包问题。
一种可行的贪婪策略是:按价值密度非递减的顺序检查物品,若剩余容量能容下正在考察的物品,将其装入;否则,往背包内装如此物品的一部分。
(a) 对于n=3,w=[100,10,10],p=[20,15,15],以及c=105,上述装入法获得结果是什么?(b)证明这种贪婪算法总能获得最优解。
(c) 用伪代码描述此算法。
答:(a )利用贪婪算法,按价值密度考察的背包为w2,w3,w1;背包w2和w3重20,还可以容纳85,由于10≤≤i x ,背包w1还可以装入x1=0.85,则背包内物品总价值为15+15+20*0.85=47.(b )假设已按价值密度排好序,考察w1,w2,……,wi ,……,对应的价值为p1,p2,……,pi,……如果装到pi-1再装pi 时,恰好要取xi 个wi 。
(,10≤≤i x ) 因为比它价值密度大的都已装载完,所以此时获得的为最优解。
(c )算法描述如下: template <class T>int ContainerLoading( int x[], T w[], T c, int n ) {int *t = new int[n+1]; IndirectSort(w, t, n); for( int i=1; i<=n; i++) x[i] = 0;for(i=1; i<=n && w[t[i]]<=c; i++){ x[t[i]] = 1; c += w[t[i]]; } delete []t; }2、证明当且仅当二分图没有覆盖时,下述算法找不到覆盖。
m=0; //当前覆盖的大小对于A中的所有i,New[i]=Degree[i]对于B中的所有i,Cov[i]=falsewhile(对于A中的某些i,New[i]>0) {设v是具有最大的New[i]的顶点;C[m++]=v;for(所有邻接于v的顶点j) {If(!Cov[j]) {Cov[j] = true;对于所有邻接于j的顶点,使其New[k]减1}}}if (有些顶点未被覆盖) 失败else 找到一个覆盖2)给出一个具有覆盖的二分图,使得上述算法找不到最小覆盖。
算法分析与设计第二版习题答案-第三章到第五章

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-
算法分析与设计中国大学mooc课后章节答案期末考试题库2023年

算法分析与设计中国大学mooc课后章节答案期末考试题库2023年1.任何多项式时间算法都是好算法,都是有效的。
参考答案:错误2.选择排序的时间复杂度是O(____)参考答案:n^23.子集生成方法有()参考答案:增量构造法_位向量法_二进制法4.冒泡排序的时间复杂度为W(n^2)参考答案:错误5.二进制法生成子集,子集与运算可以生成并集参考答案:错误6.下面不是证明贪心算法证明方法的有()。
参考答案:优化7.使目标函数最大(小)的解是问题的()参考答案:最优解8.对于稠密图,使用()算法计算MST更适合参考答案:Prim9.区间调度问题贪心算法的时间复杂度是()参考答案:O(nlogn)10.最小生成树问题可以使用的算法有()参考答案:Kruskal_Solim_Prim11.问题的可行解是满足约束条件的解参考答案:正确12.贪心算法的思想是寻求局部最优解,逐步达到全局最优解参考答案:正确13.贪心算法总能找到可行解,并且是最优解。
参考答案:错误14.负权的最短路问题可以使用Dijkstra算法计算。
参考答案:错误15.设S是顶点子集,e是正好一个端点在S中的边中的最小边,那么最小生成树中肯定包含e.参考答案:正确16.递归函数的要素是()参考答案:边界条件_递归方程17.T(n) = T(n-1) + n ,T(1)=1,则 T(n) =()参考答案:n(n+1)/2_W(n^2)_Q(n^2)_(n^2)18.递归算法是直接或间接地调用自身的算法。
参考答案:正确19.递归是从简单问题出发,一步步的向前发展,最终求得问题,是正向的。
参考答案:错误20.每个递归算法原则上总可以转换成与它等价的迭代算法,反之不然。
参考答案:错误21.设有5000个无序的元素,希望用最快的速度挑选出其中前10个最大的元素,最好选用( )法。
参考答案:冒泡排序22.找n个元素的中位数的分治算法的时间复杂度为O(___).参考答案:n23.军事上迂回包围、穿插分割、各个歼灭是()思想。
算法设计与分析书后参考答案

参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
算法分析与设计(参考题及答案

A、找出最优解的性质 B、构造最优解
C、算出最优解 D、定义最优解
答案:A
27.对完全二叉树自顶向下,从左向右给节点编号,节点编号为10的父节点编号为( ).
A、0 B、2 C、4 D、6
答案:C
28.下面哪种函数是回溯法中为避免无效搜索采取的策略()
3.贪婪技术并不能够总是找到最优解。
A、正确 B、错误 答案:正确
4.对于任何权重的图,Dijkstra算法总能产生一个正确的解。
A、正确 B、错误 答案:错误
5.对于给定的字符表及其出现的概率,哈夫曼编码是唯一的。
A、正确 B、错误 答案:错误
6.贪婪算法是在每一步中,“贪婪”地选择最佳操作,并希望通过一系列局部的最优选择, 能产生一个整个问题的最优解。
一、单选题 1.下列函数关系随着输入量增大增加最快的是( )
A、log2n B、n2 C、2n D、n!
答案:C
2.实现循环赛日程表利用的算法是()。
A、分治策略 B、动态规划法 C、贪心法 D、回溯法
答案:A
3.最长公共子序列算法利用的算法是()。
A、分支界限法 B、动态规划法 C、贪心法 D、回溯法
答案:某个问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
3.简述动态规划方法所运用的最优化原理。
答案:“最优化原理”用数学化的语言来描述:假设为了解决某一优化问题,需要依次作出n个决策D1,D2,…,Dn,如若这 个决策序列是最优的,对于任何一个整数k,1<k<n,不论前面k个决策是怎样的,以后的最优决策只取决于由前面决策所确定 的当前状态,即以后的决策Dk+1,Dk+2,…,Dn也是最优的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法分析与设计》作业参考答案
作业一
一、名词解释:
1.递归算法:直接或间接地调用自身的算法称为递归算法。
2.程序:程序是算法用某种程序设计语言的具体实现。
二、简答题:
1.算法需要满足哪些性质?简述之。
答:算法是若干指令的有穷序列,满足性质:
(1)输入:有零个或多个外部量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令清晰、无歧义。
(4)有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。
2.简要分析分治法能解决的问题具有的特征。
答:分析分治法能解决的问题主要具有如下特征:
(1)该问题的规模缩小到一定的程度就可以容易地解决;
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3)利用该问题分解出的子问题的解可以合并为该问题的解;
(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
3.简要分析在递归算法中消除递归调用,将递归算法转化为非递归算法的方法。
答:将递归算法转化为非递归算法的方法主要有:
(1)采用一个用户定义的栈来模拟系统的递归调用工作栈。
该方法通用性强,但本质上还是递归,
只不过人工做了本来由编译器做的事情,优化效果不明显。
(2)用递推来实现递归函数。
(3)通过Cooper 变换、反演变换能将一些递归转化为尾递归,从而迭代求出结果。
后两种方法在时空复杂度上均有较大改善,但其适用范围有限。
三、算法编写及算法应用分析题:
1.冒泡排序算法的基本运算如下:
for i ←1 to n-1 do
for j ←1 to n-i do
if a[j]<a[j+1] then
交换a[j]、a[j+1];
分析该算法的时间复杂性。
答:排序算法的基本运算步为元素比较,冒泡排序算法的时间复杂性就是求比较次数与n 的关系。
(1)设比较一次花时间1;
(2)内循环次数为:n-i 次,(i=1,…n ),花时间为:
∑-=-=i
n j i n 1)(1 (3)外循环次数为:n-1,花时间为:
2.设计一个分治算法计算一棵二叉树的高度。
答:算法思想:对于二叉树T ,若为空树,则其高度为0;否则,分别求其左子树和右子树的高度,最
大者加1 即为树T 的高度。
其描述如下:
)1(2)()(1
-=-=∑=n n i n n T n i
int BTLength(BT T)
//为了便于描述,假定二叉树类型为BT。
T 的左子树为T.lchild,右子树为T.rchild。
{
if(T= =NULL) return 0; //T为空树
return max(BTLength(T.lchild),BTLength(T.rchild)) +1
}
3.设计一个分治算法来判定给定的两棵二叉树T1 和T2 是否相同。
答:算法思想:对于两棵二叉树T1 和T2,若其根结点值相同,且其左右子树分别对应相同,则T1=T2;否则T1≠T2。
其描述如下:
boolean BTEQUAL(BT T1,BT T2)
//为了便于描述,假定二叉树类型为BT。
二叉树T的左子树为T.lchild,右子树为T.rchild。
二叉树T的根结点值T.data。
{
if(T1= =NULL&& T2= =NULL) return True; //均为空树
if(T1&&T2&&T1.data==T2.data&&BTEQUAL(T1.lchild,T2.lchild)&&BTEQUAL (T1.rchild, T2.rchild))
return True;
return False;
}
4.给出一个分治算法来找出n 个元素的序列中的第2大元素,并分析算法的时间复杂度。
答:算法思想:当序列A[1..n]中元素的个数n=2 时,通过直接比较即可找出序列的第2 大元素。
当n>2 时,先求出序列A[1..n-1]中的第1 大元素x1 和第2 大元素x2;然后,通过2次比较即可在三个元素x1x2 和A[n]中找出第2 大元素,该元素即为A[1..n]中的第2 大元素。
算法描述如下:
SecondElement(A[low..high],max1,max2)
{//假设主程序中调用该过程条件为high-low>=2
if(hight-low= =2)
{
if(A[low]<A[hight]){max2= A[low];max1=A[high];}
else {max2= A[high];max1=A[low];}
}
else
{
SecondElement(A[low..high],x1,x2);
if(x1<=A[n]) { max2=max1; max1=A[n];}
else if(x2>=A[n]) { max2=x2; max1=x1; }
else { max2=A[n]; max1=x1; }
}
}
该算法的时间复杂度满足如下递归方程:T(n)=T(n-1)+2;T(2)=1。
解得T(n)=2n-3。