算法设计与分析C++语言描述课后答案
数据结构与算法分析:C语言描述(原书第2版简体中文版!!!)PDF+源代码+习题答案
数据结构与算法分析:C语⾔描述(原书第2版简体中⽂版!!!)PDF+源代码+习题答案转⾃:/Linux/2014-04/99735.htm数据结构与算法分析:C语⾔描述(原书第2版中⽂版!!!) PDF+源代码+习题答案数据结构与算法分析:C语⾔描述(原书第2版)是《data structures and algorithm analysis in c》⼀书第2版的简体中译本。
原书曾被评为20世纪顶尖的30部计算机著作之⼀,作者mark allen weiss在数据结构和算法分析⽅⾯卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到⼴泛好评.已被世界500余所⼤学⽤作教材。
在本书中,作者更加精炼并强化了他对算法和数据结构⽅⾯创新的处理⽅法。
通过c程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运⾏时间进⾏了分析。
数据结构与算法分析:C语⾔描述(原书第2版) PDF下载:百度⽹盘免费下载地址:(本⼈是从这⾥下载的,感谢原博主)全书特点如下: ●专⽤⼀章来讨论算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法以及回溯算法 ●介绍了当前流⾏的论题和新的数据结构,如斐波那契堆、斜堆、⼆项队列、跳跃表和伸展树 ●安排⼀章专门讨论摊还分析,考查书中介绍的⼀些⾼级数据结构 ●新开辟⼀章讨论⾼级数据结构以及它们的实现,其中包括红⿊树、⾃顶向下伸展树。
treap树、k-d树、配对堆以及其他相关内容 ●合并了堆排序平均情况分析的⼀些新结果⽬录出版者的话专家指导委员会译者序前⾔第1章引论第2章算法分析第3章表、栈和队列第4章树第5章散列第6章优先队列(堆)第7章排序第8章不相交集ADT第9章图论算法第10章算法设计技巧第11章摊还分析第12章⾼级数据结构及其实现索引。
数据结构与算法分析c语言描述中文答案
数据结构与算法分析c语言描述中文答案一、引言数据结构与算法是计算机科学中非常重要的基础知识,它们为解决实际问题提供了有效的工具和方法。
本文将以C语言描述中文的方式,介绍数据结构与算法分析的基本概念和原理。
二、数据结构1. 数组数组是在内存中连续存储相同类型的数据元素的集合。
在C语言中,可以通过定义数组类型、声明数组变量以及对数组进行操作来实现。
2. 链表链表是一种动态数据结构,它由一系列的节点组成,每个节点包含了数据和一个指向下一个节点的指针。
链表可以是单链表、双链表或循环链表等多种形式。
3. 栈栈是一种遵循“先进后出”(Last-In-First-Out,LIFO)原则的数据结构。
在C语言中,可以通过数组或链表实现栈,同时实现入栈和出栈操作。
4. 队列队列是一种遵循“先进先出”(First-In-First-Out,FIFO)原则的数据结构。
在C语言中,可以通过数组或链表实现队列,同时实现入队和出队操作。
5. 树树是一种非线性的数据结构,它由节点和边组成。
每个节点可以有多个子节点,其中一个节点被称为根节点。
在C语言中,可以通过定义结构体和指针的方式来实现树的表示和操作。
6. 图图是由顶点和边组成的数据结构,它可以用来表示各种实际问题,如社交网络、路网等。
在C语言中,可以通过邻接矩阵或邻接表的方式来表示图,并实现图的遍历和查找等操作。
三、算法分析1. 时间复杂度时间复杂度是用来衡量算法的执行时间随着问题规模增长的趋势。
常见的时间复杂度有O(1)、O(log n)、O(n)、O(n^2)等,其中O表示“量级”。
2. 空间复杂度空间复杂度是用来衡量算法的执行所需的额外内存空间随着问题规模增长的趋势。
常见的空间复杂度有O(1)、O(n)等。
3. 排序算法排序算法是对一组数据按照特定规则进行排序的算法。
常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等,它们的时间复杂度和空间复杂度各不相同。
《计算机算法-设计与分析导论》课后习题答案共39页word资料
4.1:在我们所了解的早期排序算法之中有一种叫做Maxsort 的算法。
它的工作流程如下:首先在未排序序列(初始时为整个序列)中选择其中最大的元素max ,然后将该元素同未排序序列中的最后一个元素交换。
这时,max 元素就包含在由每次的最大元素组成的已排序序列之中了,也就说这时的max 已经不在未排序序列之中了。
重复上述过程直到完成整个序列的排序。
(a) 写出Maxsort 算法。
其中待排序序列为E ,含有n 个元素,脚标为范围为0,,1n -K 。
void Maxsort(Element[] E) { int maxID = 0;for (int i=E.length; i>1; i--) { for (int j=0; j<i; j++) {if (E[j] > E[maxID]) maxID = k; E[i] <--> E[maxID];(b) 说明在最坏情况下和平均情况下上述算法的比较次数。
最坏情况同平均情况是相同的都是11(1)()2n i n n C n i -=-==∑。
4.2:在以下的几个练习中我们研究一种叫做“冒泡排序”的排序算法。
该算法通过连续几遍浏览序列实现。
排序策略是顺序比较相邻元素,如果这两个元素未排序则交换这两个元素的位置。
也就说,首先比较第一个元素和第二个元素,如果第一个元素大于第二个元素,这交换这两个元素的位置;然后比较第二个元素与第三个元素,按照需要交换两个元素的位置;以此类推。
(a)起泡排序的最坏情况为逆序输入,比较次数为11(1)()2n i n n C n i -=-==∑。
(b) 最好情况为已排序,需要(n-1)次比较。
4.3: (a)归纳法:当n=1时显然成立,当n=2时经过一次起泡后,也显然最大元素位于末尾;现假设当n=k-1是,命题也成立,则当n=k 时,对前k-1个元素经过一次起泡后,根据假设显然第k-1个元素是前k-1个元素中最大的,现在根据起泡定义它要同第k 个元素进行比较,当k 元素大于k-1元素时,它为k 个元素中最大的,命题成立;当k 元素小于k-1元素时,它要同k-1交换,这时处于队列末尾的显然时队列中最大的元素。
算法设计与分析课后部分习题答案
算法实现题3-7 数字三角形问题问题描述:给定一个由n行数字组成的数字三角形,如图所示。
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
编程任务:对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。
数据输入:有文件input.txt提供输入数据。
文件的第1行是数字三角形的行数n,1<=n<=100。
接下来的n行是数字三角形各行的数字。
所有数字在0-99之间。
结果输出:程序运行结束时,将计算结果输出到文件output.txt中。
文件第1行中的数是计算出的最大值。
输入文件示例输出文件示例 input.txt output.txt 5 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5源程序:#include "stdio.h" voidmain(){ intn,triangle[100][100],i,j;//triangle数组用来存储金字塔数值,n表示行数 FILE *in,*out;//定义in,out两个文件指针变量in=fopen("input.txt","r");fscanf(in,"%d",&n);//将行数n读入到变量n中for(i=0;i<n;i++)//将各行数值读入到数组triangle中for(j=0;j<=i;j++)fscanf(in,"%d",&triangle[i][j]);for(int row=n-2;row>=0;row--)//从上往下递归计算for(int col=0;col<=row;col++)if(triangle[row+1][col]>triangle[row+1][col+1])triangle[row][col]+=triangle[row+1][col];elsetriangle[row][col]+=triangle[row+1][col+1];out=fopen("output.txt","w");fprintf(out,"%d",triangle[0][0]);//将最终结果输出到output.txt中 }算法实现题4-9 汽车加油问题问题描述:一辆汽车加满油后可行驶nkm。
数据结构与算法分析c语言描述中文答案
数据结构与算法分析c语言描述中文答案【篇一:数据结构(c语言版)课后习题答案完整版】选择题:ccbdca6.试分析下面各程序段的时间复杂度。
(1)o(1)(2)o(m*n)(3)o(n2)(4)o(log3n)(5)因为x++共执行了n-1+n-2+??+1= n(n-1)/2,所以执行时间为o(n2)(6)o(n)第2章线性表1.选择题babadbcabdcddac 2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
elemtype max (linklist l ){if(l-next==null) return null;pmax=l-next; //假定第一个结点中数据具有最大值 p=l-next-next; while(p != null ){//如果下一个结点存在if(p-data pmax-data) pmax=p;p=p-next; }return pmax-data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void inverse(linklist l) { // 逆置带头结点的单链表 l p=l-next; l-next=null; while ( p) {q=p-next; // q指向*p的后继p-next=l-next;l-next=p; // *p插入在头结点之后p = q; }}(10)已知长度为n的线性表a采用顺序存储结构,请写一时间复杂度为o(n)、空间复杂度为o(1)的算法,该算法删除线性表中所有值为item的数据元素。
[题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
算法设计与分析-课后习题集答案
(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;}
算法设计与分析C语言描述课后答案
第一章R 51-3.最大公约数为1。
快1414倍。
主要考虑循环次数,程序1-2的while 循环体做了 10次,程序1-3的while 循环体做了 14141次(14142-2 循环) 若考虑其他语句,则没有这么多,可能就 601倍。
第画线语句的执行次数为 T n 。
2-10. (1) 当F 1 2时,5n 8n2 5n 2 ,所以,可选c 5 , n 0 1 o 对于nn,f(n) 5n 28n 2 5n 2,所以,5n 2 8n 2(n 2)。
(2) 当F8时,L 2ccL25n 8n 2 5n2n 224n ,所以,可选c 4 ,n 0 8。
对于n n 0,f(n) 5n 28n 2 4n 22,所以,5n8n 2 (n 2)。
(3) 由(1 )、(: 2 )可 '知,取 G 4, c 2 5 ,n 。
8,当n n 0时,有2qn 5n 28n2qn' 「,所以5n28n 2 (n 2)。
2-11. (1) 当 n 3 时,log nlog 3n ,所以 f (n) 20n logn 21n , g(n)n log 3n 2n 。
可选 21一,n o 3。
对于 n 2 n o ,f(n) cg(n),即 f(n)(g (n ))。
注意:是f (n )和g (n )的关系。
(2) 2 2log n ,所以 f (n) n /log nn 2,g(n) n log 2 n n 2。
可选 c 1,n o 对于 n n o , f(n) 2n cg(n),即 f(n) (g(n))。
因为 f(n) (log n)lognjogdogn),g(门)门/ log n n log n 2。
当 F4 时,f(n) nlog(logn)2-8. (1)画线语句的执行次数为logn 。
(log n )。
划线语句的执行次数应该理解为一格整体。
(2)画线语句的执行次数为 n(n 1)(n 2)。
算法设计与分析课后答案
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. 这个断言是正确的。
算法分析与设计第二版习题答案-第三章到第五章
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-
算法设计与分析课后习题解答
C1*(g1+g2)<= t1(n)+t2(n) <=c2(g1+g2)—----(3)
不失一般性假设max(g1(n),g2(n))=g1(n)。
显然,g1(n)+g2(n)<2g1(n),即g1+g2〈2max(g1,g2)
又g2(n)〉0,g1(n)+g2(n)>g1(n),即g1+g2>max(g1,g2).
算法设计与分析基础课后练习答案
习题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。该算法稳定吗?
c.该算法在位吗?
解:
a。该算法对列表”60,35,81,98,14,47”排序的过程如下所示:
b.该算法不稳定.比如对列表"2,2*”排序
c.该算法不在位.额外空间for S and Count[]
4.(古老的七桥问题)
第2章
习题2。1
7。对下列断言进行证明:(如果是错误的,请举例)
Else return A[n—1]
a.该算法计算的是什么?
b.建立该算法所做的基本操作次数的递推关系并求解
解:
a.计算的给定数组的最小值
b.
9。考虑用于解决第8题问题的另一个算法,该算法递归地将数组分成两半。我们将它称为Min2(A[0..n-1])
田翠华著《算法设计与分析》课后习题参考答案
参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易2 算法设计与分析纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
算法设计与分析书后参考答案
参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
算法设计与分析课后习题解答
c.该算法在位吗?
解:
a.该算法对列表”60,35,81,98,14,47”排序的过程如下所示:
b.该算法不稳定.比如对列表”2,2*”排序
c.该算法不在位.额外空间for S and Count[]
4.(古老的七桥问题)
第2章
习题2.1
7.对下列断言进行证明:(如果是错误的,请举例)
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。故gcd(m,n)=gcd(n,r)
7.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?
Hint:
对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n,即
b.有a可知计算gcd(31415,14142)欧几里德算法做了11次除法。
连续整数检测算法在14142每次迭代过程中或者做了一次除法,或者两次除法,因此这个算法做除法的次数鉴于1·14142和2·14142之间,所以欧几里德算法比此算法快1·14142/11≈1300与2·14142/11≈2600倍之间。
Else temp1←Min2(A[l..(l+r)/2])
Temp2←Min2(A[l..(l+r)/2]+1..r)
If temp1≤temp2 return temp1
Else return temp2
a.建立该算法所做的的操作次数的递推关系并求解
b.算法Min1和Min2哪个更快?有其他更好的算法吗?
1,2,5,10---分别代表4个人, f—手电筒
4.对于任意实系数a,b,c,某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)
算法设计与分析 C 语言描述课后答案 陈慧南版湖北汽车工业学院
2i1T 2 2 i 1 n log n 2n 4n 2n i 2 2i1 4 2n log n log n 1 i 2 i 1 n
2n 2n log 2 n 2n log n log 2 n 3log n 2 n n log 2 n n log n
if(a[mid]<b[i]) left=mid; else if(a[mid]>b[i]) right=mid; else {cnt=mid; break;} }while(left<right-1) if(a[left]<b[i]) cnt=left; elsecnt=left-1; if(k>cnt) { if(cnt>0) { for(j=0;j<cnt;j++) { temp[j]=a[r]; r++; } left=cnt; k-=cnt; } else { temp[j]=b[i]; left=0; k--; } } else { for(j=0;j<k;j++) { temp[j]=a[r]; r++; } left=cnt; k-=cnt; return temp[k-1]; } } } } 第六章 1.由题可得:
E log n , n 1 I n E 2n n E 成功搜索的平均时间复杂度为 As n 1 log n 。 n n n 其中, I 是二叉判定树的内路径长度, E 是外路径长度,并且 E I 2n 。 Au n
2-10. ( 1 ) 当 n 1 时 , 5n 2 8n 2 5n 2 , 所 以 , 可 选 c 5 , n0 1 。 对 于 n n0 ,
《数据结构与算法分析:C语言描述_原书第二版》CH2算法分析_课后习题_部分解答
《数据结构与算法分析:C语⾔描述_原书第⼆版》CH2算法分析_课后习题_部分解答对于⼀个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这⾥尽⾃⼰的努⼒给出部分习题的详解:不当之处,欢迎指正。
1、按增长率排列下列函数:N,√2,N1.5,N2,NlogN, NloglogN,N log2N,Nlog(N2),2/N,2N,2N/2,37,N2logN,N3。
指出哪些函数以相同的增长率增长。
答:排列如下2/N < 37 < √2 < N < NloglogN < NlogN < Nlog(N2) < Nlog2N < N1.5 < N2 < N2logN < N3 < 2N/2 < 2N。
其中,NlogN 与 Nlog(N2) 的增长率相同,均为O(NlogN)。
补充说明:a) 其中 Nlog2N 与 N1.5, N3与 2N/2⼤⼩关系的判定,可以连续使⽤洛必达法则(N->∞时,两个函数⽐值的极限,等于它们分别求导后⽐值的极限)。
当然,更简单的是两边直接求平⽅。
b) 同时注意⼀个常⽤法则:对任意常数k,log k N = O(N)。
这表明对数增长得⾮常缓慢。
习题3中我们会证明它的⼀个更严格的形式。
2、函数NlogN 与 N1+ε/√logN (ε>0) 哪个增长得更快? 分析:我们⾸先考虑的可能是利⽤洛必达法则,但是对于第⼆个函数其上下两部分皆含有变量,难以求导(当然也不是不⾏,就是⿇烦些,如果你愿意设y = N1+ε/√logN,然后对两边取对数的话)。
这⾥我们将利⽤反证法: 要证NlogN < N1+ε/√logN,即证 logN < Nε/√logN。
既然⽤反证法,那么我们假设 Nε/√logN < logN。
两边取对数有ε/√logN logN < loglogN。
数据结构与算法分析c语言描述中文答案
数据结构与算法分析c语言描述中文答案【篇一:数据结构(c语言版)课后习题答案完整版】选择题:ccbdca6.试分析下面各程序段的时间复杂度。
(1)o(1)(2)o(m*n)(3)o(n2)(4)o(log3n)(5)因为x++共执行了n-1+n-2+??+1= n(n-1)/2,所以执行时间为o(n2)(6)o(n)第2章线性表1.选择题babadbcabdcddac 2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
elemtype max (linklist l ){if(l-next==null) return null;pmax=l-next; //假定第一个结点中数据具有最大值 p=l-next-next; while(p != null ){//如果下一个结点存在if(p-data pmax-data) pmax=p;p=p-next; }return pmax-data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void inverse(linklist l) { // 逆置带头结点的单链表 l p=l-next; l-next=null; while ( p) {q=p-next; // q指向*p的后继p-next=l-next;l-next=p; // *p插入在头结点之后p = q; }}(10)已知长度为n的线性表a采用顺序存储结构,请写一时间复杂度为o(n)、空间复杂度为o(1)的算法,该算法删除线性表中所有值为item的数据元素。
[题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章15P1-3. 最大公约数为1。
快1414倍。
主要考虑循环次数,程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)若考虑其他语句,则没有这么多,可能就601倍。
第二章32P2-8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。
(log )n O 。
划线语句的执行次数应该理解为一格整体。
(2)画线语句的执行次数为111(1)(2)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执行次数为。
O 。
(4)当n 为奇数时画线语句的执行次数为(1)(3)4n n ++, 当n 为偶数时画线语句的执行次数为 2(2)4n +。
2()n O 。
2-10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()n n n -+=O 。
(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 -+=Θ。
2-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 。
注意:是f (n )和g (n )的关系。
(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。
可选 1c =,04n =。
对于 0n n ≥,2()()f n n cg n <≤,即 ()(())f n g n =O 。
(3)因为 log log(log )()(log )nn f n n n ==,()/log log 2n g n n n n ==。
当 4n ≥ 时,log(log )()n f n nn =≥,()log 2n g n n n =<。
所以,可选 1c =,04n =,对于0n n ≥,()()f n cg n ≥,即 ()(())f n g n =Ω。
第二章 2-17. 证明:设2i n =,则 log i n =。
()22log 2n T n T n n ⎛⎫⎢⎥=+ ⎪⎢⎥⎣⎦⎝⎭2222log 2log 222n n n T n n ⎡⎤⎛⎫⎢⎥⎛⎫=+⨯⨯+⎢⎥ ⎪ ⎪⎢⎥⎣⎦⎝⎭⎝⎭⎣⎦()2222log log22log 2n T n n n n ⎛⎫⎢⎥=+-+ ⎪⎢⎥⎣⎦⎝⎭22222log 22n T n n n ⎛⎫⎢⎥=+⨯- ⎪⎢⎥⎣⎦⎝⎭2322222log 22log 2222n n n T n n n ⎡⎤⎛⎫⎢⎥=+⨯⨯+⨯-⎢⎥ ⎪⎢⎥⎣⎦⎝⎭⎣⎦ ()3322log log422log 22n T n n n n n ⎛⎫⎢⎥=+-+⨯- ⎪⎢⎥⎣⎦⎝⎭33232log 242n T n n n n ⎛⎫⎢⎥=+⨯-- ⎪⎢⎥⎣⎦⎝⎭=L L()22log 24212k k n T kn n n n n k ⎛⎫⎢⎥=+----- ⎪⎢⎥⎣⎦⎝⎭L ()()()12221log 2422i T i n n n n n i -=+------L ()()()1242log log 121i n n n i i n -=⨯+----()2222log 2log log 3log 2n n n n n n n n =+---+ 2log log n n n n =+当2n ≥ 时,()22log T n n n ≤。
所以,()()2log T n n n =O 。
第五章5-4. SolutionType DandC1(int left,int right) {while(!Small(left,right)&&left<right) {int m=Divide(left,right); if(x<P(m) right=m-1;else if(x>P[m]) left=m+1; else return S(P) } }5-7. template <class T>int SortableList<T>::BSearch(const T&x,int left,int right) const { if (left<=right) {int m=(right+left)/3;if (x<l[m]) return BSearch(x,left,m-1);else if (x>l[m]) return BSearch(x,m+1,right); else return m; }return -1; }第五章 9.426351701234567-10证明:因为该算法在成功搜索的情况下,关键字之间的比较次数至少为log n ⎢⎥⎣⎦,至多为log 1n +⎢⎥⎣⎦。
在不成功搜索的情况下,关键字之间的比较次数至少为log 1n +⎢⎥⎣⎦,至多为log 2n +⎢⎥⎣⎦。
所以,算法的最好、最坏情况的时间复杂度为()log n Θ。
假定查找表中任何一个元素的概率是相等的,为1n,那么, 不成功搜索的平均时间复杂度为()()log 1u EA n n n ==Θ+, 成功搜索的平均时间复杂度为()()21log s I n E n n EA n n n n n+-+===-=Θ。
其中,I 是二叉判定树的内路径长度,E 是外路径长度,并且2E I n =+。
12.(1)证明:当或或时,程序显然正确。
当n=right-left+1>2时,程序执行下面的语句: int k=(right-left+1)/3; StoogeSort(left,right-k); StoogeSort(left+k,right); StoogeSort(left,right-k);①首次递归StoogeSort(left,right-k);时,序列的前2/3的子序列有序。
②当递归执行StoogeSort(left+k,right);时,使序列的后2/3的子序列有序,经过这两次递归排序,使原序列的后1/3的位置上是整个序列中较大的数,即序列后1/3的位置上数均大于前2/3的数,但此时,前2/3的序列并不一定是有序的。
③再次执行StoogeSort(left,right-k);使序列的前2/3有序。
经过三次递归,最终使序列有序。
所以,这一排序算法是正确的。
(2)最坏情况发生在序列按递减次序排列。
()()010T =T =,()21T =,()2313n n ⎛⎫T =T +⎪⎝⎭。
设322in ⎛⎫= ⎪⎝⎭,则log 1log31n i -=-。
()2431331139n n n ⎡⎤⎛⎫⎛⎫T =T +=T ++ ⎪ ⎪⎢⎥⎝⎭⎝⎭⎣⎦49319n ⎛⎫=T ++ ⎪⎝⎭=L L122333313i ii i n --⎡⎤⎛⎫=T +++++⎢⎥ ⎪⎝⎭⎢⎥⎣⎦L()31322i i-=T +()31322i =- log 1log31312222n n --=⨯⨯- log3log313n-≤⨯log3log31n -⎛⎫=O ⎪ ⎪⎝⎭冒泡排序最坏时间复杂度为()2n O ,队排序最坏时间复杂度为()log n n O ,快速排序最坏时间复杂度为()log n n O 。
所以,该算法不如冒泡排序,堆排序,快速排序。
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;} int *p=new temp[k];int mid,left=0,right=n-1,cnt=0,j=0,r=0; for(int i=0;i<m;i++) {while(k>0) {do {mid=(left+right)/2;if(a[mid]<b[i]) left=mid;else if(a[mid]>b[i]) right=mid; else {cnt=mid; break;} }while(left<right-1)if(a[left]<b[i]) cnt=left; else cnt=left-1; if(k>cnt) {if(cnt>0) {for(j=0;j<cnt;j++) {temp[j]=a[r]; r++; }left=cnt; k-=cnt; } else {temp[j]=b[i]; left=0; k--; } } else {for(j=0;j<k;j++) {temp[j]=a[r]; r++; }left=cnt; k-=cnt;return temp[k-1]; }}} }第六章1.由题可得:012345601234561051576183,,,,,,,,,,,,2357141p p p p p p p w w w w w w w ⎛⎫⎛⎫=⎪ ⎪⎝⎭⎝⎭,所以,最优解为()01234562,,,,,,,1,,1,0,1,1,13x x x x x x x ⎛⎫= ⎪⎝⎭,最大收益为211051561835533+⨯++++=。
8.第六章6-9.普里姆算法。
因为图G 是一个无向连通图。
所以n-1<=m<=n (n-1)/2;O(n)<=m<=O(n 2);克鲁斯卡尔对边数较少的带权图有较高的效率,而()()1.992m n n =O ≈O ,此图边数较多,接近完全图,故选用普里姆算法。
6-10.T 仍是新图的最小代价生成树。
证明:假设T 不是新图的最小代价生成树,T ’是新图的最小代价生成树,那么cost(T ’)<cost(T)。