算法设计与分析(二)

合集下载

电子科技大学研究生算法设计与分析拟考题及答案评分细则 (2)

电子科技大学研究生算法设计与分析拟考题及答案评分细则 (2)

一、Please answer T or F for each of the following statements to indicate whether thestatement is true or false1. An algorithm is an instance, or concrete representation, for a computer programin some programming language. ( F )2. The following problem is a Decision Problem: What is the value of a bestpossible solution? ( F )3. The dynamic programming method can not solve a problem in polynomial time.( F)4. Assume that there is a polynomial reduction from problem A to problem B. Ifwe can prove that A is NP-hard, then we know that B is NP-hard. ( F )5. If one can give a polynomial-time algorithm for a problem in NP, then all theproblems NP can be solved in polynomial time. ( F )6. In an undirected graph, the minimum cut between any two vertices a and b isunique. ( F)7. Linear programming can be solved in polynomial time, but integer linearprogramming can not be solved in polynomial time. ( T )8. We can solve the maximum independent set problem in a graph with at most100 vertices in polynomial time. ( T ) 结论9. If an algorithm solves a problem of size n by dividing it into two subproblems ofsize n/2, recursively solving each subproblems, and then combine the solutions in linear time. Then the algorithm runs in O(n log n) time. ( T )10. Neural Computation, Fuzzy Computation and Evolution Computing are thethree research fields of Computational Intelligence. ( T )二、Given the following seven functions f1(n) = n5+ 10n4, f2(n) = n2+ 3n, f3(n) =f4(n) = log n + (2log n)3, f5(n) = 2n+n!+ 5e n, f6(n) = 3log(2n) + 5log n, f7(n) = 2n log n+log n n. Please answer the questions:第 1 页共5 页(a) Give the tight asymptotic growth rate (asymptotic expression with θ) to eachof them; (7分)(b) Arrange them in ascending order of asymptotic growth rate。

算法分析与设计(线下作业二)

算法分析与设计(线下作业二)

算法分析与设计(线下作业⼆)《算法分析与设计》学习中⼼:专业:学号:姓名:作业练习⼆⼀、名词解释1、MST性质2、⼦问题的重叠性质递归算法求解问题时,每次产⽣的⼦问题并不总是新问题,有些⼦问题被反复计算多次,这种性质称为⼦问题的重叠性质。

⼆、简答题1、简述动态规划算法求解的基本要素。

答:动态规划算法求解的基本要素包括:1)最优⼦结构是问题能⽤动态规划算法求解的前提;2)动态规划算法,对每⼀个⼦问题只解⼀次,⽽后将其解保存在⼀个表格中,当再次需要解此⼦问题时,只是简单地⽤常数时间查看⼀下结果,即重叠⼦问题。

2、备忘录⽅法和动态规划算法相⽐有何异同简述之。

答:备忘录⽅法是动态规划算法的变形。

与动态规划算法⼀样,备忘录⽅法⽤表格保存已解决的⼦问题的答案,在下次需要解此问题时,只要简单地查看该⼦问题的解答,⽽不必重新计算。

备忘录⽅法与动态规划算法不同的是,备忘录⽅法的递归⽅式是⾃顶向下的,⽽动态规划算法则是⾃底向上递归的。

因此,备忘录⽅法的控制结构与直接递归⽅法的控制结构相同,区别在于备忘录⽅法为每个解过的⼦问题建⽴了备忘录以备需要时查看,避免了相同的⼦问题的重复求解,⽽直接递归⽅法没有此功能。

3、贪⼼算法求解的问题主要具有哪些性质简述之。

答:贪⼼算法求解的问题⼀般具有⼆个重要的性质:⼀是贪⼼选择性质,这是贪⼼算法可⾏的第⼀个基本要素;另⼀个是最优⼦结构性质,问题的最优⼦结构性质是该问题可⽤贪⼼算法求解的关键特征。

三、算法编写及算法应⽤分析题1、设计求解如下最⼤⼦段和问题的动态规划算法。

只需给出其递推计算公式即可。

最⼤⼦段和问题:给定由n 个整数(可能为负整数)组成的序列a1a2 … an,求该序列形如Σi≤k≤j ak的⼦段和的最⼤值。

当所有整数均为负整数时定义其最⼤⼦段和为0。

依次定义,所求的最优值为max{0, max1≤i≤j≤n Σi≤k≤j ak }。

2、关于多段图问题。

设G =(V ,E)是⼀个赋权有向图,其顶点集V 被划分成k>2个不相交的⼦集V i :1i k ≤≤,其中,V 1和V k 分别只有⼀个顶点s (称为源)和⼀个顶点t (称为汇),图中所有的边(u,v ),i u V ∈,1i v V +∈。

算法设计与分析第二版

算法设计与分析第二版

算法设计与分析第二版1. 前言算法是程序设计中最重要的一环,它是计算机科学的核心。

算法设计与分析是指对算法的设计、实现和错误的检测以及对算法效率的分析。

随着计算机软件和硬件技术的日新月异,人们对计算机处理能力的需求不断提高,研究和开发高效的算法成为了人们追求的目标。

因此,算法设计与分析在计算机科学中的地位越来越重要。

2. 算法设计我们常常需要设计一些算法解决具体问题。

所谓算法就是通过按照一定规则和步骤(计算过程)来实现某一种功能的一种描述。

