算法设计技巧与分析答案上课讲义
- 格式:doc
- 大小:359.50 KB
- 文档页数:18
算法设计与分析课后答案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并且这种交换处理只发⽣⼀次.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//输出:实根或者⽆解信息D←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*a)else 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=(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 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(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断⾔是正确的。
算法分析与设计教程习题解答第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. 解:算法略。
算法设计技巧与分析习题参考答案习题4.13(b)元素最⼤交换次数:A9~A5 各1次;A4~A3 各2次;A2最多3次;A1最多4次最多共需16次元素交换4.13另解:考虑第i个节点,其⼦节点为2i,则最多可交换1次;若⼦节点有⼦节点22i, 则最多可交换2次;若…..有⼦节点i×2k, 则最多可交换k次;因此有i×2k≤ 19求出满⾜上述不等式的最⼤的k值即可。
i=1时, k=4;i=2时, k=3;i=3或4时, k=2;i=5~9时, k=1;因此最多交换4+3+2×2+1×5=16次6.5 ⽤分治法求数组A[1…n]元素和,算法的⼯作空间是多少?输⼊:数组A[1…n]输出:数组的所有元素之和∑A[i] {i=1…n}SUM(low, high)1.if high = low then2.return A[low]3.else4.mid←?(low+high)/2?5.s1←SUM(low,mid)6.s2←SUM(mid+1, high)7.return s1+s28.end if⼯作空间:mid~Θ(logn), s1&s2~Θ(1)(后序遍历树,不断释放空间,故为常数Θ(1)),总的⼯作空间为Θ(logn).6.6 ⽤分治法求元素x在数组A中出现的频次。
freq(A[low, high], x)1.if high=low then2.if A[low]=x then3.return 14.else5.return 06.end if7.else8.mid ←?(low+high)/2?9.f1 ←freq(A[low, mid])10.f2 ← freq(A[mid+1, high])11.return f1+f212.end if复杂度:T(n)=T(?n/2?)+ T(?n/2?)≈2T(n/2) (设2k≤n<2k+1) =…=2k T(n/2k) =2k T(1) = n6.16修改后的MERGESORT算法最⼤⽐较次数(1)/2()2(/2)1n n if n m T nT n n if n m-≤=?+->最⼩⽐较次数1()2(/2)/2n if n m C nC n n if n m-≤=?+>令n/2k=m≥2,展开可知:T(n)= 2k T(n/2k) + kn - (2k-1)= n/m×m(m-1)/2 + nlog(n/m)- n/m+1= n(m-1)/2 + nlog(n/m) -n/m+1若T(n)=Θ(nlogn), 其中表达式有nm, nlogn, nlogm, n/m等. 有n/m < nlogm < nm且须有nm=O(nlogn), i.e., nm ≤ c·nlogn, 则须有m≤c·logn. 可令c=1,则m≤logn. 另⼀⽅⾯,C(n) = 2k C(n/2k)+kn/2 = n/m×(m-1) + (n/2)log(n/m)= Θ(nlogn)6.35split(A[low,...high])1. x←A[low] //备份为x2. while (low3. while (low0) --high;4. A[low] ←A[high]5. while (low6.A[high] ←A[low]7.}8.A[low] ← x//这时, low=high7.3 动态规划法计算⼆项式系数knC ,并分析其时间复杂度。
算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,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. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
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(31415,14142)欧几里德算法做了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)具有相同的公约数的有限非空集,其中也包括了最大公约数。
算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,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. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
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(31415,14142)欧几里德算法做了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)具有相同的公约数的有限非空集,其中也包括了最大公约数。
算法设计技巧与分析参考答案第1章算法分析基本概念1.1(a)6 (b)5 (c)6 (d)61.4算法执行了7+6+5+4+3+2+1=28次比较1.5(a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。
(b) 算法MODSELECTIONSORT执行的元素赋值的最多次数是3(1)2n n ,元素已按非升序排列的时候达到最小值。
1.7由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。
1.11由上图可以得出比较次数为5+6+6+9=26次。
1.13FTF,TTT,FTF,TFF,FTF 1.16(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)不可以用Θ符号来表示算法的运行时间:Θ是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列,因此不能用这一符号表示。
1.27不能用关系来比较2n 和2100n 增长的阶。
∵221lim0100100n n n →∞=≠ 2n ∴不是2(100)o n 的,即不能用关系来比较2n 和2100n 增长的阶。
1.32(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 。
黄宇《算法设计与分析》课后习题解析(⼆)第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,请证明。
算法分析与设计教程习题解答第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章算法分析基本概念
1.1
(a)6 (b)5 (c)6 (d)6
1.4
算法执行了7+6+5+4+3+2+1=28次比较
1.5
(a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。
(b) 算法MODSELECTIONSORT 执行的元素赋值的最多次数是3(1)2
n n ,元素已按非升序排列的时候达到最小值。
1.7
由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。
1.11
由上图可以得出比较次数为5+6+6+9=26次。
1.13
FTF,TTT,FTF,TFF,FTF 1.16
(a) 执行该算法,元素比较的最少次数是n-1。
元素已按非降序排列时候达到最小值。
(b) 执行该算法,元素比较的最多次数是(1)2
n n -。
元素已
按非升序排列时候达到最大值。
(c) 执行该算法,元素赋值的最少次数是0。
元素已按非降序排列时候达到最小值。
(d) 执行该算法,元素赋值的最多次数是3(1)2
n n -。
元素已
按非升序排列时候达到最大值。
(e)n 用O 符号和Ω符号表示算法BUBBLESORT 的运行时间:2()t O n =,()t n =Ω
(f)不可以用Θ符号来表示算法的运行时间:Θ是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列,因此不能用这一符号表示。
1.27
不能用p 关系来比较2n 和2100n 增长的阶。
∵221
lim
0100100
n n n →∞=≠ 2n ∴不是2(100)o n 的,即不能用p 关系来比较2n 和2100n 增长
的阶。
1.32
(a)当n 为2的幂时,第六步执行的最大次数是:
12,2k k n j -==时,
1
1
[log ]log n n
i i k n n n ====∑∑
(b)由(a)可以得到:当每一次循环j 都为2的幂时,第六步执行的次数最大,
则当33,22k k
m
n j ===(其中
32
k 取整)时,
1
1
[log(3
1)]log(1)n n
k
i
i i m n n ===-=-∑∑
(c)用O 符号表示的算法的时间复杂性是(log )O n n 已证明n=2k 的情况,下面证明n=2k +1的情况:
因为有⎥⎦
⎥
⎢⎣⎢+=⎥⎦⎥⎢⎣⎢21222k k
所以n=2k +1时,第六步执行的最大次数仍是n log n 。
(d) 用Ω符号表示的算法的时间复杂性是()n
Ω。
当n满足/2
=取整为奇数时,算法执行的次数是n次,
j n
其他情况算法执行次数均大于n。
(e) O更适合表示算法的时间复杂性。
因为本算法时间复
杂性从()n
O n n,而Θ是表示精确阶的。
Ω到(log)
1.38
对n个数进行排序。
第5章归纳法
5.3(本题不仅有以下一个答案)
1.max(n)
过程:max(i)
if n=1 return a[1]
t=max(i-1)
if a[i-1]>t return a[i-1]
else return t
end if
5.6 最多次数:
0,1
()(1)(1),2n C n c n n n =⎧=⎨
-+-≥⎩
1(1)
()2
n
j n n C n j =-==
∑ 最少次数:
⎩
⎨
⎧
≥+-==2,1)1(1,0)(n n C n n C C(n)=n-1 5.7
参考例5.1 5.14
(a)不稳定,例如:
可见SELECTIONSORT 中相等元素的序在排序后改变。
(b)(c)(d)(f)稳定 5.17
(a)利用10()()n n P x xP x a -=+
取3x =,
543210(3)(3)(3)(3)(3)(3)P P P P P P →→→→→
21100(3)3*(3)437(3)3*(3)211(3)3P P P P P =+=←=+=←=
3243543*(3)1112(3)3*(3)2338(3)3*(3)51019
P P P P P P =+=→=+=→=+=5.18
(a) (2,5)(2,2)(2,1)(2,0)p p p p →→→
2224*2241*21y y y y =←==←=←=
第6章 分 治
6.3
输入:A[1,2,…n] 输出:max,min 1.for i=1 to mid 2. j=high-i
3. if a[i]>a[j], then exchange a[i],a[j]
4.end for
5.for i=low to mid
6. if a[i+1]<a[low], then exchange a[low],a[i+1]
7.end for
8.for i=mid+1 to high
9. if a[i+1]>a[high], then exchange a[high],a[i+1] 10.end for 6.5
输入:一个整数数组A[1,2,…,n] 输出:sum
1.if high-low=1 then
2. sum=a[low]+a[high]
3.else
4. mid=(low+high)/2
5 sum1=sum(low,mid)
6 sum2=sum(mid+1,high)
7. sum=sum1+sum2
8.end if
9.return sum
算法需要的工作空间为3
6.10.
6.31
彩色代表i,j所指的数字j总在i前6.36
6.42
Quicksort 不是稳定的。
6.43
bcefg 均为适应的,a 、h 不是适应的。
第7章 动态规划
7.1
(c),算法BOTTOMUPSORT 7.5
字符串A=”xzyzzyx ”和B=”zxyyzxz ”的最长公共子序列长度为4,共有6个最长公共子序列,分别是:①zyyx ②zyzz ③zyzx ④xyyx ⑤xyzz ⑥xyzx 7.9
C[1,5]=C[1,1]+C[2,5]+r[1]*r[2]*r[6]=307 C[1,5]=C[1,2]+C[3,5]+r[1]*r[3]*r[6]=252 C[1,5]=C[1,3]+C[4,5]+r[1]*r[4]*r[6]=372 C[1,5]=C[1,4]+C[5,5]+r[1]*r[5]*r[6]=260 所以最优括号表达式为(M1M2)((M3M4)M5) 7.15
1000[,]min{[,],[,1][1,]}
D i j D i j D i D j =+4051
312091134021620D ⎛⎫ ⎪
⎪
= ⎪
⎪
⎝⎭
1071
60944021
820D ⎛⎫ ⎪
∞∞
⎪= ⎪
⎪
⎝⎭
2111[,]min{[,],[,2][2,]}
D i j D i j D i D j =+
2071
60944021
820D ⎛⎫ ⎪
∞∞
⎪= ⎪
⎪
⎝⎭
3222[,]min{[,],[,3][3,]}
D i j D i j D i D j =+
3051
313091144021
620D ⎛⎫ ⎪
⎪= ⎪
⎪
⎝⎭
4333[,]min{[,],[,4][4,]}
D i j D i j D i D j =+
4051
312091134021
620D ⎛⎫ ⎪
⎪= ⎪
⎪
⎝⎭
7.21
7.23
当物品体积为负值时,运行算法会发生溢出错误。
第八章贪心算法
8.12
由算法从s 到t 要选择先到a 然后到t,其结果为4,而从s 到t 距离为2,所以探索不总是产生从s 到t 的距离 8.13
8.23(共有4棵最小生成树,此处仅举一例)
3
4 1
3
2
8
8.24(共有4棵最小生成树,此处仅举一例)
8.31
每一个二叉树都取左边为0,右边为1 则最优编码为a:10 b:001 c:0001
d:0000 e:01 f:11
注意:编码不唯一
回溯法。