算法设计技巧与分析 沙特 递归分治部分答案

合集下载

第2章 递归与分治_作业答案讲解

第2章 递归与分治_作业答案讲解

具体执行过程:求最大值
0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 -13 29 113 87 65 -9 36 14 76 44 83 67 5 0 1 2 3 4 5 6 24 -13 29 113 87 65 -9 0 1 2 3 24 -13 29 113 0 1 24 -13 2 3 29 113 4 5 6 87 65 -9 7 8 9 10 11 12 13 36 14 76 44 83 67 5 7 8 9 10 36 14 76 44 7 8 36 14 7 36 9 10 76 44 11 12 13 83 67 5 11 12 83 67 11 83 12 67 13 5
课后练习
• 练习2:分析如下时间函数的复杂度,并说明 原因。 1. 利用递归树说明以下时间函数的复杂度:
O(1) T ( n) 3T ( n ) O( n) 4 n1 n1
2. 利用主定理说明以下时间函数的复杂度:
T(n) = 16T(n/4) + n
T(n) = T(3n/7) + 1
课后练习
• 练习1:给定数组a[0:n-1], 1. 试设计一个分治法算法,找出a[0:n-1]中元素最 大值和最小值; 2. 写出该算法时间函数T(n)的递推关系式; 3. 分析该算法的时间复杂度和空间复杂度。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 -13 29 113 87 65 -9 36 14 76 44 83 67 5
• 递归公式:
– 设n个元素的集合可以划分为F(n,m)个不同的由 m个非空子集组成的集合。 F(n,m) = 1, when n=0, n=m, n=1, or m=1 F(n,m) = 0, when n<m 否则 F(n,m)=F(n-1,m-1)+m*F(n-1,m)

算法分析与设计作业参考答案

算法分析与设计作业参考答案

算法分析与设计作业参考答案《算法分析与设计》作业参考答案作业⼀⼀、名词解释: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.设计⼀个分治算法计算⼀棵⼆叉树的⾼度。

算法设计与分析(霍红卫)-第2章-分治法

算法设计与分析(霍红卫)-第2章-分治法

MOVE(X, 4, Z) HANOI(3, Y, X, Z)
HANOI(2, Y, Z, X) HANOI(1, Y, X, Z) MOVE(Y, 1, Z) MOVE(Y, 2, X) HANOI(1, Z, Y, X) MOVE(Z, 1, X) MOVE(Y, 3, Z)
HANOI(2, X, Y, Z) HANOI(1, X, Z, Y) MOVE(X, 1, Y) MOVE(X, 2, Z) HANOI(1, Y, X, Z) MOVE(Y, 1, Z)
n log43
(d)
图 2-4 递归树的构造过程
第2章 分 治 法
现在,我们确定树中每一层的开销。每一层的结点数是上 一层结点数的两倍,因此,第i层的结点数为3i。由于每一层子 问题规模为上一层的 1/4,由根向下,深度为i(i=0,1,…, log4n-1) 的每个结点的开销为c(n/4i)2,那么第i层上结点的总开 销为
3
cn2
3
2
cn2
3
log4
n1
cn2
Θ(nlog4
3)
16 16
16
log4
n1
3
i
cn2
Θ(nlog4 3)
i0 16
3
i
cn2
Θ(nlog4 3 )
i0 16
1 cn2 Θ(nlog4 3) 1 3/16
16 cn2 Θ(nlog4 3)] 13
O(n2)
(n= )
-
图 2 3 汉 诺 塔 的 执 行 过 程
4
第2章 分 治 法 汉诺塔算法的时间复杂度为指数级的复杂度。以下做一简 要证明。假设汉诺塔算法的时间复杂度为T(n),由递归算法可

算法设计技巧与分析(沙特版) 第1_2章课后习题参考解答

算法设计技巧与分析(沙特版) 第1_2章课后习题参考解答

