算法设计技巧与分析答案
- 格式:docx
- 大小:373.79 KB
- 文档页数:16
算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。
以下是一些典型的算法设计与分析习题及其答案。
习题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:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。
习题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]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计技巧与分析习题答案【篇一:算法设计与分析考试题及答案】一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。
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所需的时间分别为ai和bi,且(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),并画出其解空间树,计算其最优值及最优解。
算法设计与分析基础课后练习答案习题1.14.设计一个计算的算法,n是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求//输入:一个正整数n 2//输出:。
step1:a=1;step2:若a*a<n 转step 3,否则输出a;step3:a=a+1转step 2;5. a.用欧几里德算法求gcd(31415,14142)。
b. 用欧几里德算法求gcd(31415,14142),比检查min{m,n}和gcd(m,n)间连续整数的算法快多少倍?请估算一下。
a. gcd(31415, 14142) = gcd(14142, 3131) = gcd(3131, 1618) =gcd(1618, 1513) = gcd(1513, 105) = gcd(1513, 105) = gcd(105, 43) =gcd(43, 19) = gcd(19, 5) = gcd(5, 4) = gcd(4, 1) = gcd(1,0) = 1.b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142 和2·14142之间,所以欧几里德算法比此算法快1·14142/11 ≈1300 与2·14142/11 ≈2600 倍之间。
6.证明等式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)具有相同的公约数的有限非空集,其中也包括了最大公约数。
算法分析与设计作业及参考答案作业题目1、请分析冒泡排序算法的时间复杂度和空间复杂度,并举例说明其在实际中的应用场景。
2、设计一个算法,用于在一个未排序的整数数组中找到第二大的元素,并分析其时间复杂度。
3、比较贪心算法和动态规划算法的异同,并分别举例说明它们在解决问题中的应用。
参考答案1、冒泡排序算法时间复杂度:冒泡排序的基本思想是通过相邻元素的比较和交换,将最大的元素逐步“浮”到数组的末尾。
在最坏情况下,数组完全逆序,需要进行 n 1 轮比较和交换,每一轮比较 n i 次(i 表示当前轮数),所以总的比较次数为 n(n 1) / 2,时间复杂度为 O(n^2)。
在最好情况下,数组已经有序,只需要进行一轮比较,时间复杂度为 O(n)。
平均情况下,时间复杂度也为 O(n^2)。
空间复杂度:冒泡排序只在原数组上进行操作,不需要额外的存储空间,空间复杂度为 O(1)。
应用场景:冒泡排序算法简单易懂,对于规模较小的数组,或者对算法的简单性要求较高而对性能要求不是特别苛刻的场景,如对少量数据进行简单排序时,可以使用冒泡排序。
例如,在一个小型的学生成绩管理系统中,需要对一个班级的少量学生成绩进行排序展示,冒泡排序就可以满足需求。
2、找到第二大元素的算法以下是一种使用遍历的方法来找到未排序整数数组中第二大元素的算法:```pythondef find_second_largest(arr):largest = arr0second_largest = float('inf')for num in arr:if num > largest:second_largest = largestlargest = numelif num > second_largest and num!= largest:second_largest = numreturn second_largest```时间复杂度分析:这个算法需要遍历数组一次,所以时间复杂度为O(n)。
算法设计技巧与分析参考答案第1章算法分析基本概念1.1(a)6 (b)5 (c)6 (d)61.4算法执行了7+6+5+4+3+2+1=28次比较1.5(a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。
(b) 算法MODSELECTIONSORT执行的元素赋值的最多次数是3(1)2n n ,元素已按非升序排列的时候达到最小值。
1.7由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。
1.11由上图可以得出比较次数为5+6+6+9=26次。
1.13FTF,TTT,FTF,TFF,FTF 1.16(a) 执行该算法,元素比较的最少次数是n-1。
元素已按非降序排列时候达到最小值。
(b) 执行该算法,元素比较的最多次数是(1)2n n -。
元素已按非升序排列时候达到最大值。
(c) 执行该算法,元素赋值的最少次数是0。
元素已按非降序排列时候达到最小值。
(d) 执行该算法,元素赋值的最多次数是3(1)2n n -。
元素已按非升序排列时候达到最大值。
(e)n 用O 符号和Ω符号表示算法BUBBLESORT 的运行时间:2()t O n =,()t n =Ω(f)不可以用Θ符号来表示算法的运行时间:Θ是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列,因此不能用这一符号表示。
1.27不能用关系来比较2n 和2100n 增长的阶。
∵221lim0100100n n n →∞=≠ 2n ∴不是2(100)o n 的,即不能用关系来比较2n 和2100n 增长的阶。
1.32(a)当n 为2的幂时,第六步执行的最大次数是:12,2k k n j -==时,11[log ]log n ni i k n n n ====∑∑(b)由(a)可以得到:当每一次循环j 都为2的幂时,第六步执行的次数最大,则当33,22k kmn j ===(其中32k 取整)时,11[log(31)]log(1)n nkii i m n n ===-=-∑∑(c)用O 符号表示的算法的时间复杂性是(log )O n n 已证明n=2k 的情况,下面证明n=2k +1的情况:因为有⎥⎦⎥⎢⎣⎢+=⎥⎦⎥⎢⎣⎢21222k k所以n=2k +1时,第六步执行的最大次数仍是n log n 。
算法设计与分析基础课后练习答案算法设计与分析基础课后练习答案习题1.1 4.设计一个计算的算法,n 是任意正整数。
除了赋值和比较运算,该算法只能用到基本的四则运算操作。
能用到基本的四则运算操作。
算法求//输入:一个正整数n 2 //输出:。
step1:a=1;step2:若a*a<n 转step 3,否则输出a ; step3:a=a+1转step 2; 5. a .用欧几里德算法求gcd (31415,14142)。
b. 用欧几里德算法求gcd (31415,14142),比检查min {m ,n }和gcd (m ,n )间连续整数的算法快多少倍?请估算一下。
a. gcd(31415, 14142) = gcd(14142, 3131) = gcd(3131, 1618) =gcd(1618, 1513) = gcd(1513, 105) = gcd(1513, 105) = gcd(105, 43) =gcd(43, 19) = gcd(19, 5) = gcd(5, 4) = gcd(4, 1) = gcd(1, 0) = 1. b.有a 可知计算gcd (31415,14142)欧几里德算法做了11次除法。
次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142 和 2·14142之间,之间,所以欧几里德算法所以欧几里德算法比此算法快1·14142/11 ≈ 1300 与 2·14142/11 ≈ 2600 倍之间。
倍之间。
6.证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数对每一对正整数m,n 都成立. Hint: 根据除法的定义不难证明: l 如果d 整除u 和v, 那么d 一定能整除u ±v;l 如果d 整除u,那么d 也能够整除u 的任何整数倍ku. 对于任意一对正整数m,n,m,n,若若d 能整除m 和n,n,那么那么d 一定能整除n 和r=m mod n=m-qn n=m-qn;显然,若;显然,若d 能整除n 和r ,也一定能整除m=r+qn 和n 。
Algorithm Design Techniques and Analysis: English VersionExercise with AnswersIntroductionAlgorithms are an essential aspect of computer science. As such, students who are part of this field must master the art of algorithm design and analysis. Algorithm design refers to the process of creating algorithms that solve computational problems. Algorithm analysis, on the other hand, focuses on evaluating the resources required to execute those algorithms. This includes computational time and memory consumption.This document provides students with helpful algorithm design and analysis exercises. The exercises are in the formof questions with step-by-step solutions. The document is suitable for students who have completed the English versionof the Algorithm Design Techniques and Analysis textbook. The exercises cover various algorithm design techniques, such as divide-and-conquer, dynamic programming, and greedy approaches.InstructionEach exercise comes with a question and its solution. Read the question carefully and try to find a solution withoutlooking at the answer first. If you get stuck, look at the solution. Lastly, try the exercise agn without referring to the answer.Exercise 1: Divide and ConquerQuestion:Given an array of integers, find the maximum possible sum of a contiguous subarray.Example:Input: [-2, -3, 4, -1, -2, 1, 5, -3]Output: 7 (the contiguous subarray [4, -1, -2, 1, 5]) Solution:def max_subarray_sum(arr):if len(arr) ==1:return arr[0]mid =len(arr) //2left_arr = arr[:mid]right_arr = arr[mid:]max_left_sum = max_subarray_sum(left_arr)max_right_sum = max_subarray_sum(right_arr)max_left_border_sum =0left_border_sum =0for i in range(mid-1, -1, -1):left_border_sum += arr[i]max_left_border_sum =max(max_left_border_sum, left_b order_sum)max_right_border_sum =0right_border_sum =0for i in range(mid, len(arr)):right_border_sum += arr[i]max_right_border_sum =max(max_right_border_sum, righ t_border_sum)return max(max_left_sum, max_right_sum, max_left_border_s um+max_right_border_sum)Exercise 2: Dynamic ProgrammingQuestion:Given a list of lengths of steel rods and a corresponding list of prices, determine the maximum revenue you can get by cutting these rods into smaller pieces and selling them. Assume the cost of each cut is 0.Lengths: [1, 2, 3, 4, 5, 6, 7, 8]Prices: [1, 5, 8, 9, 10, 17, 17, 20]If the rod length is 4, the maximum revenue is 10.Solution:def max_revenue(lengths, prices, n):if n ==0:return0max_val =float('-inf')for i in range(n):max_val =max(max_val, prices[i] + max_revenue(length s, prices, n-i-1))return max_valExercise 3: Greedy AlgorithmQuestion:Given a set of jobs with start times and end times, find the maximum number of non-overlapping jobs that can be scheduled.Start times: [1, 3, 0, 5, 8, 5]End times: [2, 4, 6, 7, 9, 9]Output: 4Solution:def maximum_jobs(start_times, end_times):job_list =sorted(zip(end_times, start_times))count =0end_time =float('-inf')for e, s in job_list:if s >= end_time:count +=1end_time = ereturn countConclusionThe exercises presented in this document provide a practical way to master essential algorithm design and analysis techniques. Solving the problems without looking at the answers will expose students to the type of problems they might encounter in real life. The document’s solutionsprovide step-by-step instructions to ensure that students can approach the problems with confidence.。
5..证明等式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//输出:实根或者无解信息D←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章算法分析基本概念1.1(a) 6 (b)5 (c)6 (d)61.4算法执行了7+6+5+4+3+2+1=28次比较1.5(a) 算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。
(b) 算法MODSELECTIONSORT执行的元素赋值的最多次数是3n(F),元素已按非升序排列的时候达到最小值。
1.71次由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次1.11由上图可以得出比较次数为5+6+6+9=26次1.13FTF,TTT,FTF,TFF,FTF 1.16⑻ 执行该算法,元素比较的最少次数是 n-1。
元素已按非 降序排列时候达到最小值。
(b)执行该算法,元素比较的最多次数是 吨严。
元素已按非升序排列时候达到最大值。
(c) 执行该算法,元素赋值的最少次数是 0。
元素已按非降序排列时候达到最小值。
(d) 执行该算法,元素赋值的最多次数是 空严。
元素已按非升序排列时候达到最大值。
(e) n 用o 符号和「符号表示算法 BUBBLESORT 的运行时 间:t =O(n 2), t"(n)(f) 不可以用0符号来表示算法的运行时间:0是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列, 因此不能用这一符号表示。
1.27不能用「关系来比较n 2和100n 2增长的阶2 .. n lim 2n ::100n 2n 2不是o(100n 2)的,即不能用•关系来比较n 2和100n 2增长 的阶。
1.321 100=0(a) 当n 为2的幕时,第六步执行的最大次数是:^2k , j =2kJ 时,nn、k _、[log n ]二 n log ni 4i 4(b) 由⑻可以得到:当每一次循环j 都为2的幕时,第六步 执行的次数最大,n n m — [log(3k -1)H nlog( n-1)i 4i 4(c)用0符号表示的算法的时间复杂性是 O(nlog n) 已证明n=2k的情况,下面证明 n=2k+1的情况:所以n=2kn log n 。
(d)用门符号表示的算法的时间复杂性是 门(n)。
当n 满足j =n/2取整为奇数时,算法执行的次数是 n 次,其他情况算法执行次数均大于n(e) O 更适合表示算法的时间复杂性。
因为本算法时间复 杂性从门(n)到O(nlog n),而心是表示精确阶的。
1.38对n 个数进行排序。
因为有则当3k=2mk(其中占取整)时,第5章归纳法5.3 (本题不仅有以下一个答案)1. max( n)过程:max(i)if n=1 retur n a[1]t=max(i-1)if a[i-1]>t return a[i-1]else retur n tend if5.6最多次数:C(n) = 0,n[c(n —1) + (n— 1),nnC(n)八jj1最少次数:C( n)二n-1 5.7n(n 1) 2C(n)0,n =1C(n _ 1)+1,n M2参考例5.15.14(a)不稳定,例如:可见SELECTIONSORT中相等元素的序在排序后改变。
(b)(c)(d)(f)稳定5.17(a)利用R(x)二xP n」(x) a o取x =3,P5(3) > 巳(3) > 巳(3) > 巳(3) > R(3) > P°(3)P2(3) =3* R(3) 4 P(3) =3* P°(3) 2 =11 P°(3) =3:P3(3) =3* F2(3) 1 =112 > F4(3) =3* P3(3) - 2 =338 > F5(3) =3* F4(3) 5=10195.18(a) p(2,5)p (2,2p (2p1)2 2 2 y=4 *2 :—y=2 =4:—y=1 *2 :—y=1第6章分治6.3输入:A[1,2,…n]输出:max,min1. for i=1 to mid2. j=high-i3. if a[i]>a[j], then exchange a[i],a[j]4. end for5. for i=low to mid6. if a[i+1]<a[low], then exchange a[low],a[i+1]7. end for8. for i=mid+1 to high9. if a[i+1]>a[high], then exchange a[high],a[i+1]10. end for6.5输入:一个整数数组A[1,2,…,n]输出:sum1.if high-low=1 then2. sum=a[low]+a[high]3. else4. mid=(low+high)/25 sum1=sum(low,mid)6 sum2=sum(mid+1,high)7. sum=sum1+sum28. end if9. return sum 算法需要的工作空间为36.10.12 25 17 19 51 32 45 18 22 37 1512 15 17 18 19 22 25 32 37 45 5112 25 17 19 51 3212 17 19 25 32 514518 2237 151518 2237 4512 25 1712 17 2519 51 3219 32 514518 2218 224537 1515 3717 32 22 37 1512251225 171225122519 5119 51 32195145181845 2218451951451837 156.31彩色代表i,j所指的数字j总在i前6.36共享知识分享快乐23 32 27 18 45 11 63 12 19 16 25 52 1414 18 11 12 19 16 23 32 45 27 25 52 6314 18 11 12 19 1612 11 14 18 19 1612 1111 12111118 19 1616 18 191616191932 45 27 25 52 6325 27 32 45 52 6325 2725 27272745 52 6345 52 6352 6352 63636・42Quicksort 不是稳定的。
6.43bcefg 均为适应的,a 、h 不是适应的第7章动态规划7.1(c),算法 BOTTOMUPSORT7.5字符串A= ”xzyzzyx ”和B= ”zxyyzxz ”的最长公共子序列长度为4,共有6个最长 公共子序列,分别是:① zyyx ②zyzz ③zyzx ④xyyx ⑤xyzz ⑥xyzx7.9C[1,5]=C[1,1]+C[2,5]+r[1]*r[2]*r[6]=307 C[1,5]=C[1,2]+C[3,5]+r[1]*r[3]*r[6]=252 C[1,5]=C[1,3]+C[4,5]+r[1]*r[4]*r[6]=372 C[1,5]=C[1,4]+C[5,5]+r[1]*r[5]*r[6]=260所以最优括号表达式为(M1M2)((M3M4)M5) 7.15'07 1 6 'Di =oO0 94 4 0 2J8 2 0」D 2【i,j] =mi"{Dji, j], D/,2]D/2, j]}oO7 0 1 9 6、D2 =4 4 0 2<1 8 2 0」D 3【i,j] = min{ D 2【i, j],D 2【i,3] D 2【3, j]}Ddi,j]二min{D °[i, j], D °[i,1] D °[1,j]} D 41 0 5 1 312 0 9 11 3 4 0 2 、1 6 2 0「 5 1 3 'D3 = 13 0 9 11 4 4 0 26 2 °」D4【i,j]二min{ D3【i, j],D3【i,4] D3A j]}广° 5 1 3、D4 =12 °9 113 4 ° 26 2 °」7.21当物品体积为负值时,运行算法会发生溢出错误。
第八章贪心算法由算法从s到t要选择先到a然后到t,其结果为4,而从s到t距离为2,所以探索不总是产生从s到t的距离8.23 (共有4棵最小生成树,此处仅举一例)□0 28Q 0 Q 12 1 :1 ;8.31每一个二叉树都取左边为0,右边为1则最优编码为a:10 b:001 c:0001d:0000 e:01 f:11注意:编码不唯一回溯法。