为了更好地实现算法,我们可以通过以下几个方面加以考虑:2.1 正确性设计算法首要考虑的是其正确性。

一个算法的正确性是指其能够正确地实现所需要的功能。

正确性是设计算法的必要条件。

2.2 可读性设计算法的目的不仅仅是为了完成特定的功能,还需要考虑到算法的可读性。

可读性使得算法更加易于理解,便于后续维护和修改。

在实际开发中,算法的可读性经常成为考虑的一个重点。

2.3 可维护性随着业务的不断变化,经常需要对算法进行维护和改进,因此所设计的算法需要考虑到其可维护性,具体表现在代码的可扩展性、可重用性等。

算法具有高可维护性的优势,可以降低程序错误率,提升程序的健壮性。

3. 算法分析算法分析是指对算法的效率进行分析。

具体包括时间复杂度和空间复杂度。

算法的效率是指算法所需要的时间或者空间资源量。

我们通常采用复杂度来描述算法的效率。

3.1 时间复杂度时间复杂度通常指的是算法的运行时间。

计算时间复杂度时,需要确定算法的基本操作次数和各操作之间的顺序,然后计算基本操作次数所占的时间。

3.2 空间复杂度空间复杂度通常指的是算法所需内存的大小。

在实际程序设计中,除了考虑时间复杂度还需要考虑空间复杂度问题。

算法占用空间大小的分析用于程序性能评估和程序优化。

4. 结论本文简要介绍了算法设计和算法分析的基础知识。

算法设计是指对算法的设计、实现和错误的检测以及对算法效率的分析。

算法分析包括时间复杂度和空间复杂度两个方面。

(陈慧南 第3版)算法设计与分析——第2章课后习题答案

(陈慧南 第3版)算法设计与分析——第2章课后习题答案

因此 T (n) (n 2 ) (3) a 28, b 3, f n cn3
nlogb a nlog3 28 n3.033 ,则 f (n) c n 2 (nlogb a - ) ,其中可取 =0.04 。符合主定理
的情况 1 ,因此 T (n) (n3.033 )
21 21 当 n n0 时, f n g n ,所以 f n = g n 2 2
(2) f n n 2 logn , g n n log 2 n
2 当 n 4 时, f n n 2 logn n 2 , g n n log 2 n n 。因此可取 n0 4, c 1 ,当
g n
(1) f n 20n logn , g n n+ log 3 n
f n 20n logn 21n , g n n+ log 3 当 n 3 时, logn n log3 n 2n n 因此
因此可取 n0 3, c
f n g n ,所以 f n = g n
2-12 将下列时间函数按增长率的非递减次序排列
3 2
n
, log n , log 2 n , n log n , n ! , log(log(n)) , 2 n , n1 log n , n 2
答: n1 log n
f ( n ) ( n m )
证明:
f (n) am nm am1nm1 a1n a0 F (n) am n m am1 n m1
a1 n a0
由 F (n) 单调性易知,存在 nt 0 ,使得 F (n) 取 n 1 ,且 nt0 nt , F (nt0 ) 0 ,则 当 n nt0 时, F (n) 0 即: f (n) am n m am1 n m1

算法设计与分析(第2版) 郑宗汉 第1章-1

算法设计与分析(第2版) 郑宗汉 第1章-1

8
Байду номын сангаас
学习要求
深刻理解每一类算法的思想及其实现
能熟练运用所学知识解决实际问题
培养提高计算思维能力
9
考核方式
Homework and Reading: 20%
Final Exam (Written Test): 80%
10
第1章 算法的基本概念
1.1 引言
1.1.1 算法的定义和特性
c %3 0
(1.1.3)
16
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 分析发现:只能买到n/5 4. k = 0; 只公鸡,n/3只母鸡,将 5. for (a = 0; a <= n; a++) { 算法进行改进。 6. for ( b = 0; b <= n; b++) { 7. for (c = 0; c <= n; c++) { 8. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. } 14. } 15. } 16. } 17. }

算法设计与分析(第2版)

算法设计与分析(第2版)
该教材在编写过程中参考了很多同行的教材和络博客,特别是“牛客”中企业面试、笔试题和资源,河南工 程学院张天伍老师和使用该教材第1版的多位老师指正多处问题和错误。
出版工作
2018年8月1日,该教材由清华大学出版社出版。
内容简介
内容简介
全书由12章构成,各章的内容如下。
第1章概论:介绍算法的概念、算法分析方法和STL在算法设计中的应用。
教材目录
教材目录
(注:目录排版顺序为从左列至右列 )
教学资源
教学资源
该教材配有配套教材——《算法设计与分析(第2版)学习与实验指导》,该配套教材涵盖所有练习题、上 机实验题和在线编程题的参考答案。
该教材每个知识点都配套了视频讲解,提供PPT课件、源码、答案、教学大纲、题库、书中全部源程序代码 (在VC++6.0中调试通过)等教学资源。
算法设计与分析(第2版)
20xx年清华大学出版社出版的图书
01 成书过程
03 教材目录源 06 作者简介
基本信息
《算法设计与分析(第2版)》是由李春葆主编,2018年清华大学出版社出版的高等学校数据结构课程系列 教材。该教材适合作为高等院校“算法设计与分析”课程的教材,也可供ACM和各类程序设计竞赛者参考。
第5章回溯法:介绍解空间概念和回溯法算法框架,讨论采用回溯法求解0/1背包问题、装载问题、子集和问 题、n皇后问题、图的m着色问题、任务分配问题、活动安排问题和流水作业调度问题的典型算法。
第6章分枝限界法:介绍分枝限界法的特点和算法框架、队列式分枝限界法和优先队列式分枝限界法,讨论 采用分枝限界法求解0/1背包问题、图的单源最短路径、任务分配问题和流水作业调度问题的典型算法。
该教材介绍了各种常用的算法设计策略,包括递归、分治法、蛮力法、回溯法、分枝限界法、贪心法、动态 规划、概率算法和近似算法等,并讨论了各种图算法和计算几何设计算法。书中配有图表、练习题、上机实验题 和在线编程题。

