算法设计与分析习题第二章分治与递归
第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)
第2章_递归与分治策略
2019/9/17
算法设计与分析
25
原问题 的规模是n
子问题1 的规模是n/2
子问题2 的规模是n/2
子问题1的解
子问题2的解
原问题的解
2019/9/17
算法设计与分析
26
问题(N个输入)
合 子问题1 并 解
• •
m=2时,A(n,2)=2n。 m=3时,类似的可以推出
2 2...2
n
• m=4时,A(n,4)的增长速度非常快,以至于没
有合适的数学式子来表示这一函数。
2019/9/17
算法设计与分析
9
举例2-6:Hanoi塔问题
• 问题定义:设a, b,c是3个塔座。开始时,在塔座a上有一 叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。 各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠 圆盘移到塔座b上,并仍按同样顺序叠置。
15
需要先完成:Hanoi(2,a,b,c);
三阶Ha该n工oi作塔又问可题分解成:① Hanoi(1,a,c,b);②
MOVE(a,2,c);③ Hanoi(1,b,a,c)。
完成Hanoi(1,b,a,c); 工作等价于MOVE(b,1,c)。
1
3
2
塔座a
塔座b Hanoi(2,a,塔b,c座) c
MOVE(a,2,c);③ Hanoi(1,b,a,c)。
完成MOVE(a,2,c)。
3
1
2
塔座a
塔座b
塔座c
• 分析:完成Hanoi(3,a,c,b)的工作可以分解成如下 三个步骤:Hanoi(2,a,b,c)、MOVE(a,3,b)和 Hanoi(2,c,a,b)。
算法之2章递归与分治
算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。
3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。
(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。
4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
算法设计与分析第2章
计算F(n-1)所需 乘法次数 计算F(n-1) ×n所需 乘法次数
初始条件(initial condition):停止递归调用的条件 T(0) = 0
• Conquer: 一个划分确定后,A[s]的位置便确定,再 对两个子数组递归地划分 • Combine: 原地排序in-place sort,无需合并
Quicksort(A[l…r]) if l < r s = Partition(A[l…r]) Quicksort(A[l…s-1]) Quicksort(A[s+1…r]) Partition(A[l…r]) p = A[l] //选择第一个元素作为划分基准 i = l; j = r + 1 repeat repeat i = i + 1 until A[i] ≥ p //left-to-right scan repeat j = j - 1 until A[j] ≤ p //right-to-left scan swap(A[i], A[j]) until i ≥ j swap(A[i], A[j]) //undo last swap when i ≥ j swap(A[l], A[j]) return j
二分搜索(Binary Search)
• 给定已按升序排好序的n个元素A[0…n-1],现要在 这n个元素中找出一特定元素k。
– 蛮力算法:遍历、 Tworst(n) =O(n) – 分治法是否适用?
• • • •
算法设计与分析实验指导1_分治与递归
《算法设计与分析》实验指导实验一分治与递归一、实验目的:1. 理解递归的概念。
2. 掌握设计有效算法的分治策略。
3. 掌握C++面向对象编程方法。
二、实验指导1. 分治法的总体思想求解一个复杂问题可以将其分解成若干个子问题,子问题还可以进一步分解成更小的问题,直到分解所得的小问题是一些基本问题,并且其求解方法是已知的,可以直接求解为止。
分治法作为一种算法设计策略,要求分解所得的子问题是同类问题,并要求原问题的解可以通过组合子问题的解来获取。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效的算法。
2. 分治法的基本步骤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); //将各子问题的解合并为原问题的解}3. C++类定义例class Complex{public:Complex( ):real(0),imag(0) {} //构造函数Complex(double r,double i):real(r),imag(i) {} //构造函数Complex operator + (Complex c2); //重载“+”运算符operator double( ) //重载类型转换运算符{return real;}friend ostream& operator << (ostream&,Complex&); //重载流插入运算符“<<”private:double real;double imag;};三、实验内容及要求:在程序中创建一个学生对象数组并初始化数据,完成如下编程任务。
[工学]算法设计与分析第二章
递归复杂性的一般形式
• 一般的,递归复杂性可描述为递归方程: 1 n=1 f(n) = af(n ~ b) + D(n) n>1 • 其中,a是子问题个数, ~表示递减方式, b是递减步长, D(n)是合成子问题的开销。 • 通常,递归元的递减方式~有两种: 分治法 1、除法,即n / b,的形式; 递推法 2、减法,即n – b,的形式。
第二章
递归与分治
2018/11/20
计算机算法设计与分析
1
递归的思想
• 递归(Recursion)就是通过把复杂问题分解为 较简单的同一问题来求解。 • 递归求解问题的方法通常有两步: • 第一步是考虑最简单的情况下该问题如何 求解。 • 第二步是考虑该问题的较复杂情况是如何 由较简单的所构成的。 • 由此得出该问题求解的方法。
2018/11/20 计算机算法设计与分析 28
分治法的基本思想
• 将一个规模为n的问题分解为a个规模较小的 子问题,这些子问题互相独立并且与原问题 相同。 • 递归地求解这些子问题问题。 • 然后将各个子问题的解合并在一起,从而得 到原问题的解。 • 影响其时间复杂性的因素是子问题的个数和 合并开销函数,其中较大者起主要作用。
A B C
2018/11/20
计算机算法设计与分析
4
Hanoi塔问题
• 让我们先考虑最简单的情况: • 1、若没有盘子(n=0),自然不需要做任何事情。 • 2、若只有一个盘子,也很容易。直接把它移到B 盘即可。
• 不妨设操作Move(X, Y) 将X柱上的一个盘子(最 顶上的)移到Y柱上。
A B C
GCD(x, y) = y, x, GCD(x – y, y), GCD(x, y – x), x=0 y = 0 最简单 x y 的情况 x < y 有两种
计算机专业课《算法》_第二章 递归与分治策略
“Hanoi 塔”问题演示 a 初始 a 步骤1 a
c
b
c
“Hanoi 塔”问题程序
void hanoi(int n,a,b,c)
{ if n == 1 move( 1, a, b );
else { hanoi( n-1, a, c, b );
move(n, a, b ); hanoi( n-1, c,b, a) ;
• 递归优点:结构清晰,可读性强
• 递归缺点:递归算法的运行效率较低,无论是耗 费的计算时间还是占用的存储空间都比非递归算 法要多。
整数划分问题的递归关系q(n,m)
如设p(n)为正整数n的划分数,则难以找到递归关系 • q(n,m):正整数n的不同的划分中,最大加数不 大于m的划分个数个数 q(n,m)=
1 q(n,n) 1+q(n,n-1) q(n,m-1)+q(n-m,m) n=1, m=1 n<m n=m n>m>1
递归函数举例(5)
学习要点
理解递归的概念。 掌握设计有效算法的分治策略。
通过典型范例,学习分治策略设计技巧。
2.1 递归的概念
• 递归算法:一个直接或间接地调用自身的算法 • 递归方程:对于递归算法,一般可把时间代 价表示为一个递归方程 • 递归函数:使用函数自身给出定义的函数 • 解递归方程最常用的方法是进行递归扩展
递归函数举例(1)
• 阶乘函数 n !=
1 n(n-1)! n=1 n>1
• Fibonacci数列
1 n=0
F(n)=
1 F(n-1)+F(n-2)
n=1 n>1
初始条件与递归方程是递归函数的二个要素
大学_计算机算法设计与分析第4版(王晓东著)课后答案下载
计算机算法设计与分析第4版(王晓东著)课后答
案下载
计算机算法设计与分析第4版内容简介
第1章算法概述
1.1 算法与程序
1.2 算法复杂性分析
1.3 NP完全性理论
算法分析题1
算法实现题1
第2章递归与分治策略
2.1 递归的概念
2.2 分治法的基本思想
2.3 二分搜索技术
2.4 大整数的乘法
2.5 Strassen矩阵乘法
2.6 棋盘覆盖
2.7 合并排序
2.8 快速排序
2.9 线性时间选择
2.10 最接近点对问题
第3章动态规划
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
附录A C++概要
参考文献
计算机算法设计与分析第4版目录
本书是普通高等教育“十一五”__规划教材和国家精品课程教材。
全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。
主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、__化算法、线性规划与网络流等。
书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。
为突出教材的`可读性和可用性,章首增加了学习要点提示,章末配有难易适度的算法分析题和算法实现题;配套出版了《计算机算法设计与分析习题解答(第2版)》;并免费提供电子课件和教学服务。
[理学]算法设计与分析课件 第2章 递归与分治_OK
• 当n>1时,perm(R) 由
(r1)perm(R1) (r2)perm(R2) ………
(rn)perm(Rn)
• 构成。(其中:Ri=R- { ri } )
12 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例5 整数划分问题 • 将一个正整数n表示成形如下式的一系列正整数的和,称为n的一个划分。 • 形如:
2
A(n, 3) 222
A(A(n 1,m),m 1) n,m 1
n
2
A(3, 4) 222
65536
11
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例4 数列的全排列问题
perm(R) • 求n个元素R={r1,r2,…,rn}的全排列
。
• 分析:
• 当n=1时,perm(R)=(r)
第2章 递归与分治策略
• 2.1 递归的概念 • 2.2 分治法的基本思想 • 2.3 分治法的应用 • 本章小结
1 Ó 2005 四川师范大学 计算机科学学院 刘芳
• 嵌套与递归
2.1 递归的概念
2 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例1: 阶乘函数
阶乘函数可递归地定义为:
9
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例3 Ackerman函数
当一个函数及它的一个变量是由函数自身定义时,称这个函 数是双递归函数。
Ackerman函数A(n,m)定义如下:
2
A(n,
m)
1 n
2
A( A(n 1, m), m 1)
n 1, m 0 n 0, m 0 n 2, m 0
算法设计与分析(霍红卫)-第2章-分治法
第2章 分 治 法
我们可以很容易解决这个问题。利用这样一个事实:渐近 表示法只要求对n≥n0,T(n)≤cn lb n成立,其中n0是一个可以选择 的常数。由于对于n>3,递归方程并不直接依赖T(1),因此可设 n0=2,选择T(2)和T(3)作为归纳证明中的边界条件。由递归方程 可得T(2)=4和T(3)=5。此时只要选择c≥2,就会使得T(2)≤c·2·lb 2 和 T(3)≤c·3·lb 3 成 立 。 因 此 , 只 要 选 择 n0=2 和 c≥2 , 则 有 T(n)≤cn lb n成立。
3ic(n/4i)2=(3/16) icn2 i=0,1,…,log4n-1
深度为log4n的最后一层有3log4 n nlog4 3 个结点,每个结点的
开销为T(1),该层总开销为 nlog4 3T (1) ,即 Θ(nlog4 3)。
第2章 分 治 法
将所有层的开销相加得到整棵树的开销:
T (n) cn2
T(n)=2T(n/2)+n ≤2(c[n/2]lb[n/2])+n =cn lb n/2+n =cn lb n-cn lb 2+n =cn lb n-cn+n =cn lb n-(c-1)n
最后一步在c≥1时成立。≤cn lb n
第2章 分 治 法
下面证明猜测对于边界条件成立, 即证明对于选择的常 数c,T(n)≤cn lb n对于边界条件成立。 这个要求有时会产生 一些问题。 假设T(1)=1是递归方程的惟一边界条件,那么对 于n=1,T(1)≤c·1·lb 1=0与T(1)=1发生矛盾。因此,归纳法中 的归纳基础不成立。
3
cn2
3
2
cn2
3
算法设计与分析习题第二章分治与递归
2010-12-28
12
2.11 编写针对链表的快速排序程序。
需要保存指针信息。下面给出双向链表的快速排序算法 void fast_sort( Sdata *a, Sdata *f, Sdata *t ) { Sdata *i,*j,k,p; i = f; j = t; if ( t->lnext != f ) { k = a->data; //用于比较的基准数值 i = f; j = t; p = -1; while ( j != i )
7
2.7 按2.2.4节的描述,编写从二叉树中删除一个结点 的C语言程序 二叉树节点删除有三种情况: (1)*p是叶子(即它的孩子数为0):无须连接*p的子树, 只需将*p的双亲*parent中指向*p的指针域置空即可。 (2)*p只有一个孩子*child:只需将*child和*p的双亲直接 连接后,即可删去*p。注意:*p既可能是*parent的左孩 子也可能是其右孩子,而*child可能是*p的左孩子或右孩 子,故共有4种状态。 (3)*p有两个孩子:先令q=p,将被删结点的地址保存在q 中;然后找*q的中序后继*p,并在查找过程中仍用parent 记住*p的双亲位置。*q的中序后继*p一定是 *q的右子树 中最左下的结点,它无左子树。因此,可以将删去*q的 操作转换为删去的*p的操作,即在释放结点*p之前将其 数据复制到*q中,就相当于删去了*q.
算法设计与分析习题
第二章 分治与递归
2010-12-28
1
2.1 对于顺序查找算法,分析目标值存在于数组中的 概率p趋于0的含义,这种情况下平均查找次数有什么 样的变化?当p趋于1时呢? 见教材P12。平均比较次数为 n - p(n-1)/2。 p趋于0,平均次数趋于n;p趋于1时,平均次数趋于 (n+1)/2。(求极限)
黄宇《算法设计与分析》课后习题解析(二)精选全文
黄宇《算法设计与分析》课后习题解析(⼆)第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,请证明。
算法设计与分析:第02章 递归与分治策略
A(1,0) 2 A(0, m) 1 m0 A(n,0) n 2 n2 A(n, m) A( A(n 1, m), m 1) n, m 1
2.1
递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
课件第2章
递归与分治策略
算法总体思想
• 将要求解的较大规模的问题分割成k个更小规模的子问 对这k个子问题分别求解。如果子问题的规模仍然不够 小,则再划分为k个子问题,如此递归的进行下去,直 题。 到问题规模足够小,很容易求出其解为止。
T(n)
=
n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
算法总体思想
下面来看几个实例。
2.1
递归的概念
边界条件
例1 阶乘函数 阶乘函数可递归地定义为:
n0 1 n! n(n 1)! n 0
递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
2.1
递归的概念
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被 称为Fibonacci数列。它可以递归地定义为:
2.1
递归的概念
例6 Hanoi塔问题 public static void hanoi(int n, int a, int b, int c) 当n=1时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直 在问题规模较大时,较难找到一般的方法,因此我们尝试 接移至塔座b上即可。 用递归技术来解决这个问题。 { 思考题:如果塔的个数变为a,b,c,d 当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个 if (n > 0) 四个,现要将n个圆盘从a全部移动 较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最 { 到d,移动规则不变,求移动步数最 大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照 hanoi(n-1, a, c, b); 小的方案。 移动规则从塔座c移至塔座b。 move(a,b); 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题, hanoi(n-1, c, b, a); 这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题 的递归算法如下。 } }
算法设计与分析报告习题
《算法设计与分析》习题第一章算法引论1、算法的定义?答:算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。
通俗讲,算法:就是解决问题的方法或过程。
2、算法的特征?答:1)算法有零个或多个输入;2)算法有一个或多个输出; 3)确定性;4)有穷性3、算法的描述方法有几种?答:自然语言、图形、伪代码、计算机程序设计语言4、衡量算法的优劣从哪几个方面?答:(1) 算法实现所耗费的时间(时间复杂度);(2) 算法实现所所耗费的存储空间(空间复杂度);(3) 算法应易于理解,易于编码,易于调试等等。
5、时间复杂度、空间复杂度定义?答:指的是算法在运行过程中所需要的资源(时间、空间)多少。
6、时间复杂度计算:{i=1;while(i<=n)i=i*2; }答:语句①执行次数1次,语句②③执行次数f(n), 2^f(n)<=n,则f(n) <=log2n;算法执行时间: T(n)= 2log2n +1时间复杂度:记为O(log2n) ;7.递归算法的特点?答:①每个递归函数都必须有非递归定义的初值;否则,递归函数无法计算;(递归终止条件)②递归中用较小自变量函数值来表达较大自变量函数值;(递归方程式)8、算法设计中常用的算法设计策略?答:①蛮力法;②倒推法;③循环与递归;④分治法;⑤动态规划法;⑥贪心法;⑦回溯法;⑧分治限界法9、设计算法:递归法:汉诺塔问题?兔子序列(上楼梯问题)?整数划分问题?蛮力法:百鸡百钱问题?倒推法:穿越沙漠问题?答:算法如下: (1) 递归法● 汉诺塔问题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); } }● 兔子序列(fibonaci 数列 )递归实现:Int F(int n) {if(n<=2) return 1; elsereturn F(n-1)+ F(n-2); }● 上楼梯问题 Int F(int n) {if(n=1) return 1 if(n=2) return 2; elsereturn F(n-1)+ F(n-2); }● 整数划分问题问题描述:将正整数n 表示成一系列正整数之和,n=n1+n1+n3+…将最大加数不大于m 的划分个数,记作q(n,m)。
算法分析与设计试题答案
算法分析与设计习题第一章算法引论一、填空题: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)定义:指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。
计算机算法设计与分析-递归与分治
2023/10/8
计算机算法设计与分析
7
一、递减方式为减法
若~为减法,即n – b,则有:
T(n) = aT(n – b) + D(n)
= a(aT(n – 2b) + D(n – b)) + D(n) =
当a = D(b)时 当a > D(b)时
2023/10/8
计算机算法设计与分析
13
求解递归方程
考虑下列递归方程:T(1) = 1 ⑴T(n) = 4T(n/2) +n ⑵ T(n) = 4T(n/2) +n2 ⑶ T(n) = 4T(n/2) +n3
解:方程中均为a = 4,b = 2,其齐次解为n2。 对⑴, ∵ a > b1 (D(n) = n) ∴ T(n) = O(n2); 对⑵, ∵ a = b2 (D(n) = n2) ∴ T(n) = O(n2logn); 对⑶, ∵ a < b3 (D(n) = n3) ∴ T(n) = O(n3);
{p=0; /*p用于记录每次的进位值*/ for (j=0;j<m;j++)
{q=c[i+j]+a[j]*b[i]+p; c[i+j]=q%10; p=q/10; } c[i+m]=p; if (c[m+n-1]==0) k - -; /*乘积只有m+n-1位*/ return(k); /*以乘积的位数作为函数返回值*/ }
在递归算法的设计中递归元是非常重要的。
2023/10/8
计算机算法设计与分析
算法设计与分析_第2章_递归与分治1
算法设计与分析第2章递归与分治策略(1)2理解递归的概念。
掌握设计有效算法的分治策略。
通过下面的范例学习分治策略设计技巧。
二分搜索技术; 大整数乘法; Strassen 矩阵乘法; 合并排序和快速排序; 线性时间选择; 最接近点对问题; 重点和难点:递归和分治的概念与基本思想递归方程的求解方法学习要点3引言设计算法有许多方法 排序问题Bubble sort: bubblingInsertion sort: incremental approach (增量靠近) Merge sort: divide-and conquer (分而治之)Quick sort: location (元素定位)……分治算法的最坏运行时间远比插入排序还少4引言分而治之 清·俞樾《群经平议·周官二》“巫马下士二人医四人”:“凡邦之有疾病者,疕疡者造焉,则使医分而治之,是亦不自医也。
” 各个击破集中红军相机应付当前之敌,反对分兵,避免被敌人各个击破。
(毛泽东《中国的红色政权为什么能够存在》)5天下大事,必做于细天下难事,必做于易--------老子《道德经》引言分治法总体思想分治法总体思想分治法总体思想分治法总体思想10¾Divide=整个问题划分为多个子问题¾Conquer=求解每个子问题(递归调用正在设计的算法)¾Combine=合并子问题的解,形成原始问题的解。
分治法总体思想11分治法总体思想分治法的设计思想是:1)将一个难以直接解决的大问题,分割成一些规模较小的子问题;这些子问题互相独立且与原问题相同;2)递归地解子问题;3) 将各个子问题的解合并得到原问题的解.12问题: X 和Y 是两个n 位的二进制整数,分别表示为X=x n-1x n-2...x 0, Y=y n-1y n-2...y 0,其中0 ≤x i , y j ≤1 (i, j=0,1,…n-1) ,设计一个算法求X ×Y ,并分析其计算复杂度。
《计算机算法设计与分析》第二章 递归与分治策略PPT课件
{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
} 2020/7/31
10
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这
个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
A(1,0) 2
12
例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)= 2n 。
第2章 递归与分治策略
2020/7/31
1
第一部分
整体概述
THE FIRST PART OF THE OVERALL OVERVIEW, PLEASE SUMMARIZE THE CONTENT
2
学习要点:
理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
T(nn/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
算法设计与分析习题解答(第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。
第2章递归与分治(3)
2.2 分治算法的基本思想
将规模为N的问题分解为k个规模较小的子问题,使这些子问题相互 独立可分别求解,再将k个子问题的解合并成原问题的解.如子问题 的规模仍很大,则反复分解直到问题小到可直接求解为止. 在分治法中,子问题的解法通常与原问题相同,自然导致递归过程.
应用当中,通常将问题分解为k个(k=2)大小相等的子问题. 算法一般模式 阀值 Divide-and-Conquer(P) if ( |P|<=n0) Adhoc(P); 直接求解问题p 问 divide P into smaller subinstances P1 ,P2,... ,Pk; 题 for (i = 1;i <= k; i++) 的 规 yi=Divide-and-Conquer(Pi); 模 return Merge( yl ,..., yk); 将p1,p2,…pk的解y1,y2,…yk 合并成p的解
13
算法设计与分析 > 递归与分治
[n]
[n/2] [n/2]
[n/4] [1] [1]
[n/4]
[n/4] [1]
[n/4]
log n +
1
[1]
• 二分搜索的每次循环查找区间减半,查找区间 构成一棵二叉树,最坏的情况是一直走到二叉 树的叶子。因此算法的复杂度为 log n + 1。
k–1
k–1
= n + nlog(n /2i) = n + n(logn –log2i ) i) ilog2)
i=0 i=0
i=0 k–1
i=0 k–1
= n + knlogn – n(k /2 1)k/2 nk2 – + nk/2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7
2.7 按2.2.4节的描述,编写从二叉树中删除一个结点 的C语言程序 二叉树节点删除有三种情况: (1)*p是叶子(即它的孩子数为0):无须连接*p的子树, 只需将*p的双亲*parent中指向*p的指针域置空即可。 (2)*p只有一个孩子*child:只需将*child和*p的双亲直接 连接后,即可删去*p。注意:*p既可能是*parent的左孩 子也可能是其右孩子,而*child可能是*p的左孩子或右孩 子,故共有4种状态。 (3)*p有两个孩子:先令q=p,将被删结点的地址保存在q 中;然后找*q的中序后继*p,并在查找过程中仍用parent 记住*p的双亲位置。*q的中序后继*p一定是 *q的右子树 中最左下的结点,它无左子树。因此,可以将删去*q的 操作转换为删去的*p的操作,即在释放结点*p之前将其 数据复制到*q中,就相当于删去了*q.
2010-12-28 14
2.12 编写针对数组的归并排序程序。
void combine_sort( int a[], int s, int n ) //a[]为数组 { int k,b,c,m; int *r = new int[n]; if ( n>1 ) { k = n/2; combine_sort( a, s ,k ); //递归调用 combine_sort( a, s+k, n-k ); m = 0; b = s; c = s+k;
2 4 6 5 = 24 34 AB = 5 7 3 6 51 67
2010-12-28 17
2010-12-28
4
2.4 试写出求二叉树中序遍历序列的递归程序。 void walk (T_Node *p) { if ( p == NULL )return; walk( p->left); printf( p->data ); walk( p->right); } for the other example: void walk (T_Node *p, int *visit) { if(p){ if(walk( p->left)) if(visit( p->data )) if(walk( p->right))return ok; }else return ok; }
2010-12-28
10
Void Balance(BSTree &T) { lc=T->lchild; //lc指向*T的左子数根节点 rd=lc->rchild; //rd指向*T的左孩子的右子数根 T->bf=lc->bf=EH; //修改*T及其左孩子的平衡因子 rd->bf=EH; L.Rotate(T->lchild); //对*T的左子树作左旋平衡处理 R.Rotate(T); //对*T作右旋平衡处理 }
2010-12-28 5
2.5 针对图2.1(b)的二叉排序树,若查找的命中率 为100%,即不考虑查找的目标值不在树中的情况,则 平均需要多少次元素值的比较? 查找处于第k层的元素需要比较k次,对于图2.1(b), 总的比较次数为1×1+2×2+3×3+4×5=34,平均 次数34/11=3.1次。 11 4 3 1
2010-12-28
12
2.11 编写针对链表的快速排序程序。
需要保存指针信息。下面给出双向链表的快速排序算法 void fast_sort( Sdata *a, Sdata *f, Sdata *t ) { Sdata *i,*j,k,p; i = f; j = t; if ( t->lnext != f ) { k = a->data; //用于比较的基准数值 i = f; j = t; p = -1; while ( j != i )
2010-12-#43;k) && (c<s+n) ) //比较 比较 { if ( a[b] < a[c] ) r[m++] = a[b++]; else r[m++] = a[c++]; } if ( b == s+k ) for ( b=c; b<s+n; b++) r[m++] = a[b]; else for ( c=b; c<s+k; c++) r[m++] = a[c]; for ( m=0; m<n; m++) a[s++] = r[m]; } delete r; }
算法设计与分析习题
第二章 分治与递归
2010-12-28
1
2.1 对于顺序查找算法,分析目标值存在于数组中的 概率p趋于0的含义,这种情况下平均查找次数有什么 样的变化?当p趋于1时呢? 见教材P12。平均比较次数为 n - p(n-1)/2。 p趋于0,平均次数趋于n;p趋于1时,平均次数趋于 (n+1)/2。(求极限)
2010-12-28
13 6 17 9 14 19
6
5
2.6 向一棵空二叉树中依次插入如下元素值:8,9, 10,2,1,5,3,6,4,7,11,12,要求每插入一 个元素后的二叉树都是二叉排序树,画出每次插入元 素后的二叉排序树。 8 9 2 10 1 5 3 4 6 7 11 12
2010-12-28
2010-12-28 13
if ( p == 1 ) {
//从链表前面向后寻找比基准值大的数 从链表前面向后寻找比基准值大的数
while ( (j != i) && (i->data <= k) ) i = i->rnext; j->data = i->data; p = -1; } else { //从链表最后向前寻找比基准值小的数 从链表最后向前寻找比基准值小的数 while ( (j != i) && (j->data >= k) ) j = j->lnext; i->data = j->data; p = 1; } i->data = k; fast-sort( a, f, i->lnext ); //递归 递归 fast-sort( a, i->rnext, t ); } }
2010-12-28 8
2.8 针对平衡 的二叉排序树LR型失衡的情况,写出调整使之恢 复平衡的算法。 2 A C 0
B
-1 0 C B 0 A 0
A为最下部的失衡结点。
2010-12-28
9
破坏平衡的原因是由于在A的左子女(L)的右子树(R) 中插入结点,使A的平衡因子由-1变为-2而失去平 衡。 调整规则∶ a、 设C为A的左子女的右子女,将A的孙子结点C提升 为新二叉树的根; b、 原C的父结点B连同其左子树向左下旋转成为新根 C的左子树,原C的左子树成为B的右子树; c、 原根A连同其右子树向右下旋转成为新根C的右子 树,原C的右子树成为A的左子树。
2010-12-28
11
2.10 用快速排序法对如下的数据进行排序:45,23, 65,57,18,2,90,84,12,76。说明第一遍扫描的 具体过程。
45 45,23,65,57,18,2,90,84,12,76 12,23,65,57,18,2,90,84,45,76 12,23,65,57,18,2,90,84,45,76 12,23,45,57,18,2,90,84,65,76 12,23,45,57,18,2,90,84,65,76 12,23,2,57,18,45,90,84,65,76 12,23,2,57,18,45,90,84,65,76 12,23,2,45,18,57,90,84,65,76 12,23,2,45,18,57,90,84,65,76 12,23,2,18,45,57,90,84,65,76
2010-12-28 16
2.13 应用分治策略完成下面的整数乘法计算: 2348×3825。 套用公式(书上26) 2348 = 23*102 + 48, 3825 = 38*102 + 25 结果为:8981100
2.14 应用Strassen算法完成下面的矩阵乘法运算。 套用公式(书上28)
2010-12-28
2
2.2 对于折半查找算法,分析目标值存在与数组 中的概率p对算法的时间复杂度的影响。 见教材P12。平均比较次数为log2n。 平均次数与p关系不大,趋向于log2n。
2010-12-28
3
2.3 在一个由10个元素构成的数组中,用折半查找法 查各个位置上元素分别需要进行多少次元素值的比较? 数组元素 0 1 2 3 4 5 6 7 8 9 分别对应的比较次数 3 2 3 4 1 3 4 2 3 4