第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、多项式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)定义:指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。
算法之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)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
电子学会2023年09月份青少年软件编程Python等级考试四级真题(含答案和解析)
2023年9月电子学会Python四级考试真题(含答案和解析)分数:100 题数:38 测试时长:90min一、单选题(共25题,共50分)1、用枚举算法求解“100以内既能被3整除又能被4整除的元素”时,在下列数值范围内,算法执行效率最高的是?(D)A.1~101B.4~100C.12~100D.12~96答案解析:在选取循环控制变量时,枚举范围应尽可能小,但又不能遗漏。
2、下列有关函数的描述中,正确的是?(C)A.函数中必须有return语句B.在函数内部不能使用全局变量C.函数能提高应用的模块化程度和代码的重复利用率D.函数内容以大括号起始,并且缩进答案解析:函数能提高应用的模块化程度和代码的重复利用率3、下列哪个语句能够定义参数个数不确定的函数?(D)A.hs(parameters)B.hs(parameters[])C.hs(parameters{})D.hs(*parameters)答案解析:当不确定需要传入的值是多少个时,在定义形参时,可以使用*parameters来表示。
4、执行如下Python代码的结果是?(A)def area(r,pi=3.14):return r*r*piprint(area(2,10))A.40B.200C.400D.20答案解析:函数运行结果,2*2*10,结果是40。
5、执行如下Python代码,输出结果是?(A)def hs(num):num += 1return numn=10s=hs(n)print(s)A.11B.10C.1D.运行错误答案解析:函数的返回值,赋值给变量s,输出11。
6、有如下Python程序,输出的结果是?(B)def whao(year = '2023'):print('你好' + year)whao()A.你好B.你好2023C.你好yearD.没有输出答案解析:定义了一个名为 whao 的函数,它有一个默认参数 year,其默认值为 '2023'。
第2章 递归与分治_作业答案
• 练习3:分析Strassen矩阵乘法在时间效率上有何 改进,为什么?
• Strassen矩阵乘积分治算法中,用了7次对于n/2阶 矩阵乘积的递归调用和18次n/2阶矩阵的加减运算。 由此可知,该算法的所需的计算时间T(n)满足如 下的递归方程: O1 n2
T n 2 7 T n / 2 O n
• 要求:
– 设计算法; – 写出该算法时间函数T(n)的递推关系式; – 分析其时间复杂度和空间复杂度。
关于集合划分问题的分析
• 例如:集合 { 1, 2, 3 } 有五个划分
– { {1}, {2}, {3} }, – { {1, 2}, {3} },{ {1, 3}, {2} },{ {1}, {2, 3} }, – { {1, 2, 3} }。 • 算法设计要求:给定正整数n 和m,计算出n 个元素的集 合{1,2,., n }可以划分为多少个不同的由m 个非空子集组成 的集合。 • 数据输入:由文件input.txt 提供输入数据。文件的第1 行 是元素个数n 和非空子集数m。 • 结果输出:程序运行结束时,将计算出的不同的由m个非 空子集组成的集合数输出到文件output.txt 中。
课后练习(选做)
• 练习6:假设有n个项的数组A,每个项具有一个 不同的数。告诉你值A[1],A[2],…,A[n]的序列是单 峰的:对于某个在1与n之间的下标p,数组项的值 增加到A中的位置p,然后剩下的过程减少直到位 置 n。 • 要求:
– 利用分治策略设计一个算法,读尽可能少的元 素,找到这个“顶峰”元素p。
T(n) = 3T(n/4) + nlogn
• 练习2:分析如下时间函数的复杂度,并说明原因。
1. 利用递归树说明以下时间函数的复杂度:
算法分析设计期末复习
通过解递归方程
logm n1
T (n) nlogm k k j f (n / m j ) j0
学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
基本运算Oi的执行次数ei分别进行统计分析。 – T(N,I)还需进一步简化,只在某些有代表性的合法输
入中去统计相应的ei来评价其复杂性。 – 一般只考虑三种情况下的时间性:最坏情况、最好
情况和平均情况下的复杂性,分别记为Tmax(N)、 Tmin(N)和Tavg(N)
四种渐近意义下的符号
• 四种渐近意义下的符号 –O –Ω –θ –o
}
----------------------------------------------------------------------------------------
CheckNum( T , p , q , element): ▹计算T[p..q]中element出现的次数
{ cnt ← 0
• 思路二:直接统计各 元素出现的次数,用 某一线性数据结构 存储统计结果(例如 用一个辅助数组存 储统计结果,统计时 用数组下标对应相 应元素)
第三章:动态规划
动态规划算法的基本思想
• 动态规划算法的基本思想
– 其基本思想与分治算法的思想类似——分而治之 – 与分治法的不同之处
• 分解后的子问题往往不互相独立; • 采用记录表的方法来保存所有已解决问题的答案
考虑时间 资源
大学_计算机算法设计与分析第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版)》;并免费提供电子课件和教学服务。
算法设计与分析习题第二章分治与递归
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章基本数据结构及算法习题参考答案习题2参考答案1.分别写出求两个正整数最⼤公约数的递推与递归算法。
参考答案:int gcd(int x, int y){ int a, b, t, r;a=x; b=y;if (a{ t=a; a=b; b=t; }r=a%b;while (r!=0){ a=b; b=r; r=a%b; }return(b);}int gcd(int x, int y){ int a, b, t, r;a=x; b=y;if (a{ t=a; a=b; b=t; }if(a%b==0) return b;else gcd(b, a%b);}2.编写将⼀个⼗进制整数转换成⼆进制数的递归算法。
参考答案:void dec_to_bin(int num,int base)//base为2{if(num>0){dec_to_bin(num/base, base);cout<}}3.利⽤减半递推技术,写出求长度为n(n=2k)的⼀维数组中的最⼩元素的递归算法。
参考答案:return x>y?y:x;}int minnum(int a[ ],int n){int *p,*q;q=&a[n/2];p=a;if(n==1) return a[0];else return min(minnum(p,n/2),minnum(q,n/2));}4.试写出将⼀个元素插⼊到有序线性表中的算法。
参考答案:int insert(int a[ ], int b, int n ,int m){ if (n = =m) printf("overflow");else{ if (n= =0) a[n]= b;else{ i=n-1;while((i>=0)&&(a[i]>b)){ a[i+1]=a[i];i=i-1;}a[i+1]= b;}n=n+1;}return n;}5.编写⼀个算法,将两个线性表合并成⼀个有序表。
算法导论第二章答案
第二章算法入门由于时间问题有些问题没有写的很仔细,而且估计这里会存在不少不恰当之处。
另,思考题2-3 关于霍纳规则,有些部分没有完成,故没把解答写上去,我对其 c 问题有疑问,请有解答方法者提供个意见。
给出的代码目前也仅仅为解决问题,没有做优化,请见谅,等有时间了我再好好修改。
插入排序算法伪代码INSERTION-SORT(A)1 for j ←2 to length[A]2 do key ←A[j]3 Insert A[j] into the sorted sequence A[1..j-1]4 i ←j-15 while i > 0 and A[i] > key6 do A[i+1]←A[i]7 i ←i − 18 A[i+1]←keyC#对揑入排序算法的实现:public static void InsertionSort<T>(T[] Input) where T:IComparable<T>{T key;int i;for (int j = 1; j < Input.Length; j++){key = Input[j];i = j - 1;for (; i >= 0 && Input[i].CompareTo(key)>0;i-- )Input[i + 1] = Input[i];Input[i+1]=key;}}揑入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j-1]后,将元素A[ j]揑入,形成排好序的子数组A[1..j]这里需要注意的是由于大部分编程语言的数组都是从0开始算起,这个不伪代码认为的数组的数是第1个有所丌同,一般要注意有几个关键值要比伪代码的小1.如果按照大部分计算机编程语言的思路,修改为:INSERTION-SORT(A)1 for j ← 1 to length[A]2 do key ←A[j]3 i ←j-14 while i ≥ 0 and A[i] > key5 do A[i+1]←A[i]6 i ← i − 17 A[i+1]←key循环丌变式(Loop Invariant)是证明算法正确性的一个重要工具。
算法分析教材习题答案(第2章)
第2章算法分析题2-2分析与解答:算法BinarySearch1与教材中的算法BinarySearch 相比,数组段左右游标left 和right 的调整不正确,导致陷入死循环。
算法BinarySearch2与教材中的算法BinarySearch 相比,数组段左右游标left 和right 的调整不正确,导致x=a[n-1]时返回错误。
算法BinarySearch3与正确算法BinarySearch5相比,数组段左右游标left 和right 的调整不正确,导致x=a[n-1]时返回错误。
算法BinarySearch4与正确算法BinarySearch5相比,数组段左右游标left 和right 的调整不正确,导致陷入死循环。
算法BinarySearch5正确,且当数组中有重复元素时,返回满足条件的最右元素。
算法BinarySearch6与正确算法BinarySearch5相比,数组段左右游标left 和right 的调整不正确,导致x=a[n-1]时返回错误。
算法BinarySearch7与正确算法BinarySearch5相比,数组段左右游标left 和right 的调整不正确,导致x=a[0]时陷入死循环。
算法分析题2-5分析与解答:这个问题有更一般的解。
将两个 n 位大整数u 和v 都分割为n/m 位的m 段,可以用2m-1次n/m 位整数的乘法求得uv 的值。
事实上,设x=2n/m ,可以将u 和v 及其乘积w=vu 表示为:U=u 0+u 1x+…+u m-1x m-1,v=v o +v 1x+…+v m-1x m-1W=uv=w 0+w 1x+w 2x 2+...+w 2m-2x 2m-2将u,v 和w 都看作关于变量x 的多项式,并取2m-1个不同的数x1,x2,…x2m-1,代入多项式,可得:U(x i )=u 0+u 1x+…+u m-1x m-1,V(xi)=v o +v 1x+…+v m-1x m-1W(x i )=u(x i )v(x i )= w 0+w 1x+w 2x 2+...+w 2m-2x 2m-2用矩阵形式表示为:w(x 1) 1 x 1 x 12 … x 12m-2 w 0w(x 2) = 1 x 2 x 22 … x 22m-2 w 1. .. . .... .W(x 2m-1) 1 x 2m-1 x 2m-12 ... x 2m-12m-2 w 2m-2设 B= =B -1其中,W(x i )=u(x i )v(x i )是两个n/m 位数的乘法去处,共有2m-1个乘法,其他均为加减法或数乘运算。
分治复习(二分答案)
分治法
如果我们将分治策略用于此问题,每次将问题分成大致相等的两
部分,分别在这两部分中找出最大值与最小值,再将这两个子问 题的解组合成原问题的解,就可得到该问题的分治算法。此算法 的时间效率稳定为3n/2-2。算法描述如下:
合并排序
算法思路:
若n为1,算法终止;否则,将n个待排元素 分割成k(k=2)个大致相等子集合A、B,对每 一个子集合分别递归排序,再将排好序的子 集归并为一个集合。
三色二叉树
问题描述
一棵二叉树可以按照如下规则表示成一个 由0、1、2组成的字符序列,我们称之为 “二叉树序列S”: 例如,下图所表示的二叉树可以用二叉树 序列S=21200110
题目 天梯:2462 三色二叉树
你的任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿 色或蓝色。并且,一个节点与其子节点的颜色必须也必须不相同。给定一棵二叉树的二叉树 序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。 输入文件 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列。 输出文件 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被 染成绿色。 样例输入 1122002010 样例输出 52
快排主要代码
棋盘覆盖问题
问题提出
在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方 格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。 在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给 定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨 牌不得重叠覆盖。
分治法求解基本思想
poj 3714
第2章递归与分治法
分治法的设计思想是,将一个难以直接解决的大问题, n = T(n) 分割/2 n/2 n/2 n/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 5
6
实现这种递归调用的关键是为 过程建立递归调用工作栈。通常, 在一个过程中调用另一过程时,系 统需在运行被调用过程之前先完成3
件事:
7
(1)将所有实参指针,返回地址等信
息传递给被调用过程;
(2)为被调用过程的局部变量分配存 储区;
(3)将控制转移到被调用过程的入
口。
8
在从被调用过程返回调用过程
20
例1:二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中 找出一特定元素x。 分析: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
16
|P|表示问题P的规模。 N0为一阈值,表示当问题P 的规模不超过n0时,
问题已容易直接解出,不必再继续分解。
ADHOC(P)是该分治法中的基本子算法,用于 直接解小规模的问题P。 算法MERGE(yl,…,yk,y)是该分治法中的 合并子算法
17
实践表明:
在用分治法设计算法时,最好使子问
T(n)
n/2
=
n/2
n
n/2 n/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 4
分治法习题参考答案
第4章书面作业参考答案:一、 设计递归算法求解如下多项式:)!12()1(...!7!5!3)(12753+-++-+-=+n xxx x x x f n n(1) 写出递归表达式(基础步、归纳步)。
(2) 分析时间复杂度。
(写出递归方程,不用求解)解:(1)321)1(2231)1()1(!3)2(1)1(223⋅⋅⋅-=⋅⋅⋅-+=-===x temp temp x temp f x x f xtemp x f.....542)1(3542)1()2(!5!3)3(2253⋅⋅⋅-=⋅⋅⋅-+=+-=x temp temp x temp f x x x f根据推导得递归方程为:⎪⎩⎪⎨⎧+-=--⋅-⋅-===(归纳)基础步][)1()()12)(22(]1[)1(][)(]1[,)1(2n temp n f n fn n x n temp n temp x temp x f(2)时间复杂性分析:⎩⎨⎧+-=O =)1()1()()1()1(O n T n T T用递推法求解:(未求解不扣分))()1()1()1(...2)1()2()1()1()(n n O T O n T O n T n T O =-⋅+==⋅+-=+-=其中,递归算法描述如下:(未写算法不扣分)输入:x, n输出:f(x)的前n 项之和double Fun(double x, int n , double &temp){if(n==1){temp = x;return x;}double temp1,lastvalue;lastvalue = Fun(x,n-1,temp1);temp = (-1)*temp1*x*x/((2*n-1)*(2*n-2));return lastvalue + temp;}二、P114 22解:(1)算法思想:划分步:将数组分为基本等长的两部分治理步:若n=2,则直接比较若n>2,则递归求两部分的最大值、次大值组合步:假设两部分求得的最大值和次大值分别为x1,y1;x2,y2。
算法设计与分析(第二版) 第2章
1
,n 1
T
(n)
2T (n
1)
1 ,n
1
不失一般性,设n为2的幂。由数学归纳法容易得出,该递归 方程的解为2n-1,即O(2n)。
从上述例子可见,当算法包含调用自身的过程时,其运 行时间可用递归方程(recurrence equation)描述。本节介绍三 种求解递归方程的方法。这三种方法分别是替换方法(subs titution method)、递归树方法(recursion-tree method)和主方法 (master method)。
递归过程在实现时,可用一个等价的递归栈来实现过程 的嵌套调用。递归的深度就是在整个计算中过程嵌套调用的 最大程度。通常,深度取决于输入规模。因此,对于大型问 题,栈所需的空间可能妨碍我们使用递归方法求解。图2-3 表示n=4时汉诺塔算法的运行过程。
图 2-3 汉诺塔的运行过程(n=4)
汉诺塔算法的时间复杂度为指数级的复杂度。以下做一 简要证明。假设汉诺塔算法的时间复杂度为T(n),由递归算
2.1.2 替换方法 用替换方法解某个递归方程时,分为两步。首先猜测问
题解的某个界限,然后用数学归纳法证明所猜测解的正确性。 例2.4 利用替换方法解递归方程T(n)=2T(n/2)+n。 解 我们猜测其解为T(n)=O(n lb n)。假设这个界限对
于[n/2]成立,即存在某个常数c,T([n/2])≤c([n/2]) lb([n/2])成立。现在要证明T(n)≤cn lb n。将假设代入递归
第2章 分治法
2.1 递归与递归方程
2.1.1 递归的概念 递归(recursion)是数学与计算机科学中的基本概念。程
序设计语言中的递归程序可被简单地定义为对自己的调用。 递归程序不能总是自我调用,否则就会永不终止。因此,递 归程序必须有终止条件。尽管递归程序在执行时间上往往比 非递归程序要付出更多的代价,但有很多问题的数学模型或 算法设计方法本来就是递归的,用递归过程来描述它们不仅 非常自然,而且证明该算法的正确性要比用相应的非递归形 式容易得多,因此递归不失为一种强有力的程序设计方法。 下面我们来看几个利用递归的例子。
算法练习题-分章节-带答案
)算法练习题-分章节-带答案算法练习题---算法概述一、选择题1、下面关于算法的描述,正确的是()A、一个算法只能有一个输入B、算法只能用框图来表示C、一个算法的执行步骤可以是无限的D、一个完整的算法,不管用什么方法来表示,都至少有一个输出结果2、一位爱好程序设计的同学,想通过程序设计解决“韩信点兵”的问题,他制定的如下工作过程中,更恰当的是()A、设计算法,编写程序,提出问题,运行程序,得到答案B、分析问题,编写程序,设计算法,运行程序,得到答案C、分析问题,设计算法,编写程序,运行程序,得到答案D、设计算法,提出问题,编写程序,运行程序,得到答案3、下面说法正确的是()A、算法+数据结构=程序B、算法就是程序C、数据结构就是程序D、算法包括数据结构4、衡量一个算法好坏的标准是()。
A、运行速度快B、占用空间少C、时间复杂度低D、代码短5、解决一个问题通常有多种方法。
若说一个算法“有效”是指( )。
A、这个算法能在一定的时间和空间资源限制内将问题解决B、这个算法能在人的反应时间内将问题解决C、这个算法比其他已知算法都更快地将问题解决D、A和C6、算法分析中,记号O表示(),记号Ω表示()。
A.渐进下界B.渐进上界C.非紧上界D.非紧下界7、以下关于渐进记号的性质是正确的有:()A.f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB.f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D.f(n)O(g(n))g(n)O(f(n))=⇔=8、记号O的定义正确的是()。
A. O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤ f(n) ≤ cg(n) };B. O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥n0有:0≤ cg(n) ≤ f(n) };C. O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有0 ≤f(n)<cg(n) };D. O(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥n0有:0 ≤cg(n) < f(n) };9、记号Ω的定义正确的是()。
算法设计与分析习题解答(第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)。
• 练习3:分析Strassen矩阵乘法在时间效率上有何 改进,为什么?
• Strassen矩阵乘积分治算法中,用了7次对于n/2阶 矩阵乘积的递归调用和18次n/2阶矩阵的加减运算。 由此可知,该算法的所需的计算时间T(n)满足如 下的递归方程: O1 n2
T n 2 7 T n / 2 O n
具体执行过程:求最大值
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
课后练习
• 练习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
课后练习
• 练习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
n2
T(n)=O(nlog7)≈O(n2.81)
较大的改进
课后练习
• 练习4:划出下列序列在快速排序过程中一次 划分的具体步骤。
21 25 49 25* 16 08
一次划分的过程
初始关键字
pivotkey 21 low 08 08 08 08 08 25 49 25* 16 08 high 21 high 25
T(n) = 3T(n/4) + nlogn
• 练习2:分析如下时间函数的复杂度, T ( n) 3T ( n ) O( n) 4 n1 n1
• 递归树的高度为:log4n+1;
• 除去叶子结点,树有log4n层,每层结点总数为:
时间复杂性分析
• 该算法的时间函数的递推式为:
O(1) n1 T (n) n T ( ) O(1) n 1 2
• 该算法的时间复杂度为:O(log2n)
课后练习(选做)
• 练习7:假设你正在为一个小的投资公司咨询,他们有下 面类型的问题想要一次又一次的求解。这个问题的一个 典型实例如下所述。他们正在做一项模拟,在这项模拟 中他们从过去的某点开始对一只给定的股票连续看n天。 让我们把这些天记为数i=1,2,…,n;对每天i,他们有当天 这只股票每股的价格p(i)(简单起见,假设这个价格在一 天之内是固定的)。假设在这个时间区间内,某天他们 想买1000股并且在以后的某天卖出所有这些股。他们想 知道:为了挣到最多的钱,他们应该什么时候买并且什 么时候应该卖?
• 要求:
– 设计算法; – 写出该算法时间函数T(n)的递推关系式; – 分析其时间复杂度和空间复杂度。
关于集合划分问题的分析
• 例如:集合 { 1, 2, 3 } 有五个划分
– { {1}, {2}, {3} }, – { {1, 2}, {3} },{ {1, 3}, {2} },{ {1}, {2, 3} }, – { {1, 2, 3} }。 • 算法设计要求:给定正整数n 和m,计算出n 个元素的集 合{1,2,., n }可以划分为多少个不同的由m 个非空子集组成 的集合。 • 数据输入:由文件input.txt 提供输入数据。文件的第1 行 是元素个数n 和非空子集数m。 • 结果输出:程序运行结束时,将计算出的不同的由m个非 空子集组成的集合数输出到文件output.txt 中。
– 分析该算法的时间复杂性。
问题分析
• 何为“单峰”?
– 对于某个在1与n之间的下标p,数组项的值增 加到A中的位置p,然后剩下的过程减少直到 位置n; – 即在A[1]到A[n]的n个数中,只有一个极大值 A[p]; – A[p]前的元素均小于A[p],并按升序排列;
– A[p]后的元素均小于A[p],并按降序排列。
• 则算法是在下面三个可能的解中最好的: – S上的最优解 – S’上的最优解 – p(j)-p(i)的最大值,对所有的i∈S且j∈S’ • 前两个选择中的每一个在T(n/2)时间内被递归地计算;
• 第三个选择通过找S中的最小与S’中的最大而计算,该操 作需要O(n)时间。
• 则运行时间的递推关系式是: T ( n) 2T ( n ) O( n) 2 • 则算法的时间复杂度为:O(nlog2n)。
问题分析、举例说明
• 利用分治策略设计一个算法。
• 举例:
– 假设n=3, p(1)=9, p(2)=1, p(3)=5. 那么应该得出“2买,3 卖”的结论。即,在第2天买并且在第3天卖意味着每股 将挣4美元,是这个期间最大的收益。 • 问题分析: – 存在一个简单的算法,时间复杂度是O(n2):对所有的 买天/卖天构成的对进行尝试,看看哪个对能使用户挣 到最多的钱。 – 假设在第i天买、第j天卖可以获得最大收益:最优解。
一次交换
二次交换
三次交换
四次交换 完成一趟排序
25 49 low 21 49 low 16 49
16 16
25* 16
25*
16 high 25* 21 25 high low 21 25* 49 25 low high 21 25* 49 25
low high
课后练习
• 练习5:算法实现题2-8(教材第42页)集合划 分问题。
• 如果要求F(4,2)该怎么办呢?
A. 往①里添一个元素{4},得到{{1,2,3},{4}}
B. 往②里的任意一个子集添一个4,得到 {{1,2,4},{3}},{{1,2},{3,4}},
{{1,3,4},{2}},{{1,3},{2,4}},
{{2,3,4},{1}},{{2,3},{1,4}} ∴F(4,2)=F(3,1)+2*F(3,2)=1+2*3=7
• 递归公式:
– 设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)
• 考虑3个元素的集合,可划分为 – ① 1个子集的集合:{{1,2,3}} – ② 2个子集的集合:{{1,2},{3}},{{1,3},{2}}, {{2,3},{1}} – ③ 3个子集的集合:{{1},{2},{3}} ∴F(3,1)=1;F(3,2)=3;F(3,3)=1;
课后练习(选做)
• 练习6:假设有n个项的数组A,每个项具有一个 不同的数。告诉你值A[1],A[2],…,A[n]的序列是单 峰的:对于某个在1与n之间的下标p,数组项的值 增加到A中的位置p,然后剩下的过程减少直到位 置 n。 • 要求:
– 利用分治策略设计一个算法,读尽可能少的元 素,找到这个“顶峰”元素p。
c2 n (1 3 ( 3 ) 2 ( 3 )log4 n1 ) 4 4 4
• 最后一层叶子结点数: 3log4 n nlog4 3
换底公式
2. 利用主定理说明以下时间函数的复杂度:
T(n) = 16T(n/4) + n T(n) = T(3n/7) + 1 T(n) = 3T(n/4) + nlogn 定理(主定理): a≥1且b>1是常数, f(n)是一个函数,T(n)由 如下的递推式定义:T(n)=aT(n/b)+f(n),式中,n/b指n/b或 n/b,则T(n)有如下的渐近界: (1)若对于某常数є>0,有f(n)=O(nlogba-є),则T(n)=(nlogba); (2)若f(n)=(nlogba ),则T(n)=(nlogbalogn); (3)若对于某常数є>0,有f(n)=(nlogba+є ),且对于某个常数 c<1和所有足够大的n,有af(n/b)≤cf(n),则T(n)=(f(n))。
• 如果A[n/2]比A[n/2-1]和A[n/2+1]都大,顶峰项实际上就等 于A[n/2]。
具体算法:伪代码
int Danfeng(int A[], int m, int n) { //求单峰数组中的顶峰值 int k=(m+n)/2; if(k==m&&k==n) return A[k]; if(A[k-1]<A[k]&&A[k]>A[k+1]) return A[k]; else { if(A[k-1]<A[k]&&A[k]<A[k+1]) Danfeng(A[], k+1, n); if(A[k-1]>A[k]&&A[k]>A[k+1]) Danfeng(A[], m, k-1); } }
具体算法:伪代码
int MaxProfit(int p[], int m, int n) { //求第m到第n天内一次买卖股票的最大收益 int i=m, j=(m+n)/2+1; //在第i天买入股票,并在第j天卖出股票 int k; int max1, max2, max3; //三个可能的最优解 max1=MaxProfit(p, m, (m+n)/2); // S上的最优解 max2=MaxProfit(p, (m+n)/2+1, n); // S’上的最优解 for(k=m+1;k<=(m+n)/2;k++) //求最小p(i) if(p(i)>p(k)) p(i)=p(k); for(k=(m+n)/2+2;k<=n;k++) //求最大p(j) if(p(j)<p(k)) p(j)=p(k); max3=p(j)-p(i); return 最大值(max1, max2, max3); } //最优解