算法分析与设计习题集

合集下载

算法设计与分析习题答案

算法设计与分析习题答案

算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。

以下是一些典型的算法设计与分析习题及其答案。

习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。

答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。

这个过程会不断重复,直到找到目标值或搜索范围为空。

```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。

答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。

```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。

算法分析与设计习题集答案

算法分析与设计习题集答案

算法分析与设计习题集基础篇1、算法有哪些特点?它有哪些特征?它和程序的主要区别是什么?特点:就是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算〔书上定义〕特征:输入、输出、有穷性、明确性、有效性区别:算法是完成特定任务的有限指令集。

程序是用电脑语言编写的写成特定任务的指令序列。

2、算法的时间复杂度指的是什么?如何表示?算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。

这是一个关于代表算法输入值的字符串的长度的函数。

时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。

〔百度百科〕3、算法的空间复杂度指的是什么?如何表示?一个程序的空间复杂度是指运行完一个程序所需内存的大小。

利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。

一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。

程序执行时所需存储空间包括以下两部分。

〔1〕固定部分。

这部分空间的大小与输入/输出的数据的个数多少、数值无关。

主要包括指令空间〔即代码空间〕、数据空间〔常量、简单变量〕等所占的空间。

这部分属于静态空间。

〔2〕可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。

这部分的空间大小与算法有关。

一个算法所需的存储空间用f(n)表示。

S(n)=O(f(n))其中n为问题的规模,S(n)表示空间复杂度。

答:最坏情况时间复杂性:最好情况时间复杂性::I*是DN中使T(N, I*)到达Tmax(N)的合法输入;P(I)是在算法的应用中出现输入I的概率10、限界函数的功能是什么?答:用限界函数剪去得不到最优解的子树11、设某一函数定义如下:编写一个递归函数计算给定x的M〔x〕的值。

