算法设计与分析基础课后习题答案
算法设计与分析-课后习题集答案

第一章3. 最大公约数为1。
快1414倍。
程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。
(log )n O 。
(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执行次数为。
O 。
(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。
2()n O 。
10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。
(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。
(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。
11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。
可选 1c =,04n =。
算法设计与分析第二版课后习题解答

算法设计与分析第二版课后习题解答算法设计与分析基础课后练习答案习题 4.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求//输入:一个正整数n2//输出:。
step1:a=1;step2:若a*a 5. a.用欧几里德算法求gcd。
b. 用欧几里德算法求gcd,比检查min{m,n}和gcd间连续整数的算法快多少倍?请估算一下。
a. gcd(31415, 14142) = gcd(14142, 3131) = gcd(3131, 1618) =gcd(1618, 1513) = gcd(1513,105) = gcd(1513, 105) = gcd(105, 43) =gcd(43, 19) = gcd(19, 5) = gcd(5, 4) = gcd(4, 1) = gcd(1, 0) = 1.b.有a可知计算gcd欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142 和 2·14142之间,所以欧几里德算法比此算法快1·14142/11 ≈ 1300 与 2·14142/11 ≈ 2600 倍之间。
6.证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次? Hint:对于任何形如0 gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次) b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次) gcd(5,8) 习题 1.(农夫过河)P—农夫 W—狼G—山羊C—白菜 2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数) 算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法 //输入:实系数a,b,c//输出:实根或者无解信息 If a≠0D←b*b-4*a*c If D>0temp←2*ax1←(-b+sqrt(D))/temp x2←(-b-sqrt(D))/temp return x1,x2else if D=0 return –b/(2*a) else return “no real roots” else //a=0if b≠0 return –c/b else //a=b=0if c=0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法 a.用文字描述 b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n 第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出 b.伪代码算法 DectoBin(n)//将十进制整数n转换为二进制整数的算法 //输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中 i=1while n!=0 do { Bin[i]=n%2; n=(int)n/2; i++; } while i!=0 do{ print Bin[i]; i--; }9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进. 算法 MinDistance(A[0..n-1]) //输入:数组A[0..n-1] //输出:the smallest distance d between two of its elements习题1. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.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章习题7.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n)∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
算法设计与分析基础课后习题答案solu4

C(2k) = 2C(2k−1) + 1 = 2[2C(2k−2) + 1] + 1 = 22C(2k−2) + 2 + 1 = 22[2C(2k−3) + 1] + 2 + 1 = 23C(2k−3) + 22 + 2 + 1 = ... = 2iC(2k−i) + 2i−1 + 2i−2 + ... + 1 = ... = 2kC(2k−k) + 2k−1 + 2k−2 + ... + 1 = 2k − 1 = n − 1.
Design a divide-and-conquer algorithm for this problem.
2
Hints to Exercises 4.1
1. In more than one respect, this question is similar to the divide-and-conquer computation of the sum of n numbers. Also, you were asked to analyze an almost identical algorithm in Exercises 2.4.
b. Set up and solve a recurrence relation for the number of multiplications made by this algorithm.
c. How does this algorithm compare with the brute-force algorithm for this problem?
算法设计与分析基础课后习题答案solu2

3
Hints to Exercises 2.1
1. The questions are indeed as straightforward as they appear, though some of them may have alternative answers. Also, keep in mind the caveat about measuring an integer’s size. 2. a. The sum of two matrices is defined as the matrix whose elements are the sums of the corresponding elements of the matrices given. b. Matrix multiplication requires two operations: multiplication and addition. Which of the two would you consider basic and why? 3. Will the algorithm’s efficiency vary on different inputs of the same size? 4. a. Gloves are not socks: they can be right-handed and left-handed. b. You have only two qualitatively different outcomes possible. the number of ways to get each of the two. Count
算法设计与分析-课后习题集答案

(2)当 时, ,所以,可选 , 。对于 , ,所以, 。
(3)由(1)、(2)可知,取 , , ,当 时,有 ,所以 。
11. (1)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(2)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(3)因为 , 。当 时, , 。所以,可选 , ,对于 , ,即 。
第二章
2-17.证明:设 ,则 。
当 时, 。所以, 。
第五章
5-4.SolutionType DandC1(int left,int right)
{while(!Small(left,right)&&left<right)
{int m=Divide(left,right);
所以n-1<=m<=n (n-1)/2;
O(n)<=m<=O(n2);
克鲁斯卡尔对边数较少的带权图有较高的效率,而 ,此图边数较多,接近完全图,故选用普里姆算法。
10.
T仍是新图的最小代价生成树。
证明:假设T不是新图的最小代价生成树,T’是新图的最小代价生成树,那么cost(T’)<cost(T)。有cost(T’)-c(n-1)<cost(t)-c(n-1),即在原图中存在一颗生成树,其代价小于T的代价,这与题设中T是原图的最小代价生成树矛盾。所以假设不成立。证毕。
13.template <class T>
select (T&x,int k)
{
if(m>n) swap(m,n);
if(m+n<k||k<=0) {cout<<"Out Of Bounds"; return false;}
算法设计与分析课后习题解答

C1*(g1+g2)<= t1(n)+t2(n) <=c2(g1+g2)—----(3)
不失一般性假设max(g1(n),g2(n))=g1(n)。
显然,g1(n)+g2(n)<2g1(n),即g1+g2〈2max(g1,g2)
又g2(n)〉0,g1(n)+g2(n)>g1(n),即g1+g2>max(g1,g2).
算法设计与分析基础课后练习答案
习题1.1
4。设计一个计算 的算法,n是任意正整数。除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求
//输入:一个正整数n 2
//输出:。
step1:a=1;
step2:若a*a<n转step 3,否则输出a;
step3:a=a+1转step 2;
5. a.用欧几里德算法求gcd(31415,14142)。
b。该算法稳定吗?
c.该算法在位吗?
解:
a。该算法对列表”60,35,81,98,14,47”排序的过程如下所示:
b.该算法不稳定.比如对列表"2,2*”排序
c.该算法不在位.额外空间for S and Count[]
4.(古老的七桥问题)
第2章
习题2。1
7。对下列断言进行证明:(如果是错误的,请举例)
Else return A[n—1]
a.该算法计算的是什么?
b.建立该算法所做的基本操作次数的递推关系并求解
解:
a.计算的给定数组的最小值
b.
9。考虑用于解决第8题问题的另一个算法,该算法递归地将数组分成两半。我们将它称为Min2(A[0..n-1])
算法设计与分析基础课后习题答案solu8

1. a. Both techniques are based on dividing a problem’s instance into smaller instances of the same problem. b. Typically, divide-and-conquer divides an instance into smaller instances with no intersection whereas dynamic programming deals with problems in which smaller instances overlap. Consequently, divide-and-conquer algorithms do not explicitly store solutions to smaller instances and dynamic programming algorithms do. 2. a. 0 1 2 3 4 5 6 0 1 1 1 1 1 1 1 1 1 2 3 4 5 6 2 3
This file contains the exercises, hints, and solutions for Chapter 8 of the book ”Introduction to the Design and Analysis of Algorithms,” 2nd edition, by A. Levitin. The problems that might be challenging for at least some students are marked by ; those that might be difficult for a majority of students are marked by .
田翠华著《算法设计与分析》课后习题参考答案

参考答案第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)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易2 算法设计与分析纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
算法设计与分析书后参考答案

参考答案第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)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
算法分析与设计基础 习题答案[第1版]
![算法分析与设计基础 习题答案[第1版]](https://img.taocdn.com/s3/m/b23216c1856a561252d36f3b.png)
算法分析与设计基础习题答案[第1版]习题1.15..证明等式gcd(m,n=gcd(n,m mod n对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:● 如果d整除u和v, 那么d一定能整除u±v;● 如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n和(n,r具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n=gcd(n,r6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m 的一对数字 ,Euclid 算法在第一次叠代时交换 m 和 n, 即gcd(m,n=gcd(n,m并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次gcd(5,8习题1.21.(农夫过河P—农夫 W—狼 G—山羊 C—白菜2.(过桥问题1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x是求平方根的函数算法Quadratic(a,b,c//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D/tempx2←(-b-sqrt(D/tempreturn x1,x2else if D=0 return –b/(2*aelse return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...,商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBin(n//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(intn/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略对这个算法做尽可能多的改进.算法 MinDistance(A[0..n-1]//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.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.(古老的七桥问题习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1<=i<=nb.删除有序数组的第i个元素(依然有序hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array’s element(e.g., 0 for an array of positive numbers to mark the i th position is empty. (“lazy deletion”第2章习题2.17.对下列断言进行证明:(如果是错误的,请举例a. 如果t(n∈O(g(n,则g(n∈Ω(t(nb.α>0时,Θ(αg(n= Θ(g(n解:a. 这个断言是正确的。
算法设计与分析习题答案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]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计与分析基础第二版课后答案

算法设计与分析基础第二版课后答案【篇一:算法设计与分析基础课后习题答案(中文版)】class=txt>习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立. hint:根据除法的定义不难证明:?如果 d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n 和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次? hint:对于任何形如0=mgcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.2 1.(农夫过河)p—农夫w—狼 g—山羊 c—白菜 2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数) 算法quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法 //输入:实系数a,b,c//输出:实根或者无解信息if a≠0d←b*b-4*a*c if d0temp←2*ax1←(-b+sqrt(d))/temp x2←(-b-sqrt(d))/temp return x1,x2else if d=0 return –b/(2*a) else return “no real roots” else //a=0 if b≠0 return –c/b else //a=b=0if c=0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法 a.用文字描述 b.用伪代码描述解答: a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给ki(i=0,1,2...),商赋给n 第二步:如果n=0,则到第三步,否则重复第一步第三步:将ki按照i从高到低的顺序输出b.伪代码算法 dectobin(n)//将十进制整数n转换为二进制整数的算法 //输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组bin[1...n]中 i=1 while n!=0 do { bin[i]=n%2; n=(int)n/2; i++; }while i!=0 do{ print bin[i]; i--; }9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进. 算法 mindistance(a[0..n-1]) //输入:数组a[0..n-1]//输出:the smallest distance d between two of its elements习题1.31. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.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.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i个元素(1=i=n)b.删除有序数组的第i个元素(依然有序) hints:a. replace the ith element with the last element and decreasethe array size of 1b. replace the ith element with a special symbol that cannot be a value of the arr ay’s element(e.g., 0 for an array of positive numbers ) to mark the ith position is empty. (―lazy deletion‖)第2章习题2.1a. 这个断言是正确的。
算法设计与分析-课后习题集答案

第一章3. 最大公约数为1。
快1414倍。
程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。
(log )n O 。
(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执行次数为。
O 。
(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。
2()n O 。
10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。
(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。
(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。
11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。
可选 1c =,04n =。
算法分析与设计基础 习题答案[第1版]
![算法分析与设计基础 习题答案[第1版]](https://img.taocdn.com/s3/m/b23216c1856a561252d36f3b.png)
算法分析与设计基础习题答案[第1版]习题1.15..证明等式gcd(m,n=gcd(n,m mod n对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:● 如果d整除u和v, 那么d一定能整除u±v;● 如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n和(n,r具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n=gcd(n,r6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m 的一对数字 ,Euclid 算法在第一次叠代时交换 m 和 n, 即gcd(m,n=gcd(n,m并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次gcd(5,8习题1.21.(农夫过河P—农夫 W—狼 G—山羊 C—白菜2.(过桥问题1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x是求平方根的函数算法Quadratic(a,b,c//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D/tempx2←(-b-sqrt(D/tempreturn x1,x2else if D=0 return –b/(2*aelse return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...,商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBin(n//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(intn/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略对这个算法做尽可能多的改进.算法 MinDistance(A[0..n-1]//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31. 考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.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.(古老的七桥问题习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1<=i<=nb.删除有序数组的第i个元素(依然有序hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array’s element(e.g., 0 for an array of positive numbers to mark the i th position is empty. (“lazy deletion”第2章习题2.17.对下列断言进行证明:(如果是错误的,请举例a. 如果t(n∈O(g(n,则g(n∈Ω(t(nb.α>0时,Θ(αg(n= Θ(g(n解:a. 这个断言是正确的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Program算法设计与分析基础中文版答案习题5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次..对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.(农夫过河)P—农夫 W—狼 G—山羊 C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBin(n).n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略)对这个算法做尽可能多的改进.算法 MinDistance(A[0..n-1])n-1]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.(古老的七桥问题)习题1.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度.a.删除数组的第i个元素(1<=i<=n)b.删除有序数组的第i个元素(依然有序)hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array’s element., 0 for an array of positive numbers ) to mark the i th position is empty. (“lazy deletion”)第2章习题7.对下列断言进行证明:(如果是错误的,请举例)a. 如果t(n)∈O(g(n),则g(n)∈Ω(t(n))b.α>0时,Θ(αg(n))= Θ(g(n))解:a. 这个断言是正确的。
它指出如果t(n)的增长率小于或等于g(n)的增长率,那么 g(n)的增长率大于或等于t(n)的增长率由 t(n)≤c ·g(n) for all n ≥n0, where c>0则:)()()1(n g n t c≤ for all n ≥n0 b. 这个断言是正确的。
只需证明))(())(()),(())((n g n g n g n g ααΘ⊆ΘΘ⊆Θ。
设f(n)∈Θ(αg(n)),则有:)()(n g c n f α≤ for all n>=n0, c>0)()(1n g c n f ≤ for all n>=n0, c1=c α>0即:f(n)∈Θ(g(n))又设f(n)∈Θ(g(n)),则有:)()(n cg n f ≤ for all n>=n0,c>0)()()(1n g c n g c n f ααα=≤for all n>=n0,c1=c/α>0即:f(n)∈Θ(αg(n)) 8.证明本节定理对于下列符号也成立:a.Ω符号b.Θ符号证明:a 。
we need to proof that if t 1(n)∈Ω(g 1(n)) and t 2(n)∈Ω(g 2(n)), then t 1(n)+ t 2(n)∈Ω(max{g 1(n), g 2(n)})。
由 t 1(n)∈Ω(g 1(n)),t 1(n)≥c 1g 1(n) for all n>=n1, where c1>0由 t 2(n)∈Ω(g 2(n)),T 2(n)≥c 2g 2(n) for all n>=n2, where c2>0那么,取c>=min{c1,c2},当n>=max{n1,n2}时:t 1(n)+ t 2(n)≥c 1g 1(n)+ c 2g 2(n)≥c g 1(n)+c g 2(n)≥c[g 1(n)+ g 2(n)] ≥cmax{ g 1(n), g 2(n)}所以以命题成立。
b. t 1(n)+t 2(n) ∈Θ()))(2),(1max(n g n g证明:由大Ⓗ的定义知,必须确定常数c1、c2和n0,使得对于所有n>=n0,有:))(2),(1max()(2)(1))(2),(1max((1n g n g n t n t n g n g c ≤+≤ 由t 1(n)∈Θ(g1(n))知,存在非负整数a1,a2和n1使:a1*g1(n)<=t 1(n)<=a2*g1(n)-----(1)由t 2(n)∈Θ(g2(n))知,存在非负整数b1,b2和n2使:b1*g2(n)<=t 2(n)<=b2*g2(n)-----(2)(1)+(2): a1*g1(n)+ b1*g2(n)<=t1(n)+t2(n) <= a2*g1(n)+ b2*g2(n)令c1=min(a1,b1),c2=max(a2,b2),则C1*(g1+g2)<= t 1(n)+t 2(n) <=c2(g1+g2)-----(3)不失一般性假设max(g1(n),g2(n))=g1(n).显然,g1(n)+g2(n)<2g1(n),即g1+g2<2max(g1,g2) 又g2(n)>0,g1(n)+g2(n)>g1(n),即g1+g2>max(g1,g2)。
则(3)式转换为:C1*max(g1,g2) <= t 1(n)+t 2(n) <=c2*2max(g1,g2) 所以当c1=min(a1,b1),c2=2c2=2max(c1,c2),n0=max(n1,n2)时,当n>=n0时上述不等式成立。
证毕。
习题1. 解下列递推关系 (做a,b )a.解:b.解:2. 对于计算n!的递归算法F(n),建立其递归调用次数的递推关系并求解。
⎩⎨⎧=+-=0)1(5)1()(x n x n x ⎩⎨⎧=-=4)1()1(3)(x n x n x 当n>1时 当n>1时解:3.考虑下列递归算法,该算法用来计算前n个立方的和:S(n)=13+23+…+n3。
算法S(n)建立该算法的基本操作次数的递推关系并求解b. 如果将这个算法和直截了当的非递归算法比,你做何评价?解:a.7. a. 请基于公式2n=2n-1+2n-1,设计一个递归算法。
当n是任意非负整数的时候,该算法能够计算2n 的值。
b. 建立该算法所做的加法运算次数的递推关系并求解c. 为该算法构造一棵递归调用树,然后计算它所做的递归调用次数。
d. 对于该问题的求解来说,这是一个好的算法吗?解:a.算法power(n)∑=+-==nin inC1122)(8.考虑下面的算法算法 Min1(A[0..n-1])n-1]If n=1 return A[0]Else temp←Min1(A[0..n-2])If temp≤A[n-1] return tempElse return A[n-1]a.该算法计算的是什么?b.建立该算法所做的基本操作次数的递推关系并求解解:a.计算的给定数组的最小值算法SortAnalysis(A[0..n-1])n-1]解:应改为:算法SortAnalysis(A[0..n-1])n-1]a.设计一个蛮力算法,对于给定的x 0,计算下面多项式的值:P(x)=a n x n+a n-1x n-1+…+a 1x+a 0并确定该算法的最差效率类型.b.如果你设计的算法属于Θ(n 2),请你为该算法设计一个线性的算法.C.对于该问题来说,能不能设计一个比线性效率还要好的算法呢?解:a. Algorithms BruteForcePolynomialEvaluation(P[0..n],x)n]是多项式按低幂到高幂的常系数,以及定值xBetterBruteForcePolynomialEvaluation(P[0..n],x)n]是多项式按低幂到高幂的常系数,以及定值x)(22)(1n n n M ni Θ∈==∑=行.因为计算任意一个多项式在任意点x 的值,都必须处理它的n+1 个系数.例如: (x=1,p(x)=a n +a n-1+..+a 1+a 0,至少要做n 次加法运算)5.应用选择排序对序列example 按照字母顺序排序.6.选择排序是稳定的吗?(不稳定)7.用链表实现选择排序的话,能不能获得和数组版相同的Θ(n2)效率?operation —finding the smallest element and swapping it –can be done as efficiently with the linked list as with an array..请证明,如果对列表比较一遍之后没有交换元素的位置,那么这个表已经排好序了,算法可以停止了. b.结合所做的改进,为冒泡排序写一段伪代码.c.请证明改进的算法最差效率也是平方级的.Hints:a. 第i 趟冒泡可以表示为:如果没有发生交换位置,那么:BetterBubblesort(A[0..n-1])n-1]排序n-1]n-1]count ←n-1 10.冒泡排序是稳定的吗?(稳定)习题1. 对限位器版的顺序查找算法的比较次数:a. 在最差情况下b. 在平均情况下.假设成功查找的概率是p(0<=p<=1)Hints:a. C worst (n)=n+1b. 在成功查找下,对于任意的I,第一次匹配发生在第i 个位置的可能性是p/n,比较次数是i.在查找不成功时,比较次数是n+1,可能性是1-p.6.给出一个长度为n 的文本和长度为m 的模式构成的实例,它是蛮力字符串匹配算法的一个最差输入.并指出,对于这样的输入需要做多少次字符比较运算.Hints:文本:由n 个0组成的文本模式:前m-1个是0,最后一个字符是1比较次数: m(n-m+1)7.为蛮力字符匹配算法写一个伪代码,对于给定的模式,它能够返回给定的文本中所有匹配子串的数量.Algorithms BFStringmatch(T[0..n-1],P[0..m-1])n-1]—长度为n的文本,数组P[0..m-1]—长度为m的模式果所要搜索的模式包含一些英语中较少见的字符,我们应该如何修改该蛮力算法来利用这个信息. Hint:每次都从这些少见字符开始比较,如果匹配, 则向左边和右边进行其它字符的比较.M(1)=0当n>1时, C w(n)=C w(n/2)+1, C w(1)=1设递归的时间效率为T(n):对n=2k, 则: T(n)=2T(n/2)+c 利用主定理求解.T(n)=Θ(n)2.(题略).设计一个递归的减一算法,求n个实数构成的数组中最小元素的位置.b.确定该算法的时间效率,然后把它与该问题的蛮力算法作比较Algorithms MinLocation(A[0..n-1])n-1] of real numbersn-1]if n=1 return 0else temp←MinLocation(A[0..n-2])if A[temp]<A[n-1] return tempelse return n-1时间效率分析见习题中8C(n)=C(n-1)+1 for n>1 C(1)=04.应用插入排序对序列example按照字母顺序排序.对于插入排序来说,为了避免在内部循环的每次迭代时判断边界条件j>=0,应该在待排序数组的第一个元素前放一个什么样的限位器?b.带限位器版本和原版本的效率类型相同吗?解: a. 应该在待排序数组的第一个元素前放-∞或者小于等于最小元素值的元素.b.效率类型相同.对于最差情况(数组是严格递减):7.算法InsertSort2(A[0..n-1])for i←1 to n-1 doj←i-1while j>=0 and A[j]>A[j+1] doswap(A[j],A[j+1])j←j+1分析:在教材中算法InsertSort的内层循环包括一次键值赋值和一次序号递减,而算法InsertSort2的内层循环包括一次键值交换和一次序号递减,设一次赋值和一次序号递减的时间分别为c a和c d,那么算法InsertSort2和算法InsertSort运行时间的比率是(3c a+c d)/(c a+c d)习题.(略)b.4.1.DFS的栈状态:退栈顺序: efgbcad 拓扑排序: dacbgfeb.这是一个有环有向图.DFS 从a出发,…,遇到一条从e到a的回边.4.能否利用顶点进入DFS栈的顺序(代替它们从栈中退出的顺序)来解决拓扑排序问题? Hints:不能.5.对第1题中的有向图应用源删除算法.拓扑序列: dabcgef4.下面是生成排列的算法.算法HeapPermute(n)n]解:对于n=2for i=1 doheappermute(1){write A即12}这时n not odd, so do A[1]与A[2]互换,A=21for i=2 doheappermute(1){write A即21}对于n=3For i=1 doHeappermute(2){ heappermute(1) write A 即123 这时2 not odd,so,do A[1]与A[2]互换,A=213 heappermute(1) write A 即213这时 2 not odd, do A[2]与A[2]互换,A=213 }由于 3 is odd,so do A[1]与A[3]互换,A=312For i=2 doHeappermute(2){ heappermute(1) write A 即312这时2 not odd,so,do A[1]与A[2]互换,A=132 heappermute(1) write A 即132这时 2 not odd, do A[2]与A[2]互换,A=231 }由于 3 is odd,so do A[1]与A[3]互换,A=231For i=3 doHeappermute(2) { heappermute(1) write A 即231这时2 not odd,so,do A[1]与A[2]互换,A=321 heappermute(1) write A 即321这时 2 not odd, do A[2]与A[2]互换,A=321 }由于 3 is odd,so do A[1]与A[3]互换,A=123n=4的的情况:习题2.a.减常因子b.c.d.折半查找在最坏情况下的查找效率是log2n+1.而a.初始化C=A∩B=Φfor every element a i in A do (1<=i<=n)for every element b j in B (1<=j<=m)If a i=b jadd a i to Cdelete b j from B最差情况:C为空,比较的次数是nm.b.方法一:排序集合AFor every element b j in B用二分查找的办法在A中查找与b j相匹配的元素aIf 查找成功Add a to C效率分析:假设排序的效率是O(nlogn),则该算法效率O(nlogn)+mO(logn)=(n+m)O(logn)方法二:首先对A和B都分别排序.然后对A和B应用合并排序,只输出它们的公有元素.效率分析: 假设排序的效率是O(nlogn),则该算法效率O(nlogn)+O(mlogm)+Θ(n+m)=O(slogs) where s=max{n,m}首先将A和B合并为L排序L从左至右成对扫描LIf L i=L i+1Add L i to Ci←i+2效率分析: 假设排序的效率是O(nlogn),则该算法效率O((n+m)logn))+ Θ(n+m) =O(slogs) where s=max{n,m}a. 排序数组,然后返回它的第一和最后元素.假设排序的效率是O(nlogn),则该算法效率O(nlogn)+Θ(1)+Θ(1)= O(nlogn)b.蛮力和分治都是线性的,所以优于基于预排序的算法习题...二叉查找树中最大值和最小值分别是树中最右边和最左边的结点.因此,从根开始,沿着向左的路径一直走到这样的结点:它的左孩子为空.这个结点里的值就是最小值.同理,可以找到最大值.最后,这两个值做一次减法运算即可.算法的效率: Θ(logn)+ Θ(logn)+ Θ(1)= Θ(logn)b.错误.8.1.乘法总次数M(n)加法总次数A(n)。