算法设计与分析第二版课后习题及解答(可编辑)

算法设计与分析第二版课后习题及解答(可编辑)

算法设计与分析第二版课后习题及解答算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,n是任意正整数。

除了赋值和比较运算,该算法只能用到基本的四则运算操作。

算法求 //输入:一个正整数n2//输出:。

step1:a1; step2:若a*an 转step 3,否则输出a; step3:aa+1转step 2;5. a.用欧几里德算法求gcd(31415,14142)。

b. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。

a. gcd31415, 14142 gcd14142, 3131 gcd3131, 1618 gcd1618, 1513 gcd1513, 105 gcd1513, 105 gcd105, 43 gcd43, 19 gcd19, 5 gcd5, 4 gcd4, 1 gcd1, 0 1.b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。

连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1?14142 和 2?14142之间,所以欧几里德算法比此算法快1?14142/11 ≈1300 与2?14142/11 ≈ 2600 倍之间。

6.证明等式gcdm,ngcdn,m mod n对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:如果d整除u和v, 那么d一定能整除u±v;如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和rm mod nm-qn;显然,若d能整除n和r,也一定能整除mr+qn和n。

数对m,n和n,r具有相同的公约数的有限非空集,其中也包括了最大公约数。

故gcdm,ngcdn,r7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0mn的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcdm,ngcdn,m并且这种交换处理只发生一次.8.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?1次b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?5次gcd5,8习题1.21.农夫过河P?农夫W?狼 G?山羊 C?白菜2.过桥问题1,2,5,10---分别代表4个人, f?手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c0的实根,写出上述算法的伪代码可以假设sqrtx是求平方根的函数算法Quadratica,b,c//求方程ax^2+bx+c0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D0temp←2*ax1←-b+sqrtD/tempx2←-b-sqrtD/tempreturn x1,x2else if D0 return ?b/2*ael se return “no real roots”else //a0if b≠0 return ?c/belse //ab0if c0 return “no real numbers”else return “no real roots”5. 描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Kii0,1,2,商赋给n第二步:如果n0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法 DectoBinn//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1n]中i1while n!0 doBin[i]n%2;nintn/2;i++;while i!0 doprint Bin[i];i--;9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.算法略对这个算法做尽可能多的改进.算法 MinDistanceA[0..n-1]//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements 习题1.3考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.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章习题2.17.对下列断言进行证明:如果是错误的,请举例a. 如果tn∈Ogn,则gn∈Ωtnb.α0时,Θαgn Θgn解:a这个断言是正确的。

黄宇《算法设计与分析》课后习题解析(二)精选全文

黄宇《算法设计与分析》课后习题解析(二)精选全文

黄宇《算法设计与分析》课后习题解析(⼆)第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,请证明。

复习-算法设计与分析(第2版)-李春葆-清华大学出版社

复习-算法设计与分析(第2版)-李春葆-清华大学出版社

请说明动态规划方法为什么需要最优子结构性质。
答:最优子结构性质是指大问题的最优解包含子问题的最优解。 动态规划方法是自底向上计算各个子问题的最优解,即先计算子 问题的最优解,然后再利用子问题的最优解构造大问题的最优解,因 此需要最优子结构。
求解买股票问题。“逢低吸纳”是炒股的一条成功秘诀。如果你想
输入描述:首先输入一个正整数N(N≤50),接下来输入N个数表 示每顶帽子的价格(价格均是正整数,且小于等于1000)。
输出描述:如果存在第三便宜的帽子,请输出这个价格是多少, 否则输出-1。
输入例子1:
10
10 10 10 10 20 20 30 30 40 40 输出例子1:
30
解:首先对数列a[0..n-1]递增排序,然后删除相邻的重复的 元素,即多个相邻的重复的元素仅仅保留一个。最后返回a[2]即 为所求。对应的完整程序如下:
成为一个成功的投资者,就要遵守这条秘诀:逢低吸纳,越低越买,这 句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价 低。按照这个规则购买股票的次数越多越好,看看你最多能按这个规则 买几次。
输入:第1行为整数N (1≤N≤5000), 表示能买股票的天数。第2行 以下是N个正整数 (可能分多行) ,第i个正整数表示第i天的股价。
基本算法策略
分治法 蛮力法 回溯法 分枝限界法 贪心法 动态规划
相关概念
求解过程 应用条件 算法框架
在算法设计中正确使用算法策略
以下不可以使用分治法求解的是( )。 A.棋盘覆盖问题 B.求序列中最大值问题 C.归并排序 D.0/1背包问题
很多分治法算法都是采用递归实现的,那么是不是任何分治法算法 都只能够采用递归实现呢?
答:递归是算法设计的一种手段,是从编程的角度考虑的,可以将 一个大问题转化为若干个相似的小问题求解,分治法的思路与递归吻合, 所以很多分治法算法是采用递归实现的。

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