lim
n
2n 3log100 n ,所以,2n+3log100n=(n)。 2 n
3 3 nlogn 3n 7n3 1000 7 ,所以,7n +1000nlog n+3n =(n ). 3 n
lim
n
lim
n
n
3n1.5 n1.5 logn ,所以,3n1.5+n1.5log n=(n1.5log n). 1 n1.5 logn
3
g(n) 100n +2n+100 10n+log log n 10nlog log n log n 5
n 2 2
f=O(g) False True False True False
f=(g) True True True False True
f=(g) False True False False False
2n 100n n! ,所以,2n+100n+ n!=(n!). 1 n!
lim
1.16 解答: (a) 算法执行元素比较运算的最小次数是 n-1。当输入 A[1..n] 已经有非减次序时该算法执 行元素比较运算次数达到这个最小值。 (b) 算法执行元素比较运算的最大次数是(n-1)+( n-2)+…+ 2+1=n(n-1)/2。当输入 A[1..n] 已有递减次序时该算法执行元素比较运算次数达到这个最大值。 (c) 算法执行元素赋值运算的最小次数是 0。 当输入 A[1..n] 已经有非减次序时该算法执行元 素赋值运算次数达到这个最小值。 (d) 算法执行元素赋值运算的最大次数是 3[(n-1)+( n-2)+…+ 2+1]=3n(n-1)/2。当输入 A[1..n] 已有递减次序时该算法执行元素赋值运算次数达到这个最大值。 (e) 使用记号 O 和 ,算法 BUBBLESORT 的运行时间分别表示为(n2)和(n)。 (f) 该算法的运行时间不能使用记号来表示,这是因为算法的运行时间范围为 n 的一次方 到二次方。 2.16 解答: (a) 一方面,∑j=1n jlog j≤∑j=1n nlog n≤n 2 log n, 另一方面,∑j=1n jlog j≥∑j= n/2 n n/2log n/2 ≥n/2 n/2log n/2 ≥(n-1)n/4·log(n/2)。 n 因此,∑j=1 jlog j= (n 2logn)。 (b)令 f(x)=x log x (x≥1)。由于 f(x) 是增函数,故有 ∑j=1n jlog j≤∫1n+1 x log xdx≤(2(n+1)2 ln(n+1)-(n+1)2+1) / (4ln2); 同时, ∑j=1n jlog j=∑j=2n jlog j≥∫1n x log xdx≥(2n2 lnn-n2+1) / (4ln2)。 因此,∑j=1n jlog j= (n 2lnn)= (n 2logn)。 2.18 解答: (a) 特征方程为 x=3。

算法设计与分析——浅谈递归思想与分治策略

算法设计与分析——浅谈递归思想与分治策略
汉诺塔问题
(1) 若只有一个盘子,直接从柱子A移动到柱子C (2) 若有两个盘子,先将最上面一个盘子移动到B,再将底下的盘子移动 到C,再将B上的盘子移动到C (3) 若有三个盘子,先借助C将A最上面的两个盘子移动到B,将最大的盘 子移动到C,此时A为空,再借助A将B最上面的一个盘子移动到A,将B 剩余的一个盘子移动到C,再将A上的盘子移动到C …………… 以此类推,假设A上有n个盘子,先借助C将A上n-1个盘子移动到B,再 将第n个盘子移动到C,再借助A盘将B上的n-1个盘子移动到C. 由此可见,此中不断重复一个借助某个柱子将另外一个柱子上的最下面 的盘子移动到第三个柱子上的过程.
算法设计与分析——初章
结束了… 主要内容: 1. 算法的时间复杂度 2. 递归思想
递归定义 直接递归调用与间接递归调用 递归应用 递归算法举例---Hanoi
3.分治策略
分治策略描述 二分法(二分查找,二分插入) 快速排序 归并排序