本函数是一个递归函数,其递归出口是:M〔x〕= x-10x>100递归体是:M〔M〔x+11〕〕x ≤100实现此题功能的递归函数如下:intm ( intx ){ int y;if ( x>100 )return(x-10 );else {y =m(x+11) ;return (m (y ));}procedure M(x)if x>100 thenreturn(x-10)elsereturn M(M(x+11))endifend M12、已知一个顺序表中的元素按元素值非递减有序排列,编写一个函数删除表中多余的值相同的元素。

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

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

算法设计与分析基础习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。

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

故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[] 4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。

计算机算法设计和分析习题及答案解析

计算机算法设计和分析习题及答案解析

计算机算法设计与分析习题及答案一.选择题1、二分搜索算法是利用 A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是 A ;A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是A 的一搜索方式;A、分支界限法B、动态规划法C、贪心法D、回溯法4. 回溯法解旅行售货员问题时的解空间树是 A ;A、子集树B、排列树C、深度优先生成树D、广度优先生成树5.下列算法中通常以自底向上的方式求解最优解的是B ;A、备忘录法B、动态规划法C、贪心法D、回溯法6、衡量一个算法好坏的标准是 C ;A 运行速度快B 占用空间少C 时间复杂度低D 代码短7、以下不可以使用分治法求解的是 D ;A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题8. 实现循环赛日程表利用的算法是A ;A、分治策略B、动态规划法C、贪心法D、回溯法9.下面不是分支界限法搜索方式的是D ;A、广度优先B、最小耗费优先C、最大效益优先D、深度优先10.下列算法中通常以深度优先方式系统搜索问题解的是D ;A、备忘录法B、动态规划法C、贪心法D、回溯法11.备忘录方法是那种算法的变形; BA、分治法B、动态规划法C、贪心法D、回溯法12.哈夫曼编码的贪心算法所需的计算时间为B ;A、On2nB、OnlognC、O2nD、On13.分支限界法解最大团问题时,活结点表的组织形式是B ;A、最小堆B、最大堆C、栈D、数组14.最长公共子序列算法利用的算法是B;A、分支界限法B、动态规划法C、贪心法D、回溯法15.实现棋盘覆盖算法利用的算法是A ;A、分治法B、动态规划法C、贪心法D、回溯法16.下面是贪心算法的基本要素的是C ;A、重叠子问题B、构造最优解C、贪心选择性质D、定义最优解17.回溯法的效率不依赖于下列哪些因素 DA.满足显约束的值的个数B. 计算约束函数的时间C.计算限界函数的时间D. 确定解空间的时间18.下面哪种函数是回溯法中为避免无效搜索采取的策略BA.递归函数 B.剪枝函数 C;随机数函数 D.搜索函数19. D是贪心算法与动态规划算法的共同点;A、重叠子问题B、构造最优解C、贪心选择性质D、最优子结构性质20. 矩阵连乘问题的算法可由 B 设计实现;A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法21. 分支限界法解旅行售货员问题时,活结点表的组织形式是 A ;A、最小堆B、最大堆C、栈D、数组22、Strassen矩阵乘法是利用A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法23、使用分治法求解不需要满足的条件是 A ;A 子问题必须是一样的B 子问题不能够重复C 子问题的解可以合并D 原问题和子问题使用相同的方法解24、下面问题 B 不能使用贪心法解决;A 单源最短路径问题B N皇后问题C 最小生成树问题D 背包问题25、下列算法中不能解决0/1背包问题的是 AA 贪心法B 动态规划C 回溯法D 分支限界法26、回溯法搜索状态空间树是按照 C 的顺序;A 中序遍历B 广度优先遍历C 深度优先遍历D 层次优先遍历27.实现合并排序利用的算法是A ;A、分治策略B、动态规划法C、贪心法D、回溯法28.下列是动态规划算法基本要素的是D ;A、定义最优解B、构造最优解C、算出最优解D、子问题重叠性质29.下列算法中通常以自底向下的方式求解最优解的是 B ;A、分治法B、动态规划法C、贪心法D、回溯法30.采用广度优先策略搜索的算法是A ;A、分支界限法B、动态规划法C、贪心法D、回溯法31、合并排序算法是利用 A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法32、背包问题的贪心算法所需的计算时间为 BA、On2nB、OnlognC、O2nD、On33.实现大整数的乘法是利用的算法C ;A、贪心法B、动态规划法C、分治策略D、回溯法34.0-1背包问题的回溯算法所需的计算时间为AA、On2nB、OnlognC、O2nD、On35.采用最大效益优先搜索方式的算法是A;A、分支界限法B、动态规划法C、贪心法D、回溯法36.贪心算法与动态规划算法的主要区别是B;A、最优子结构B、贪心选择性质C、构造最优解D、定义最优解37. 实现最大子段和利用的算法是B ;A、分治策略B、动态规划法C、贪心法D、回溯法38.优先队列式分支限界法选取扩展结点的原则是 C ;A、先进先出B、后进先出C、结点的优先级D、随机39.背包问题的贪心算法所需的计算时间为 B ;A、On2nB、OnlognC、O2nD、On40、广度优先是A 的一搜索方式;A、分支界限法B、动态规划法C、贪心法D、回溯法41. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的 B ;A、重叠子问题B、最优子结构性质C、贪心选择性质D、定义最优解42.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 B ;A 、On2nB 、OnlognC 、O2nD 、On43. 以深度优先方式系统搜索问题解的算法称为 D ;A 、分支界限算法B 、概率算法C 、贪心算法D 、回溯算法44. 实现最长公共子序列利用的算法是B ;A 、分治策略B 、动态规划法C 、贪心法D 、回溯法45. Hanoi 塔问题如下图所示;现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置;移动圆盘时遵守Hanoi 塔问题的移动规则;由此设计出解Hanoi 塔问题的递归算法正确的为:B46. 动态规划算法的基本要素为 CA. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用 47. 能采用贪心算法求最优解的问题,一般具有的重要性质为: AA. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用48. 回溯法在问题的解空间树中,按 D 策略,从根结点出发搜索解空间树;A.广度优先B. 活结点优先C.扩展结点优先D. 深度优先49. 分支限界法在问题的解空间树中,按 A 策略,从根结点出发搜索解空间树;A.广度优先B. 活结点优先C.扩展结点优先D. 深度优先50. 程序块 A 是回溯法中遍历排列树的算法框架程序;A.B. C. D. 51. 常见的两种分支限界法为DA. 广度优先分支限界法与深度优先分支限界法;B. 队列式FIFO 分支限界法与堆栈式分支限界法;C. 排列树法与子集树法;D. 队列式FIFO 分支限界法与优先队列式分支限界法;1.算法的复杂性有 时间 复杂性和 空间 ;2、程序是 算法用某种程序设计语言的具体实现;3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的;4. 矩阵连乘问题的算法可由 动态规划 设计实现;5、算法是指解决问题的 一种方法 或 一个过程 ;6、从分治法的一般设计模式可以看出,用它设计出的程序一般是 递归算法 ;7、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征;8、以深度优先方式系统搜索问题解的算法称为 回溯法 ;9、计算一个算法时间复杂度通常可以计算 循环次数 、 基本操作的频率 或计算步; Hanoi 塔A. void hanoiint n, int A, int C, int B{ if n > 0{ hanoin-1,A,C, B;moven,a,b; hanoin-1, C, B, A; }} B. void hanoiint n, int A, int B, int C { if n > 0 { hanoin-1, A, C, B; moven,a,b; hanoin-1, C, B, A; } }C. void hanoiint n, int C, int B, int A { if n > 0 { hanoin-1, A, C, B; moven,a,b; hanoin-1, C, B, A; } }D. void hanoiint n, int C, int A, int B { if n > 0 { hanoin-1, A, C, B; moven,a,b; hanoin-1, C, B, A; } } void backtrack int t{ if t>n outputx; else for int i=t;i<=n;i++ { swapxt, xi; if legalt backtrackt+1; swapxt, xi; } } void backtrack int t { if t>n outputx;elsefor int i=0;i<=1;i++ { xt=i; if legalt backtrackt+1; } }void backtrack int t { if t>n outputx; else for int i=0;i<=1;i++ { xt=i; if legalt backtrackt-1; } }voidbacktrack int t{ if t>n outputx; else for int i=t;i<=n;i++ { swapxt, xi; if legalt backtrackt+1;}}10、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是动态规划 ,需要排序的是回溯法 ,分支限界法 ;11、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是 0/1背包问题 ,只使用约束条件进行裁剪的是 N皇后问题 ;12、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别;13、矩阵连乘问题的算法可由动态规划设计实现;14.贪心算法的基本要素是贪心选择性质和最优子结构性质 ;15. 动态规划算法的基本思想是将待求解问题分解成若干子问题 ,先求解子问题 ,然后从这些子问题的解得到原问题的解;16.算法是由若干条指令组成的有穷序列,且要满足输入、输出、确定性和有限性四条性质;17、大整数乘积算法是用分治法来设计的;18、以广度优先或以最小耗费方式搜索问题解的算法称为分支限界法 ;19、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别;20.快速排序算法是基于分治策略的一种排序算法;21.动态规划算法的两个基本要素是. 最优子结构性质和重叠子问题性质 ;22.回溯法是一种既带有系统性又带有跳跃性的搜索算法;23.分支限界法主要有队列式FIFO 分支限界法和优先队列式分支限界法;24.分支限界法是一种既带有系统性又带有跳跃性的搜索算法;25.回溯法搜索解空间树时,常用的两种剪枝函数为约束函数和限界函数 ;26.任何可用计算机求解的问题所需的时间都与其规模有关;27.快速排序算法的性能取决于划分的对称性 ;28.所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到 ;29.所谓最优子结构性质是指问题的最优解包含了其子问题的最优解 ;30.回溯法是指具有限界函数的深度优先生成法 ;31.用回溯法解题的一个显着特征是在搜索过程中动态产生问题的解空间;在任何时刻,算法只保存从根结点到当前扩展结点的路径;如果解空间树中从根结点到叶结点的最长路径的长度为hn,则回溯法所需的计算空间通常为 Ohn ;32.回溯法的算法框架按照问题的解空间一般分为子集树算法框架与排列树算法框架;33.用回溯法解0/1背包问题时,该问题的解空间结构为子集树结构;34.用回溯法解批处理作业调度问题时,该问题的解空间结构为排列树结构;35.旅行售货员问题的解空间树是排列树 ;三、算法填空1.背包问题的贪心算法void Knapsackint n,float M,float v,float w,float x{//重量为w1..n,价值为v1..n的 n个物品,装入容量为M的背包//用贪心算法求最优解向量x1..nint i; Sortn,v,w;for i=1;i<=n;i++ xi=0;float c=M;for i=1;i<=n;i++{if wi>c break;xi=1;c-=wi;}if i<=n xi=c/wi;}2.最大子段和: 动态规划算法int MaxSumint n, int a{int sum=0, b=0; //sum存储当前最大的bj, b存储bjfor int j=1; j<=n; j++{ if b>0 b+= aj ;else b=ai; ; //一旦某个区段和为负,则从下一个位置累和 ifb>sum sum=b;}return sum;}3.贪心算法求活动安排问题template<class Type>void GreedySelector int n, Type s, Type f, bool A{A1=true;int j=1;for int i=2;i<=n;i++if si>=fj{ Ai=true;j=i;}else Ai=false;}4.快速排序template<class Type>void QuickSort Type a, int p, int r{if p<r{int q=Partitiona,p,r;QuickSort a,p,q-1; //对左半段排序QuickSort a,q+1,r; //对右半段排序}}5. 回溯法解迷宫问题迷宫用二维数组存储,用'H'表示墙,'O'表示通道int x1,y1,success=0; //出口点void MazePathint x,int y{//递归求解:求迷宫maze从入口x,y到出口x1,y1的一条路径mazexy=''; //路径置为if x==x1&&y==y1 success=1; //到出口则成功else{if mazexy+1=='O' MazePathx,++y;//东邻方格是通路,向东尝试if success&&mazex+1y=='O' MazePath++x,y;//不成功且南邻方格是通路,向南尝试if success&&mazexy-1=='O' MazePathx,--y;//不成功且西邻方格是通路,向西尝试if success&&mazex-1y=='O' MazePath--x,y;//不成功且北邻方格是通路,向北尝试}if success mazexy=''; //死胡同置为}四、算法设计题1. 给定已按升序排好序的n个元素a0:n-1,现要在这n个元素中找出一特定元素x,返回其在数组中的位置,如果未找到返回-1;写出二分搜索的算法,并分析其时间复杂度;template<class Type>int BinarySearchType a, const Type& x, int n{//在a0:n中搜索x,找到x时返回其在数组中的位置,否则返回-1Int left=0; int right=n-1;While left<=right{int middle=left+right/2;if x==amiddle return middle;if x>amiddle left=middle+1;else right=middle-1;}Return -1;}时间复杂性为Ologn2. 利用分治算法写出合并排序的算法,并分析其时间复杂度void MergeSortType a, int left, int right{if left<right {//至少有2个元素int i=left+right/2; //取中点mergeSorta, left, i;mergeSorta, i+1, right;mergea, b, left, i, right; //合并到数组bcopya, b, left, right; //复制回数组a}}算法在最坏情况下的时间复杂度为Onlogn;3.N皇后回溯法bool Queen::Placeint k{ //检查xk位置是否合法for int j=1;j<k;j++if absk-j==absxj-xk||xj==xk return false;return true;}void Queen::Backtrackint t{if t>n sum++;else for int i=1;i<=n;i++{xt=i;if 约束函数 Backtrackt+1;}}4.最大团问题void Clique::Backtrackint i // 计算最大团{ if i > n { // 到达叶结点for int j = 1; j <= n; j++ bestxj = xj;bestn = cn; return;}// 检查顶点 i 与当前团的连接int OK = 1;for int j = 1; j < i; j++if xj && aij == 0 // i与j不相连{OK = 0; break;}if OK { // 进入左子树xi = 1; cn++;Backtracki+1;xi = 0; cn--; }if cn+n-i>bestn { // 进入右子树xi = 0;Backtracki+1; }}5. 顺序表存储表示如下:typedef struct{RedType rMAXSIZE+1; //顺序表int length; //顺序表长度}SqList;编写对顺序表L进行快速排序的算法;int PartitionSqList &L,int low,int high //算法10.6b{//交换顺序表L中子表L.rlow..high的记录,枢轴记录到位,并返回其所在位置, //此时在它之前后的记录均不大小于它.int pivotkey;L.r0=L.rlow; //用子表的第一个记录作枢轴记录pivotkey=L.rlow.key; //枢轴记录关键字while low<high //从表的两端交替地向中间扫描{while low<high&&L.rhigh.key>=pivotkey --high;L.rlow=L.rhigh; //将比枢轴记录小的记录移到低端while low<high&&L.rlow.key<=pivotkey ++low;L.rhigh=L.rlow; //将比枢轴记录大的记录移到高端}L.rlow=L.r0; //枢轴记录到位return low; //返回枢轴位置}void QSortSqList &L,int low,int high{//对顺序表L中的子序列L.rlow..high作快速排序int pivotloc;if low<high //长度>1{pivotloc=PartitionL,low,high; //将L.rlow..high一分为二QSortL,low,pivotloc-1; //对低子表递归排序,pivotloc是枢轴位置 QSortL,pivotloc+1,high; //对高子表递归排序}}void QuickSortSqList &L{//对顺序表L作快速排序QSortL,1,L.length; }。

算法设计与分析习题集

算法设计与分析习题集

一、假设有7个物品,它们的重量和价值如下表所示。

若这些物品均不能被分割,且背包容量M=150,使用回溯方法求解此背包问题。

请写出状态空间搜索树(20分)。

答:按照单位效益从大到小依次排列这7个物品为:FBGDECA 。

将它们的序号分别记为1~7。

则可生产如下的状态空间搜索树。

其中各个节点处的限界函数值通过如下方式求得:【排序1分】5x =6x =7x =17分,每个节点1分】a .1501154040305035190.62540-++++⨯= 7(1,1,1,1,,0,0)8b. 1501154040305030177.560-++++⨯=7(1,1,1,1,0,,0)12c .4040305010170++++=(1,1,1,1,0,0,1)d. 1501054040303530167.560-++++⨯= 3(1,1,1,0,1,,0)4e. 150130404050353017560-++++⨯=1(1,1,0,1,1,,0)3f. 1501304040503510170.7135-++++⨯=4(1,1,0,1,1,0,)7g. 40405030160+++=(1,1,0,1,0,1,0)h. 1501404040353010146.8535-++++⨯= 2(1,1,0,0,1,1,)7i.1501254030503530167.560-++++⨯=5(1,0,1,1,1,,0)12 j. 1501454030503530157.560-++++⨯=1(0,1,1,1,1,,0)12在Q 1处获得该问题的最优解为(1,1,1,1,0,0,1),背包效益为170。

即在背包中装入物品F 、B 、G 、D 、A 时达到最大效益,为170,重量为150。

【结论2分】一、已知1()*()i i k k ij r r A a +=,k =1,2,3,4,5,6,r 1=5,r 2=10,r 3=3,r 4=12,r 5=5,r 6=50,r 7=6,求矩阵链积A 1×A 2×A 3×A 4×A 5×A 6的最佳求积顺序。

算法设计与分析习题与实验题(12.18)

算法设计与分析习题与实验题(12.18)

《算法设计与分析》习题第一章引论习题1-1 写一个通用方法用于判定给定数组是否已排好序。

解答:Algorithm compare(a,n)BeginJ=1;While (j<n and a[j]<=a[j+1]) do j=j+1;If j=n then return trueElseWhile (j<n and a[j]>=a[j+1]) do j=j+1;If j=n then return true else return false end ifEnd ifend习题1-2 写一个算法交换两个变量的值不使用第三个变量。

解答:x=x+y; y=x-y; x=x-y;习题1-3 已知m,n为自然数,其上限为k(由键盘输入,1<=k<=109),找出满足条件(n2-mn-m2)2=1 且使n2+m2达到最大的m、n。

解答:m:=k; flag:=0;repeatn:=m;repeatl:=n*n-m*n-m*n;if (l*l=1) then flag:=1 else n:=n-1;until (flag=1) or (n=0)if n=0 then m:=m-1until (flag=1) or (m=0);第二章基础知识习题2-1 求下列函数的渐进表达式:3n 2+10n ; n 2/10+2n ; 21+1/n ; log n 3; 10 log3n 。

解答: 3n 2+10n=O (n 2), n 2/10+2n =O (2n ), 21+1/n=O (1), log n 3=O (log n ),10 log3n =O (n )。

习题2-2 说明O (1)和 O (2)的区别。

习题2-3 照渐进阶从低到高的顺序排列以下表达式:!n ,3/22,2,20,3,log ,4n n n n n 。

解答:照渐进阶从低到高的顺序为:!n 、 3n、 24n 、23n 、20n 、log n 、2习题2-4(1) 假设某算法在输入规模为n 时的计算时间为n n T 23)(⨯=。

(完整版)算法设计与分析考试题及答案

(完整版)算法设计与分析考试题及答案

一、填空题(20分)1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。

2.算法的复杂性有_____________和___________之分,衡量一个算法好坏的标准是______________________。

3.某一问题可用动态规划算法求解的显著特征是____________________________________。

4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y的一个最长公共子序列_____________________________。

5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___________。

6.动态规划算法的基本思想是将待求解问题分解成若干____________,先求解___________,然后从这些____________的解得到原问题的解。

7.以深度优先方式系统搜索问题解的算法称为_____________。

8.0-1背包问题的回溯算法所需的计算时间为_____________,用动态规划算法所需的计算时间为____________。

9.动态规划算法的两个基本要素是___________和___________。

10.二分搜索算法是利用_______________实现的算法。

二、综合题(50分)1.写出设计动态规划算法的主要步骤。

2.流水作业调度问题的johnson算法的思想。

3.若n=4,在机器M1和M2上加工作业i所需的时间分别为a i和b i,且(a1,a2,a3,a4)=(4,5,12,10),(b1,b2,b3,b4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。

4.使用回溯法解0/1背包问题:n=3,C=9,V={6,10,3},W={3,4,4},其解空间有长度为3的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。

算法设计与分析-课后习题集答案

算法设计与分析-课后习题集答案
10.(1)当 时, ,所以,可选 , 。对于 , ,所以, 。
(2)当 时, ,所以,可选 , 。对于 , ,所以, 。
(3)由(1)、(2)可知,取 , , ,当 时,有 ,所以 。
11. (1)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(2)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(3)因为 , 。当 时, , 。所以,可选 , ,对于 , ,即 。
第二章
2-17.证明:设 ,则 。
当 时, 。所以, 。
第五章
5-4.SolutionType DandC1(int left,int right)
{while(!Small(left,right)&&left<right)
{int m=Divide(left,right);
所以n-1<=m<=n (n-1)/2;
O(n)<=m<=O(n2);
克鲁斯卡尔对边数较少的带权图有较高的效率,而 ,此图边数较多,接近完全图,故选用普里姆算法。
10.
T仍是新图的最小代价生成树。
证明:假设T不是新图的最小代价生成树,T’是新图的最小代价生成树,那么cost(T’)<cost(T)。有cost(T’)-c(n-1)<cost(t)-c(n-1),即在原图中存在一颗生成树,其代价小于T的代价,这与题设中T是原图的最小代价生成树矛盾。所以假设不成立。证毕。
13.template <class T>
select (T&x,int k)
{
if(m>n) swap(m,n);
if(m+n<k||k<=0) {cout<<"Out Of Bounds"; return false;}

算法分析与设计试题及答案

算法分析与设计试题及答案

算法分析与设计试题及答案一、选择题1. 下列哪个是属于分治算法的例子?A. 冒泡排序B. 归并排序C. 顺序查找D. 选择排序答案:B2. 在排序算法中,时间复杂度最优的是:A. 冒泡排序B. 插入排序C. 归并排序D. 快速排序答案:C3. 哪个不是动态规划的特点?A. 具有重叠子问题B. 通过递归求解C. 需要保存子问题的解D. 具有最优子结构答案:B4. 在图的广度优先搜索算法中,使用的数据结构是:A. 栈B. 队列C. 数组D. 堆栈答案:B5. 在最小生成树算法中,下列哪个不属于贪心策略?A. Kruskal算法B. Prim算法C. Dijkstra算法D. Prim-Kruskal混合算法答案:C二、简答题1. 请简述分治算法的思想和应用场景。

答案:分治算法的思想是将原问题分解成若干个规模较小且类似的子问题,然后解决子问题,最后将子问题的解合并得到原问题的解。

其应用场景包括排序算法(如归并排序、快速排序)、搜索算法(如二分查找)等。

2. 什么是动态规划算法?请给出一个动态规划算法的示例。

答案:动态规划算法是一种通过将问题分解成子问题并解决子问题来解决复杂问题的方法。

它的特点是具有重叠子问题和最优子结构性质。

以斐波那契数列为例,可以使用动态规划算法求解每一项的值,而不需要重复计算。

3. 图的深度优先搜索和广度优先搜索有什么区别?答案:图的深度优先搜索(Depth First Search,DFS)是一种先访问子节点再访问兄弟节点的遍历算法,通常使用递归或者栈实现。

而广度优先搜索(Breadth First Search,BFS)则是以层次遍历的方式展开搜索,使用队列来实现。

DFS更适合用于搜索路径,BFS则适用于寻找最短路径等。

4. 请简述贪心算法的特点及其应用场景。

答案:贪心算法的特点是每一步都采取当前状态下最优的选择,以期望得到全局最优解。

然而,贪心算法并不一定能求解所有问题的最优解,但对于一些特定问题,贪心算法往往能得到近似最优解。

最新算法分析与设计习题集答案

最新算法分析与设计习题集答案

2、 算法的时间复杂度指的是什么?如何表示?
算法的时间复杂度是一个函数, 它定量描述了该算法的运行时间。 这是一个关于代表算法输
入值的字符串的长度的函数。时间复杂度常用大
O 符号表述,不包是什么?如何表示? 一个程序的空间复杂度是指运行完一个程序所需内存的大小。
或是在满足约束条件的解中找出在
某种意义下的最优解;
(2)搜索方式的不同: 回溯法以深度优先的方式搜索解空间树, 而分支限界法则以
广度优先或以最小耗费优先的方式搜索解空间树。
9、 分枝限界法的基本思想是什么? 答:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
10、 限界函数的功能是什么? 精品文档
if ( x>100 )return(x-10 ); else {
y =m(x+11) ; return (m (y )); } } procedure M ( x ) if x >100 then
return ( x - 10 ) else
return M ( M( x + 11 )) endif end M
4、 什么是最坏时间复杂性?什么是最好时间复杂性? 答:最坏情况时间复杂性:
最好情况时间复杂性::
I* 是 DN中使 T(N, I*) 达到 Tmax(N)的合法输入; P(I) 是在算法的应用中出现输入 I 的概率 精品文档
精品文档
5、 什么是递归算法?什么是递归函数? 递归算法 (包括直接递归和间接递归子程序) 都是通过自己调用自己, 将求解问题转化成性 质相同的子问题, 最终达到求解的的。 递归算法充分地利用了计算机系统内部机能, 自动实 现调用过程中对相关且必要的信息的保存与恢复,从而省略了求解过程中的许多细节的描 述。【课本】 直接递归 子程序在运行完成前调用它们自己。 间接递归 子程序在运行过程中调用其它子程序,其他子程序反过来调用这个调用子程序。 递归函数, 把直接或间接地调用自身的函数称为递归函数。 函数的构建通常需要一个函数或 者一个过程来完成。

算法分析与设计习题集

算法分析与设计习题集

序号项目名称任务描述设计要求1. C语言词法分析算法设计与实现编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

输入:一段C语言程序输出:每个单词以及每个单词所在行号比如:输入如下一段C程序main(){int a,b;}输出为:( mian, ”line=1”);( ( , ”line=1“);( ) , ”line=1”);({ , ”line=2”);( int, “line=2”);……………用Java语言,或者C语言,推荐用Java语言。

完成所要有的C语言词法分析器。

要求:读文件,或者命令行的形式读取C源程序,输出源程序中每个单词以及每个单词所在行号。

要求:开发出图形化界面,读文件,把结果输出到界面上。

2.行程编码的设计与实现Run-Length Encoding(RLE)行程长度的原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。

例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。

对于拥有大面积,相同颜色区域的图像,用RLE压缩方法非常有效。

算法输入:图像算法输出:图像行程编码序列利用C语言,或者Java语言,完成算法对图像的行程编码.设计一个GUI界面,能够接受图像,输出图像的形成编码序列3.特征权重排序信息增益算法的设计与实现在文本分类领域中,信息增益IG是一种常用的特征排序算法的标准。

要求利用信息增益公式计算每个特征的信息增益值,并根据信息增益值从大到小输出。

举例如下:假设文本中包括的特征:outlook {sunny, overcast, rainy}// 晴天、多云、下雨temperature {hot, mild, cool} // 热、温和的、冷humidity {high, normal} // high表示潮湿、normal表示正常windy {Strong, weak} // TRUE表示有风、FALSE表示无风play {yes, no} yes表示打网球,no表示不打网球假设有14个样本如下:1 , Sunny , Hot , High , Weak , No2 , Sunny , Hot , High , Strong , No3 , Overcast , Hot , High , Weak , Yes利用Java语言实现样本中特征信息增益的计算,然后根据信息增益值从大到小排序。

《算法分析与设计》练习题一答案.docx

《算法分析与设计》练习题一答案.docx

《算法分析与设计》练习题一答案1.程序书写格式应该遵循哪四个原则?参考答案:(1)正确使用缩进:一定要有缩进,否则代码的层次不明显。

(2)在一行内只写一条语句。

(3), '}'位置不可随意放置。

(4)变量和运算符之间最好加1个空格2.什么是算法?参考答案:用计算机解决问题的过程可以分成三个阶段:分析问题、设计算法和实现算法。

算法可以理解为冇基本运算及规定的运算顺序所构成的完整的解题步骤,它是求解问题类的、机械的、统一的方法,它由有限多个步骤组成,对于问题类屮每个给定的具体问题,机械地执行这些步骤就可以得到问题的解答。

或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。

3.什么是线性结构?什么是非线性结构?参考答案:线性结构:数据逻辑结构屮的一类。

它的特征是若结构为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所冇结点都冇R只冇一个直接前趋和一个直接后继。

线性表就是一个典型的线性结构。

栈、队列、串等都是线性结构。

非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接而趋和直接后继。

数组、广义表、树和图等数据结构都是非线性结构。

4.已知二叉树后序遍丿力序列是DABEC,屮序遍丿力序列是DEBAC,则前序遍历序列是什么?参考答案:前序遍历序列是CEDBA5.什么是数制?参考答案:数制是人们利用符号进行计数的一种科学方法。

数制也称计数制,是用一组固定的符号和统一的规则來表示数值的方法。

6.如果将十进制数106转换为八进制数,结果是多少?参考答案:1527.请问查找算法的效率用什么进行度量?参考答案:平均查找长度ASL:在查找其关键字等于给定值的过程小,需要和给定值进行比较的关键字个数的期望值称为查找成功吋的平均查找长度。

AS厶=£皿/=1其屮,n是结点的个数;是杳找第i个结点的概率,是找到第i个结点所需要的比较次数。

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

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

算法分析与设计作业及参考答案作业题目1、请分析冒泡排序算法的时间复杂度和空间复杂度,并举例说明其在什么情况下性能较好,什么情况下性能较差。

2、设计一个算法,用于在一个已排序的整数数组中查找特定元素。

要求算法的时间复杂度为 O(log n)。

3、比较贪心算法和动态规划算法的异同,并举例说明它们在实际问题中的应用。

参考答案一、冒泡排序算法的分析冒泡排序(Bubble Sort)是一种简单的排序算法。

它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。

1、时间复杂度最坏情况:数组完全逆序,需要进行 n(n 1) / 2 次比较和交换操作,时间复杂度为 O(n^2)。

最好情况:数组已经有序,不需要进行交换操作,只需要进行 n 1 次比较,时间复杂度为 O(n)。

平均情况:时间复杂度也为 O(n^2)。

2、空间复杂度冒泡排序只在交换元素时使用了临时变量,空间复杂度为 O(1),是一个原地排序算法。

3、性能分析性能较好的情况:当数组规模较小且接近有序时,冒泡排序的性能相对较好。

因为在这种情况下,比较和交换的次数相对较少。

性能较差的情况:当数组规模较大且无序程度较高时,冒泡排序的性能会非常差。

因为需要进行大量的比较和交换操作,时间消耗很大。

例如,对于数组 2, 1, 3, 5, 4,冒泡排序需要经过多次比较和交换才能将其排序为 1, 2, 3, 4, 5。

而对于已经有序的数组 1, 2, 3, 4, 5,冒泡排序只需要进行较少的比较操作就能确定数组已经有序。

二、在已排序数组中查找特定元素的算法设计对于在已排序的整数数组中查找特定元素,我们可以使用二分查找(Binary Search)算法。

二分查找的基本思想是:将数组从中间分成两部分,比较目标元素与中间元素的大小,如果目标元素小于中间元素,则在左半部分继续查找;如果目标元素大于中间元素,则在右半部分继续查找;如果目标元素等于中间元素,则查找成功。

算法分析与设计习题集整理

算法分析与设计习题集整理

算法分析与设计习题集整理第一章算法引论一、填空题: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 ++)fo r(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;f or(j =0;j <=2n;j++ )ﻩ x++;}9、计算机求解问题的步骤:问题分析、数学模型建立、算法设计与选择、算法表示、算法分析、算法实现、程序调试、结果整理文档编制。

10、算法就是指解决问题的 方法或过程 。

二、简答题:1、按照时间复杂度从低到高排列:O( 4n 2)、O( l ogn)、O( 3n)、O( 20n)、O( 2)、O( n 2/3),O( n!)应该排在哪一位?答:O( 2),O( log n),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)f or(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)定义:指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。

《算法设计与分析》考试题目及答案解析

《算法设计与分析》考试题目及答案解析

《算法设计与分析》考试题⽬及答案解析《算法分析与设计》期末复习题⼀、选择题1.应⽤Johnson法则的流⽔作业调度采⽤的算法是(D)A. 贪⼼算法B. 分⽀限界法C.分治法D. 动态规划算法2.Hanoi塔问题如下图所⽰。

现要求将塔座A上的的所有圆盘移到塔座B上,并仍按同样顺序叠置。

移动圆盘时遵守Hanoi塔问题的移动规则。

由此设计出解Hanoi塔问题的递归算法正确的为:(B)Hanoi塔3. 动态规划算法的基本要素为(C)A. 最优⼦结构性质与贪⼼选择性质B.重叠⼦问题性质与贪⼼选择性质C.最优⼦结构性质与重叠⼦问题性质D. 预排序与递归调⽤4. 算法分析中,记号O表⽰(B),记号Ω表⽰(A),记号Θ表⽰(D)。

A.渐进下界B.渐进上界C.⾮紧上界D.紧渐进界E.⾮紧下界5. 以下关于渐进记号的性质是正确的有:(A)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))=?=6.能采⽤贪⼼算法求最优解的问题,⼀般具有的重要性质为:(A)A. 最优⼦结构性质与贪⼼选择性质B.重叠⼦问题性质与贪⼼选择性质C.最优⼦结构性质与重叠⼦问题性质D. 预排序与递归调⽤7. 回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。

A.⼴度优先B. 活结点优先 C.扩展结点优先 D. 深度优先8. 分⽀限界法在问题的解空间树中,按(A)策略,从根结点出发搜索解空间树。

A.⼴度优先B. 活结点优先 C.扩展结点优先 D. 深度优先9. 程序块(A)是回溯法中遍历排列树的算法框架程序。

A.B.C.D.10. 回溯法的效率不依赖于以下哪⼀个因素?(C )A.产⽣x[k]的时间;B.满⾜显约束的x[k]值的个数;C.问题的解空间的形式;D.计算上界函数bound的时间;E.满⾜约束函数和上界函数约束的所有x[k]的个数。

算法设计与分析课后习题

算法设计与分析课后习题

算法设计与分析课后习题(总8页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--第一章1. 算法分析题算法分析题1-1 求下列函数的渐进表达式(1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2)(2). n^2 / 10 + 2^n当n>5是,n^2 < 2 ^n所以,当n >= 1时,n^2/10 < 2 ^n故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n)(3). 21 + 1/n < 21 + 1 = 22 = O(1)(4). log(n^3)=3log(n)=O(log(n))(5). 10log(3^n) = (10log3)n = O(n)算法分析题1-6(1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5所以:f(n)=Θ(log(n)+5) =Θ(g(n))(2)因为:log(n) < √n ; f(n) = 2log(n); g(n)= √n所以:f(n) = O(g(n))(3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 2log(n)所以;f(n) = Ω(g(n))(4)因为:f(n) = nlogn +n; g(n) = logn所以:f(n) =Ω(g(n))(5)因为: f(n) = 10; g(n) = log(10)所以:f(n) =Θ(g(n))(6)因为: f(n)=log^2(n); g(n) = log(n)所以: f(n) ==Ω(g(n))(7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2所以: f(n) = Ω(g(n))(8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n所以: f(n) = O(g(n))习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)).分析与解答:因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)).第二章算法分析题2-3 设a[0:n-1]是已经排好序的数组。

算法设计与分析-课后习题集答案

算法设计与分析-课后习题集答案

第一章3. 最大公约数为1。

快1414倍。

程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。

(log )n O 。

(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。

3()n O 。

(3)画线语句的执行次数为。

O 。

(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。

2()n O 。

10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。

对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。

(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。

对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。

(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。

11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。

可选212c =,03n =。

对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。

(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。

可选 1c =,04n =。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划
15、求出上图中每对结点间的距离的算法,并给出计算结果。
16、已知序列a1,a2,…,an,试设计一算法,从中找出一子序列
ai1< ai2<…< aik
使k达到最大,并讨论其复杂性。
17、设计一个O(n2)时间的算法,找出由n个数组成的序列的最长的单调递增子序列。
18、旅游预算问题。一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游预算有如下规则:若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;每次加油时都加满;在一个加油站加油时,司机要花费2元买东西吃;司机不必为其他意外情况而准备额外的油;汽车开出时在起点加满油箱;计算精确到分(1元=100分)。编写算法估计实际行驶在某路线所需的最小费用。
8、利用分治策略,在n个不同元素中找出第k个最小元素。
9、设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表。
(1)每个选手必须与其它n-1选手各赛一次;
(2)每个选手一天只能赛一次。
10、已知序列{503,87,512,61,908,170,897,275,652,462},写一个自底向上的归并分类算法对该序列作升序排序,写出算法中每一次归并执行的结果。
19、下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用。
20、已知如下图,写出用动态规划求最短路径的递推关系式,并写出求从源点A0到终点A3的最短路径过程。给出求解算法。
6
A1A2
55 2
A0A3
34 4
B1B2
5
21、已知有向图G=<V,E>,试设计一算法以判断对于任意两点u和v,是否存在一条从u到v的路径,并分析其复杂度。
if ( a->data[i]!= a->data[i+1])i++;
else
{
for ( j=i; j<a->length; j++)a->data[j]=a->data[j+1];
a->length--;
}
}
6、分别写出求二叉树结点总数及叶子总数的算法。
①计算结点总数
int CountNode(BinTree *root)
return(num1+num2+1);
}
}
②计算叶子总数
int CountLeafs(BinTree *root)
{
int num1,num2;
if(root==Null) return(0);
else if(root->lchild==Null&&root->rchild==Null)
return(1);
12、设有n个正整数,编写一个算法将他们连接成一排,组成一个最大的多位整数。用贪心法求解本题。
13、对于下图给出的有向网,写出用Dijkstra方法求从顶点A到图中其它顶点的最短路径的算法,并写出执行算法过程中顶点的求解次序及从顶点A到各顶点路径的长度。
14、对于上图给出的有向图,写出最小成本生成树,给出求解算法。
}
a++;
continue;
}
else
{ if (i==0)
return;
a[--i]++;
}
} while (1)
}
main()
{ comb(5,3);
}
24、(组合问题)任取r个自然数,求这r个数的所有排列。
25、编写程序求解骑士巡游问题:在n行n列的棋盘上(如n=8),假设一位骑士(按象棋中“马走日”的行走法)从初始坐标位置(x1,y1)出发,要遍访(巡游)棋盘中的每一个位置一次。请编一个程序,为骑士求解巡游“路线图”(或告诉骑士,从某位置出发时,无法遍访整个棋盘—问题无解骑士巡游)。
Procedure骑士巡游(X1,Y1)
//用x和y表示骑士在棋盘上的位置,采用回溯法求解,骑士巡游可以有以下8个可能方向的走法。
1 2 3 4 5 6 7 8
X+2,Y+2
//
integer k, n, m, X,Y;
integer X(64), S(0:64, 1: 2);
S(0)(0,X1,Y1);
if(j<=t) rf[k…t]=r[j…t];
}
void MergeSort(S_TBL *p,ElemType *rf)
{/*对*p表归并排序,*rf为与*p表等长的辅助数组*/
ElemType *q1,*q2;
q1=rf;q2=p->elem;
for(len=1;len<p->length;len=2*len)/*从q2归并到q1*/
采用回溯法找问题的解,将找到的组合以从小到大顺序存于a[0],a[1],…,a[r-1]中,组合的元素满足以下性质:
(1)a[i+1]>a,后一个数字比前一个大;
(2)a-i<=n-r+1。
按回溯法的思想,找解过程可以叙述如下:
首先放弃组合数个数为r的条件,候选组合从只有一个数字1开始。因该候选解满足除问题规模之外的全部条件,扩大其规模,并使其满足上述条件(1),候选组合改为1,2。继续这一过程,得到候选组合1,2,3。该候选解满足包括问题规模在内的全部条件,因而是一个解。在该解的基础上,选下一个候选解,因a[2]上的3调整为4,以及以后调整为5都满足问题的全部要求,得到解1,2,4和1,2,5。由于对5不能再作调整,就要从a[2]回溯到a[1],这时,a[1]=2,可以调整为3,并向前试探,得到解1,3,4。重复上述向前试探和向后回溯,直至要从a[0]再回溯时,说明已经找完问题的全部解。按上述思想写成程序如下:
X(1)0; k1; m8
while k>0 do
X(k)X(k)+1
while X(k)≤m and not MOVE(k) do
X(k)X(k)+1
repeat
if X(k)≤m then
if k=64 then
print(X,S);return;
else
kk+1; //此处未判是否越界,即栈溢出。//
本题的算法思想是:由于顺序表中元素已按元素值非递减有序排列,值相同的元素比为相邻的元素,因此依次比较相邻两个元素,若值相等,则删除其中一个,否则继续向后查找,直到最后一个元素。实现本题功能的函数如下:
voiddel ( seqlist*a )
{
inti=0, j;
while ( i<a->length)
算法分析与设计习题集
基础篇
1、算法有哪些特点?它有哪些特征?它和程序的主要区别是什么?
2、算法的时间复杂度指的是什么?如何表示?
3、算法的空间复杂度指的是什么?如何表示?
4、设某一函数定义如下:
编写一个递归函数计算给定x的M(x)的值。
本函数是一个递归函数,其递归出口是:
M(x)= x-10x>100
:X(k)=3: S(k)( S(k-1,1)+1, S(k-1,2)+2 );
:X(k)=4: S(k)( S(k-1,1)+2, S(k-1,2)+1 );
:X(k)=5: S(k)( S(k-1,1)+2, S(k-1,2)-1 );
:X(k)=6: S(k)( S(k-1,1)+1, S(k-1,2)-2 );
endif
for ik - 1 to 0 by -1 do
if S(i)=S(k) then
return(FALSE);
endif
repeat
return(TRUE);
ENDMOVE
【程序】
# define MAXN 100
int a[MAXN];
void comb(int m,int r)
{ int i,j;
i=0;
a=1;
do {
if (a-i<=m-r+1
{ if (i==r-1)
{ for (j=0;j<r;j++)
printf(“%4d”,a[j]);
printf(“\n”);
22、判近亲问题。给定一个家族族谱,为简化问题起见,假设家族中的夫妻关系只表示男性成员。设用线性表存储家族成员,用成员的父指针指向其生父。编写一个在此种族谱表示方式下的算法,判断给定的二个家族成员是否是五代内的近亲。(提示:家族成员的表示方式应与搜索方式相适应。)
23、(组合问题)求出从自然数1,2,…,n中任取r个数的所有组合。
elseif(i<=p->length)
while(i<=p->length)/*若还剩下一个子表,则直接传入*/
q1[i]=q2[i];
q1<-->q2;/*交换,以保证下一趟归并时,仍从q2归并到q1*/
if(q1!=p->elem)/*若最终结果不在*p表中,则传入之*/
for(i=1;i<=p->length;i++)
else
{
num1=CountLeafs(root->lchild);
num2=CountLeafs(root->rchild);
return(num1+num2);
}
}
分治术
7、有金币15枚,已知其中有一枚是假的,而且它的重量比真币轻。要求用一个天平将假的金币找出来,试设计一种算法(方案),使在最坏情况下用天平的次数最少。
相关文档
最新文档