算法设计与分析:第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塔问题 的递归算法如下。 } }

(完整word版)北航研究生算法设计与分析Assignment_2

(完整word版)北航研究生算法设计与分析Assignment_2

用分支定界算法求以下问题:某公司于乙城市的销售点急需一批成品,该公司成品生产基地在甲城市。

甲城市与乙城市之间共有n 座城市,互相以公路连通。

甲城市、乙城市以及其它各城市之间的公路连通情况及每段公路的长度由矩阵M1 给出。

每段公路均由地方政府收取不同额度的养路费等费用,具体数额由矩阵M2 给出。

请给出在需付养路费总额不超过1500 的情况下,该公司货车运送其产品从甲城市到乙城市的最短运送路线。

具体数据参见文件:m1.txt: 各城市之间的公路连通情况及每段公路的长度矩阵(有向图); 甲城市为城市Num.1,乙城市为城市Num.50。

m2.txt: 每段公路收取的费用矩阵(非对称)。

思想:利用Floyd算法的基本方法求解。

程序实现流程说明:1.将m1.txt和m2.txt的数据读入两个50×50的数组。

2.用Floyd算法求出所有点对之间的最短路径长度和最小费用。

3.建立一个堆栈,初始化该堆栈。

4.取出栈顶的结点,检查它的相邻的所有结点,确定下一个当前最优路径上的结点,被扩展的结点依次加入堆栈中。

在检查的过程中,如果发现超出最短路径长度或者最小费用,则进行”剪枝”,然后回溯。

5.找到一个解后,保存改解,然后重复步骤4。

6.重复步骤4、5,直到堆栈为空,当前保存的解即为最优解。

时间复杂度分析:Floyd算法的时间复杂度为3O N,N为所有城市的个数。

()该算法的时间复杂度等于DFS的时间复杂度,即O(N+E)。

其中,E为所有城市构成的有向连通图的边的总数。

但是因为采用了剪枝,会使实际运行情况的比较次数远小于E。