{2,4,5,7 }
{1,2,3,6}
{1,2,2,3,4,5,6,7}
分治策略
归并排序
在上述序列中,将整个序列从中间分成两个子序列,{5,2, 4,7 }和{1,3,2,6},然后将两个子序列按照相同的规则继续划 分直至不能再分为止, {5}{2}{4}{7}{1} {3}{2}{6},然后将不能再分 的子序列排序,对相邻的两个子序列进行归并操作,归并的规则 是: (1)取出相邻两个子序列中最小的数相比较,将两个数添加到归 并后的序列中. (2)对两个子序列中剩余的元素重复(1)操作. (3)当某个子序列为空后,将另一个子序列中的元素直接添加到 序列末尾. (4)重复(1)操作.
递归思想
汉诺塔问题
Hanoi有四个参数,第一个参数表示盘子的数目,第二个参数表示源柱 子,第三个参数表示要借助的柱子,第四个参数表示目标柱子. if(n==1) move(chA, chC) else { Hanoi(chA, chC, chB);//借助C将A上除了最下面一个移动到B move(chA, chC) Hanoi(chB, chA, chC);//借助A将B上面的移动到C }

算法设计技巧与分析 沙特 递归分治部分答案

算法设计技巧与分析 沙特 递归分治部分答案

算法:EX5_33输入:已排序的数组A[1,…,n],整数x输出:如果A中存在两个数,它们的和是x,则输出这两个数,若不存在,则输出none find(1,n)end EX5_33过程:find(s,t)// 确定A[s,…,t]中是否存在两个数,它们的和是x,如果存在则输出这两个数,若不存在,则输出noneif s=t then output none;else if s<t thenif A[s]+A[t]=x thenoutput A[s],A[t];else if A[s]+A[t]>x then find(s,t-1);else A[s]+A[t] find(s+1,t);end ifend ifend find6.6EX6_6输入:输出:num=count(1,n,x);end EX6_6过程count(low,high,x)//if high=low thenif A[low]=x then return 1else return 0elsemid=(low+high)/2return count(low,mid)+count(mid+1,high)end ifend count递归出口high<low ?EX6_51输入:输出:h=high(R)return hend EX6_51过程high(T)//if T为空then return -1elseleft=high(T->left);right=high(T->right);return 1+max{left,right}end ifend high递归出口T->left == null and T->right==null then return 0 ? 全局变量?6.52算法SECONDV ALUE输入:正整数n和存储n个元素的数组a[1..n]输出:数组a的第二大元素(x1,x2)=secondvalue(1,n,a);return x2;end SECONDV ALUE过程secondvalue(low,high,a)//返回数对(x1,x2)其中x1>=x2if high-low=0 thenreturn (a[low],-∞); //这个地方有修改else if high-low=1 thenif a[high]>=a[low] thenreturn (a[high],a[low]);else return (a[low],a[high]);end ifend ifend ifmid=(low+high)/2;(x1,x2)=secondvalue(low,mid,a);(y1,y2)=secondvalue(mid+1,high,a);return x1,x2,y1,y2中最大和最小元素对;。

算法设计技巧与分析习题参考答案

算法设计技巧与分析习题参考答案习题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、二分搜索算法是利用(分治策略)实现的算法。

9. 实现循环赛日程表利用的算法是(分治策略)27、Strassen矩阵乘法是利用(分治策略)实现的算法。

34.实现合并排序利用的算法是(分治策略)。

实现大整数的乘法是利用的算法(分治策略)。

17.实现棋盘覆盖算法利用的算法是(分治法)。

29、使用分治法求解不需要满足的条件是(子问题必须是一样的)。

不可以使用分治法求解的是(0/1背包问题)。

动态规划下列不是动态规划算法基本步骤的是(构造最优解)下列是动态规划算法基本要素的是(子问题重叠性质)。

下列算法中通常以自底向上的方式求解最优解的是(动态规划法)备忘录方法是那种算法的变形。

(动态规划法)最长公共子序列算法利用的算法是(动态规划法)。

矩阵连乘问题的算法可由(动态规划算法B)设计实现。

实现最大子段和利用的算法是(动态规划法)。

贪心算法能解决的问题:单源最短路径问题,最小花费生成树问题,背包问题,活动安排问题,不能解决的问题:N皇后问题,0/1背包问题是贪心算法的基本要素的是(贪心选择性质和最优子结构性质)。

回溯法回溯法解旅行售货员问题时的解空间树是(排列树)。

剪枝函数是回溯法中为避免无效搜索采取的策略回溯法的效率不依赖于下列哪些因素(确定解空间的时间)分支限界法最大效益优先是(分支界限法)的一搜索方式。

分支限界法解最大团问题时,活结点表的组织形式是(最大堆)。

分支限界法解旅行售货员问题时,活结点表的组织形式是(最小堆)优先队列式分支限界法选取扩展结点的原则是(结点的优先级)在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( 分支限界法).从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( 栈式分支限界法)之外都是最常见的方式.(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

算法设计与分析:第02章 递归与分治策略


2.1
递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
分治法的基本步骤
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 } 人们从大量实践中发现,在用分治法设计算法时,最好使 子问题的规模大致相同。即将一个问题分成大小相等的k个子问 题的处理方法是行之有效的。这种使子问题规模大致相等的做 法是出自一种平衡(balancing)子问题的思想,它几乎总是比子 问题规模不等的做法要好。
1 5 n1 1 5 n1 1 F (n) 2 5 2
但本例中的Ackerman函数却无法找到非递归的定义。
2.1
例3 Ackerman函数
递归的概念
• A(n,m)的自变量m的每一个值都定义了一个单变量函数: • M=0时,A(n,0)=n+2 • M=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和A(1,1)=2故 A(n,1)=2*n • M=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2^n 。

分治法习题参考答案.docx

第4章书面作业参考答案:一、 设计递归算法求解如下多项式:解:(1)tempi = x 无3 兀2/(2)=无一耳=/(1) + (—1)•⑹妙 1•丽 /(3) = x 一 寺 + 字/(2) + (― 1) • tempi •三 temp3 = (-!)• tempi •三 根据推导得递归方程为:/(I) = x, temp[l]=无(基础步)兀2temp[n] = (-1) - temp[n 一 1] --- : ------- f(n) = / (/? 一 1) +temp[n^ 归纟内) (2〃一2)(2斤一1)(2)时间复杂性分析:[ r(i)= o(i)= T(n -1) + 0(1)用递推法求解:(未求解不扣分)T(n) = T(n -1) + 0(1) = T(n -2)4- 0(1) • 2 =…=T(l) + 0(1)・(n-1) =0(H ) 其中,递归算法描述如下:(未写算法不扣分)输入:x, n输岀:f(x)的前n 项之和double Fun (double x, int n , double &temp)if(n==1) (1) (2) 3 57 X X X / 八〃 ——+ ------------------ + …+ (— 1)" 3! 5! 7!写岀递归表达式(基础步、归纳步)。

f (x) = x 2+1 (2/? + 1)!分析时间复杂度。

(写出递归方程,不用求解)f(l)F 无2tempi - (-!)• tempi・temp = x; return x;}double tempi,lastvalue; lastvalue = Fun (x,n-1,tempi);temp = (-1 )*temp1 *x*x/((2*n-1 )*(2*n-2)); return lastvalue + temp;二、P114 22解:(1)算法思想:划分步:将数组分为基本等长的两部分治理步:若n二2,则直接比较若n>2,则递归求两部分的最大值、次大值组合步:假设两部分求得的最大值和次大值分别为xl,yl; x2,y2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
end if
end count
递归出口high<low ?
6.51
EX6_51
输入:
输出:
h=high(R)
return h
end EX6_51
过程high(T)
//
if T为空then return -1
else
left=high(T->left);
right=high(T->right);
return 1+max{left,right}
5.33
算法:EX5_33
输入:已排序的数组A[1,…,n],整数x
输出:如果A中存在两个数,它们的和是x,则输出这两个数,若不存在,则输出none
find(程:find(s,t)
//确定A[s,…,t]中是否存在两个数,它们的和是x,如果存在则输出这两个数,若不存在,则输出none
return x1,x2,y1,y2中最大和最小元素对;
return (a[high],a[low]);
else return (a[low],a[high]);
end if
end if
end if
mid=(low+high)/2;
(x1,x2)=secondvalue(low,mid,a);
(y1,y2)=secondvalue(mid+1,high,a);
end find
6.6
EX6_6
输入:
输出:
num=count(1,n,x);
end EX6_6
过程count(low,high,x)
//
if high=low then
if A[low]=x then return 1
else return 0
else
mid=(low+high)/2
return count(low,mid)+count(mid+1,high)
if s=t then output none;
elseif s<t then
if A[s]+A[t]=x then
output A[s],A[t];
else if A[s]+A[t]>x then find(s,t-1);
else A[s]+A[t] find(s+1,t);
end if
end if
end if
end high
递归出口T->left == null and T->right==null then return 0 ?
全局变量?
6.52
算法SECONDVALUE
输入:正整数n和存储n个元素的数组a[1..n]
输出:数组a的第二大元素
(x1,x2)=secondvalue(1,n,a);
return x2;
end SECONDVALUE
过程secondvalue(low,high,a)
//返回数对(x1,x2)其中x1>=x2
if high-low=0 then
return (a[low],-∞); //这个地方有修改
else if high-low=1 then
if a[high]>=a[low] then
相关文档
最新文档