求解结果:算法所得结果:甲乙之间最短路线长度是:464最短路线收取的费用是:1448最短路径是:1 3 8 11 15 21 23 26 32 37 39 45 47 50C源代码(注意把m1.txt与m2.txt放到与源代码相同的目录下,下面代码可直接复制运行):#include<stdlib.h>#include<stdio.h>#include<time.h>#include<string.h>#define N 50#define MAX 52void input(int a[N][N],int b[N][N]);void Floyd(int d[N][N]);void fenzhi(int m1[N][N],int m2[N][N],int mindist[N][N],int mincost[N][N]);int visited[N],bestPath[N];void main(){clock_t start,finish;double duration;int i,j,mindist[N][N],mincost[N][N],m1[N][N],m2[N][N]; /* m1[N][N]和m2[N][N]分别代表题目所给的距离矩阵和代价矩阵*/// int visited[N],bestPath[N];FILE *fp,*fw;// system("cls");time_t ttime;time(&ttime);printf("%s",ctime(&ttime));start=clock();for(i=0;i<N;i++){visited[i]=0;bestPath[i]=0;}fp=fopen("m1.txt","r"); /* 把文件中的距离矩阵m1读入数组mindist[N][N] */if(fp==NULL){printf("can not open file\n");return;}for(i=0;i<N;i++)for(j=0;j<N;j++)fscanf(fp,"%d",&mindist[i][j]);fclose(fp); /* 距离矩阵m1读入完毕*/fp=fopen("m2.txt","r"); /* 把文件中的代价矩阵m2读入数组mincost[N][N] */if(fp==NULL){printf("can not open file\n");return;}for(i=0;i<N;i++)for(j=0;j<N;j++)fscanf(fp,"%d",&mincost[i][j]);fclose(fp); /* 代价矩阵m2读入完毕*/input(m1,mindist); /* mindist[N][N]赋值给m1[N][N],m1[N][N]代表题目中的距离矩阵*/input(m2,mincost); /* mincost[N][N]赋值给m2[N][N],m2[N][N]代表题目中的代价矩阵*/for(i=0;i<N;i++) /* 把矩阵mindist[i][i]和mincost[i][i]的对角元素分别初始化,表明城市到自身不连通,代价为0 */{mindist[i][i]=9999;mincost[i][i]=0;}Floyd(mindist); /* 用弗洛伊德算法求任意两城市之间的最短距离,结果存储在数组mindist[N][N]中*//*fw=fopen("1.txt","w");for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(fw,"%4d ",mindist[i][j]);fprintf(fw,"\n");}fclose(fw);// getchar();//*/Floyd(mincost); /* 用弗洛伊德算法求任意两城市之间的最小代价,结果存储在数组mincost[N][N]中*//*fw=fopen("2.txt","w");for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(fw,"%4d ",mincost[i][j]);fprintf(fw,"\n");}fclose(fw);// getchar();//*/fenzhi(m1,m2,mindist,mincost); /* 调用分支定界的实现函数,寻找出所有的可行路径并依次输出*/finish=clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;printf( "%f seconds\n", duration );//*/}void Floyd(int d[N][N]) /* 弗洛伊德算法的实现函数*/{int v,w,u,i;for(u=0;u<N;u++){for(v=0;v<N;v++){for(w=0;w<N;w++)if(d[v][u]+d[u][w]<d[v][w]){//printf("v,w,u,d[v][u],d[u][w],d[v][w] %d %d %d %d %d %d",v+1,w+1,u+1,d[v][u],d[u][w],d[v][ w]);getchar();d[v][w]=d[v][u]+d[u][w];}}}}void input(int a[N][N],int b[N][N]) /* 把矩阵b赋值给矩阵a */{int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]=b[i][j];}void fenzhi(int m1[N][N],int m2[N][N],int mindist[N][N],int mincost[N][N]){int stack[MAX],depth=0,next,i,j; /* 定义栈,depth表示栈顶指针;next指向每次遍历时当前所处城市的上一个已经遍历的城市*/int bestLength,shortestDist,minimumCost,distBound=9999,costBound=9999;int cur,currentDist=0,currentCost=0; /* cur指向当前所处城市,currentDist和currentCost分别表示从甲城市到当前所处城市的最短距离和最小代价,currentDist和currentCost初值为0表示从甲城市出发开始深度优先搜索*/stack[depth]=0; /* 对栈进行初始化*/stack[depth+1]=0;visited[0]=1; /* visited[0]=1用来标识从甲城市开始出发进行遍历,甲城市已被访问*/while(depth>=0) /* 表示遍历开始和结束条件,开始时从甲城市出发,栈空,depth=0;结束时遍历完毕,所有节点均被出栈,故栈也为空,depth=0 *//* 整个while()循环体用来实现从当前的城市中寻找一个邻近的城市*/{cur=stack[depth]; /* 取栈顶节点赋值给cur,表示当前访问到第cur号城市*/ next=stack[depth+1]; /* next指向当前所处城市的上一个已经遍历的城市*/for(i=next+1;i<N;i++) /* 试探当前所处城市的每一个相邻城市*/{if((currentCost+mincost[cur][N-1]>costBound)||(currentDist+mindist[cur][N-1]>=distBound)){ /* 所试探的城市满足剪枝条件,进行剪枝*///printf("here1 %d %d %d %d %d %d %d\n",cur,currentCost,mincost[cur][49],costBound,curre ntDist,mindist[cur][49],distBound); getchar();//printf("%d %d %d %d %d %d",cur,i,m1[cur][i],currentCost,mincost[cur][49],costBound); getchar();continue;}if(m1[cur][i]==9999) continue; /* 所试探的城市不连通*/if(visited[i]==1) continue; /* 所试探的城市已被访问*/if(i<N) break; /* 所试探的城市满足访问条件,找到新的可行城市,终止for循环*/ }if(i==N) /* 判断for循环是否是由于搜索完所有城市而终止的,如果是(i==N),进行回溯*/{// printf("here");getchar();depth--;currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;}else /* i!=N,表示for循环的终止是由于寻找到了当前城市的一个可行的邻近城市*/{//printf("%d %d %d %d %d %d\n",cur,i,m1[stack[depth]][i],m2[stack[depth]][i],currentCost,curre ntDist);//getchar();currentDist+=m1[stack[depth]][i]; /* 把从当前所处城市到所找到的可行城市的距离加入currentDist */currentCost+=m2[stack[depth]][i]; /* 把从当前所处城市到所找到的可行城市的代价加入currentCost */depth++; /* 所找到的可行城市进栈*/stack[depth]=i; /* 更新栈顶指针,指向所找到的可行城市*/stack[depth+1]=0;visited[i]=1; /* 修改所找到的城市的访问标志*/if(i==N-1) /* i==N-1表示访问到了乙城市,完成了所有城市的一次搜索,找到一条通路*/{// printf("here\n");for(j=0;j<=depth;j++) /* 保存当前找到的通路所经过的所有节点*/ bestPath[j]=stack[j];bestLength=depth; /* 保存当前找到的通路所经过的所有节点的节点数*/shortestDist=currentDist; /* 保存当前找到的通路的距离之和*/minimumCost=currentCost; /* 保存当前找到的通路的代价之和*///costBound=currentCost;distBound=currentDist; /* 更新剪枝的路径边界,如果以后所找到的通路路径之和大于目前通路的路径之和,就剪枝*/if(minimumCost>1500) continue; /* 如果当前找到的通路的代价之和大于1500,则放弃这条通路*/printf("最短路径:%3d,路径代价:%3d,所经历的节点数目:%3d,所经历的节点如下:\n",shortestDist,minimumCost,bestLength+1); /* 输出找到的通路的结果*/bestPath[bestLength]=49;for(i=0;i<=bestLength;i++) /* 输出所找到的通路所经过的具体的节点*/ printf("%3d ",bestPath[i]+1);(完整word版)北航研究生算法设计与分析Assignment_2 printf("\n");depth--; /* 连续弹出栈顶的两个值,进行回溯,开始寻找新的可行的通路*/currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;depth--;currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;// getchar();}}}}。

算法分析与设计第二版习题答案-第三章到第五章

算法分析与设计第二版习题答案-第三章到第五章
{
int bool=1;
int min;
int j;
int i;
int k;
int flag;
for(i=0;i<count;i++)
{
if(buf[i]=='(')
push(buf[i],i);
if(buf[i]==')')
{
flag=pop();
算法设计与分析(第二版)习题答案 主编:吕国英
算法设计与分析(第二版)习题答案(第三章)
第三章:
1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");
;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return
0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list *link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode- >flag=flag;newnode-

算法设计与分析(第二版)王红梅试题及解析

算法设计与分析(第二版)王红梅试题及解析

算法设计与分析(第二版)王红梅试题及解析本文主要介绍了《算法设计与分析(第二版)》一书中的王红梅试题及解析,旨在帮助读者更好地掌握算法的基础知识,提高算法设计与分析的能力。

一、算法设计与分析算法是计算机科学的重要组成部分,是解决计算问题的一种方法。

算法设计与分析是计算机科学的一项核心技术,也是计算机科学专业必修的一门课程。

算法的好坏将直接影响计算机程序的运行效率。

王红梅编写的《算法设计与分析(第二版)》是一本通俗易懂的教材,作者通过详细解析算法设计和分析的基本概念和方法,给出了很多数学原理和实例,帮助读者深刻理解算法设计和分析的基本原则和方法。

二、王红梅试题及解析1. 下面哪个算法的时间复杂度最小?A. 插入排序B. 选择排序C. 冒泡排序D. 快速排序答案:D解析:快速排序是一种分治算法,基于递归的思想进行排序,每次划分找到一个基准点,将比基准点小的数放到左边,比基准点大的数放到右边,递归进行排序,因此它的时间复杂度为O(nlogn),是四种算法中最小的。

2. 下列哪些数据结构可以用来实现递归算法?A. 数组B. 栈C. 队列D. 链表答案:B、D解析:递归算法通常使用栈和链表来实现,因为它们具有后进先出或者先进先出的特点,符合递归算法的调用过程。

3. 下列哪个算法不是稳定排序?A. 插入排序B. 冒泡排序C. 归并排序D. 堆排序答案:D解析:稳定排序表示排序后,具有相同值得元素,排序前后其相对位置不变。

插入排序、冒泡排序和归并排序都是稳定排序算法,只有堆排序不是稳定排序算法。

4. 设有n个元素的数组,采用冒泡排序,平均比较次数和平均移动次数分别是多少?答案:平均比较次数为n(n-1)/2,平均移动次数为3 n(n-1)/4。

解析:冒泡排序的平均时间复杂度为O(n²)。

在n个元素的数组中,每个元素最多需要比较n-1次,所以平均比较次数为(n-1 + n-2+ ... + 1) / n (n-1) / 2 = n(n-1)/2。

算法设计与分析(第2版) 王红梅 胡明 习题参考答案

算法设计与分析(第2版) 王红梅 胡明 习题参考答案
#include<iostream>
usingnamespacestd;
intmain()
{
longdoubleresult=1;
doublej=1;
for(inti=1;i<=64;++i)
{
j=j*2;
result+=j;
j++;
}
cout<<result<<endl;
return0;
}
习题3
1.假设在文本"ababcabccabccacbab"中查找模式"abccac",写出分别采用BF算法和KMP算法的串匹配过
else
value=a[i+2]-a[i+1];
}
cout<<value<<endl;
return0;
}
4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。要求分别给出伪代码和C++描述。
#include<iostream>
usingnamespacestd;
{
if(n==1)
return4;
elseif(n>1)
return3*T(n-1);
}
(2)
intT(intn)
{
if(n==1)
return1;
elseif(n>1)
return2*T(n/3)+n;
}
5.求下列问题的平凡下界,并指出其下界是否紧密。
(1)求数组中的最大元素;
(2)判断邻接矩阵表示的无向图是不是完全图;

算法设计与分析(第2版)

算法设计与分析(第2版)

作者简介
王晓东,男,1957年3月出生,福州大学计算机系教授,福建省计算机学会理事长。研究领域是算法设计与 算法评价,基于计算机络和信息安全的大规模问题求解算法与数据结构,信息可视化技术。几何计算,并行和分 布式算法设计,计算复杂性理论。先后主持了与算法设计与分析有关的国家自一然科学基金项目、国家优秀留学 回国人一员基金项目、福建省杰出人才基金项目和省自然科学基金项目等7个研究课题;获得国家科技进步二等奖 1项,省科技进步二等奖3项。主持国家精品课程“算法与数据结构”,和福建省优质硕士学位课程“算法设计与 分析”的课程建设,获2005年福建省教学成果一等奖。在国内外重要学术刊物上发表有创见性的论文50余篇;正 式出版《算法设计与分析》等学术著作7部,在算法复杂性研究方面取得了一系列理论研究成果和应用成果。例如, 在对著名的凸壳问题的计算复杂性研究成果中推广了关于判定树模型下问题的计算复杂性下界的著名的Ben-Or, 并应用于分析凸壳问题的计算复杂性,在较_般的情况下改进和完善了国际算法界知名学者Aggarwal、Steele和 Yao等提出的关于凸壳问题计算复杂性下界的结果。研究成果得到同行专家的好评并被国内权威刊物所引用。
内容提要
为了适应培养我国21世纪计算机各类人才的需要,结合我国高等学校教育工作的现状,立足培养学生能跟上 国际计算机科学技术的发展水平,更新教学内容和教学方法,提高教学质量,本书以算法设计策略为知识单元, 系统地介绍计算机算法的设计方法与分析技巧,以期为计算机科学与技术学科的Байду номын сангаас生提供广泛而坚实的计算机算 法基础知识。
目录
第1章算法引论 1.1算法与程序 1.2表达算法的抽象机制 1.3描述算法 1.4算法复杂性分析 小结 习题 第2章递归与分治策略 2.1递归的概念 2.2分治法的基本思想 2.3二分搜索技术

算法设计与分析(第2版)

算法设计与分析(第2版)

2016年2月1日,该教材由清华大学出版社出版。
内容简介
该教材为计算机类专业核心课程“算法设计与分析”教材,全书以算法设计技术和分析方法为主线来组织各 知识单元。全书共10章,第1章是基础知识,介绍和算法设计与分析有关的基本概念、符号和数学知识;第2~5章 分别阐述分治策略、动态规划、贪心法、回溯与分支限界等算法设计技术;第6章介绍算法分析与问题的计算复杂 度;第7章是NP完全性理论;第8章是近似算法;第9章是随机算法;第10章介绍处理难解问题的策略。
该教材的主要特点是:
作者简介
屈婉玲,女,北京大学信息科学技术学院及软件与微电子学院教授、博士生导师。主讲算法分析与复杂性理 论、算法分析与设计等研究生必修课。研究方向为算法设计与分析、软件形式化方法。
刘田,博士,北京大学信息科学技术学院副教授。主要研究方向为算法分析与计算复杂性理论。长期主讲 “集合论与图论”、“理论计算机科学基础”等课程,2006年和2013年先后两次获得了北京大学教学优秀奖。
算法设计与分析(第2版)
20xx年清华大学出版社出版的图书
01 成书过程
03 教材目录 05 教材特色
目录
02 内容简介设计与分析(第2版)》是由屈婉玲、刘田、张立昂、王捍贫编著,2016年清华大学出版社出版的21 世纪大学本科计算机专业系列教材、普通高等教育“十一五”国家级规划教材。该教材适合作为大学计算机科学 与技术、软件工程、信息安全、信息与计算科学等专业本科生和研究生的教学用书,也可以作为从事实际问题求 解的算法设计与分析工作的科技人员的参考。
该教材为计算机类专业核心课程“算法设计与分析”教材,全书以算法设计技术和分析方法为主线来组织各 知识单元,主要内容包括基础知识、分治策略、动态规划、贪心法等。

算法设计与分析王红梅第二版第章近似算法

算法设计与分析王红梅第二版第章近似算法

算法设计与分析王红梅第二版第章近似算法近似算法是指在求解NP-hard问题时,通过放松一些限制条件,给出一个接近最优解的算法。

在实际应用中,由于很多问题是难以在多项式时间内求解的,因此近似算法成为了解决这些问题的常用方法。

《算法设计与分析》第二版的第11章《近似算法》主要介绍了一些常见的近似算法及其设计原理和分析方法。

第11章共分为3节,分别是哈密顿回路的启发式算法、背包问题的近似算法和图着色问题的近似算法。

第一节介绍了哈密顿回路的启发式算法。

哈密顿回路问题是指在一个无向图中找到一条经过每个顶点恰好一次的回路。

求解哈密顿回路问题是NP-hard问题,目前还没有找到多项式时间内求解的算法。

因此,近似算法成为了解决该问题的有效方法。

本节介绍了两种常用的启发式算法:邻居加法算法和最近邻算法。

邻居加法算法是通过不断扩展当前已有的回路来求解问题,每次选择与当前回路相邻且未加入回路的顶点加入回路,直到得到一个哈密顿回路。

最近邻算法是通过选择与当前回路最近的未加入回路的顶点加入回路,直到得到一个哈密顿回路。

这两种启发式算法都可以在多项式时间内求解哈密顿回路问题。

第二节介绍了背包问题的近似算法。

背包问题是指在有限的背包容量下,选择一些物品放入背包,使得物品的总价值最大。

背包问题也是一个NP-hard问题,无法在多项式时间内求解。

本节介绍了两种常用的近似算法:贪心算法和动态规划算法。

贪心算法根据物品的单位价值进行排序,然后依次选择单位价值最高的物品放入背包,直到背包容量不足为止。

贪心算法在一些情况下可以得到最优解,但在一般情况下只能得到接近最优解的解。

动态规划算法通过构建一个动态规划表格,逐步求解子问题的最优解,最终得到背包问题的最优解。

动态规划算法可以在多项式时间内求解背包问题,但是对于较大的问题规模可能需要较长的运行时间。

第三节介绍了图着色问题的近似算法。

图着色问题是指给定一个无向图,为每个顶点分配一个颜色,使得相邻的顶点颜色不同。

算法设计与分析习题解答(第2版)

算法设计与分析习题解答(第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版)习题答案

算法设计与分析(第2版)习题答案

习题11. 图论诞生于七桥问题。

出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。

七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。

请将该问题的数据模型抽象出来,并判断此问题是否有解。

七桥问题属于一笔画问题。

输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。

另一类是只有二个奇点的图形。

2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。

请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n2.2 n=r2.3 r=m-n3 输出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]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2)递归的结构 一般来说,递归由边界条件、递归计算和递归返回组成。当
边界条件不满足时,递归向前推进计算过程;当边界条件 满足时,递归返回。
3)直接递归和间接递归 对函数A,若在A的过程体内又调用了A自身,则这种递归 形式称为直接递归; 若在A的过程体内调用了另外一个函数B,而在B的过程体 内又调用了A,则这种递归形式称为间接递归;
例2.1 斐波那契(Fibonacci)序列: F0 = F1 = 1 Fi = Fi-1 + Fi-2 (i>1)
算法2.1 求斐波那契数: procedure F(n) //返回第n个斐波那契数// integer n if n ≤ 1 then return(1) else return(F(n-1) + F(n-2)) endif end F
直接递归
A(int x) { int y; …… A(y); …… }
间接递归
A(int x) { …… B(……); …… }
B(……) { int y; …… A(y); …… }
2. 递归程序设计
程序调用自身的编程技巧称为递归程序设计。是递归算法的 直接描述。 关于递归,注意两点: (1) 递归就是在过程或函数里直接或简接地调用自身; (2) 在使用递归策略时,必须有一个明确的递归结束条件,称 为递归出口,否则会产生死循环而出错。
改进:保存中间结果(递推模型)(用大小为N的数 组) 其它递归模型
例2.2 欧几里得算法 已知两个非负整数a和b,且a>b≥0,求这两个数的
最大公因数。 辗转相除法:若b=0,则a和b的最大公因数等于a;若b>0,
则a和b的最大公因数等于b和用b除a的余数的最大公因数。
算法2.2 求最大公因数 procedure GCD(a,b) // 约定a>b //
算法设计与分析
2012.5
王多强 wdq0818@
二、递归与递归是递归?
递归是一个过程或函数在其定义或说明中又直接或间接调用 自身的一种方法。
1)递归的本质 递归把一个大型、复杂的问题层层转化为一个与原问题相似、
但规模较小的问题来求解,只需少量的程序就可描述出解 题过程所需要的多次重复计算,大大地减少了程序的代码 量。递归的能力在于用有限的语句来定义对象的无限集合。
递推算法设计的思想
Recurrence_SOLVE(P) //P是当前问题 定义数组ans[P] //定义一个与问题规模P相适应的数组,用于存放答案 for i from 边界问题P0 to P do //从小问题求解做起 if i 是边界值 then 直接求解,将结果保存在ans中 else 将i转换为规模较小问题i' ans[i] ←build answer by ans[i'] //用已得到的答案构造i的解ans[i] endif repeat
递归和递推的联系:都存在重复计算,是解决较大规模问题 的有效方法;
递归和递推的区别:求解思路不同,实现技术上也不一样
递归算法设计的思想 Recursive_SOLVE (P) //P是当前问题
if P的规模足够小 then 直接求解 else
将P转换为规模较小问题P' Recursive_SOLVE(P') //递归调用 将P'还原成为原问题P,结果合并 endif END Recursive_SOLVE
3. 怎么克服递归的效率问题?
—— 化递归为递推
递归:递归是一种从上至下的“分解求解“的过程,即不断 地把大问题分解为小问题,直到小问题规模足够小,然后 求解并进行递归返回和结果合并。——效率差!
递推:递推是一种从下往上的“合并求解“过程,即从解决 小问题出发,记录小问题的答案,并根据已有的小问题的 答案,把问题往大里扩展,“滚雪球”,直到达到大问题 的规模为止。并通常用迭代(循环)的方式实现,而不是 递归调用,一般认为效率上比递归好。
递归是一种强有力的设计方法 与数学模型一致 表述简单、清晰、代码量少 可读性强、容易证明正确性
递归的问题:执行时间长、运行效率低,特别 是占用空间多,容易造成系统栈的溢出。
主要原因:递归调用时有大量的现场保护与恢复操 作,在递归调用的过程当中系统为每一层的返回 点、局部量等开辟了栈来存储,递归层次数过多 容易造成栈溢出等。
END Recurrence_SOLVE
怎么化递归程序为递推程序? 需要理解并解决这样几个问题: ① 如何体现递归反映出来的、通过调用自身实现的重复计
算——从程序入口重复执行本程序的代码的过程? ② 每次递归完成后要接着递归点往下继续执行,递推时如何
记录重复执行点,以实现与递归类似的、在重复点重复执 行、执行完后又能接着重复点之后的代码继续执行? ③ 如果递归函数有返回值,返回值需要返回至递归调用点, 用迭代实现时,如何处理返回值?(小问题的解数组ans)
if b=0 then return(a) else return (GCD(b,a mod b))
endif end GCD
例: GCD(22,8) = GCD(8,6) = GCD(6,2) = GCD(2,0) = 2
例2.3 用递归策略设计的检索算法 已知元素x和元素表A(1:n),判断x是否等于A中
某元素的值。 算法2.3 在A(1:n)中检索x procedure SEARCH(i)
//如果在A(1:n)中有一元素A(k)=x,则将其第一次出现的下标k返回,否则返回0//
global n,x,A(1:n) case
:i>n: return(0) :A(i) = x; return(i) :else: return(SEARCH(i+1)) endcase end SEARCH
思考:上述算法的效率非常低下,为什么?
上述过程的效率很差,存在大量的重复计算:
F(n)
F(n-1)
F(n-2)
F(n-2)
F(n-3)
F(n-3)
F(n-4)
分析:F(n-2)被算了两次,F(n-3)被算了三次,F(n-4)被算了五次,......., 总的运算量为这些运算之和,所以,事实上,这样的计算过程, 运算次数本身也是一个斐波那契数列。整个计算的时间复杂度约 为O(1.618n)。非常之大!
相关文档
最新文档