算法设计五章习题答案
C语言程序设计(第三版)谭浩强著 各章习题答疑

以八、 /* 以八、十六进制输出 */
} ???? 是对应的带符号短整数。 输出结果是八进制整数 十六进制整数
2
3.9 计算某个表达式的值。 通用程序清单如下: stdio.h” #include ”stdio.h stdio.h void main() { ?????? x; 计算表达式值存入x x=( 表达式 );/* 计算表达式值存入x */ printf(”% printf( %?\n”,x); ,x); } ?????? 表达式对应的数据类型符(需事先判断) ? 表达式为整型,则为d 表达式为实型,则为f 3
第七章习题答疑(二)
折半查找法在排序数组中查找某个数。 上课时已有提示。 7.13 字符串连接(b[]中字符串连接到a[]中字符串后) 设:a[10]=”12 ,b[]=”abc 12”, abc” 12 abc (1)找到a串的’\0’的下标(i=2) ’ (2)j=0; 当型循环(b[j]!=’\0’) ’\ ’ a[i]=b[j],i++,j++ (3)a[i]=’\0’ \ 7.15 字符串复制(b[]中字符串复制到a[]中) 设:a[10]=”12”,b[]=”abc” (1)i=0; 当型循环(b[i]!=’\0’) a[i]=b[i],i++ (2)a[i]=’\0’ 7.9
18
第十章习题答疑(一)
输入3个整数,按照由小到大顺序输出。 int x,y,z,*px=&x,*py=&y,*pz=&x; 用以前的程序,其中的x、y、z换成*px、*py、*pz 10.3 输入10个整数存入一维数组a[10],将其中最小数与第1 个数交换,最大数与最后一个数交换。 要求编3个函数: 10 10 输入10个整数、交换、输出交换后的10个整数。 输入函数: void in(int *p,int n) 输出函数: void out(int *p,int n) 交换函数: void change(int *p,int n) 其中寻找最大最小数的方法: int *q,*max,*min; for (max=min=p,q=p+1;q<p+n;q++) { if(*max<*q) max=q; if(*min>*q) min=q; } 19 交换的方法:*p和*min,*(p+n-1)和*max 10.1
算法设计与分析-习题参考答案

算法设计与分析基础习题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. 这个断言是正确的。
NOIP第五章习题一答案

第 3 页 共 9 页
/* 4.数组逆序重【1.6 编程基础之一维数组 04】 将一个数组中的值按逆序重新存放。例如,原来的顺序为 8,6,5,4,1。要求改为 1,4,5,6,8。 输入: 输入为两行:第一行数组中元素的个数 n(1<n<100),第二行是 n 个整数,每两个整数 之间用空格分隔。 输出: 输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。 样例输入: 5 86541 样例输出: 14568 */ #include "iostream" #include "iomanip" using namespace std; int main() { int count; int num[100]; cin>>count; for(int i=0;i<count;i++) { cin>>num[i]; } int n=count; int temp = count-1; if(count%2==0) count=count/2; else count=(count-1)/2; for(int i=0;i<count;i++) { int m; m=num[i]; num[i]=num[temp]; num[temp]=m; temp--; }
//
} /* 7.向量点积计算【1.6 编程基础之一维数组 07】 在线性代数、计算几何中,向量点积是一种十分重要的运算。给定两个 n 维向量 a=(a1,a2,...,an)和 b=(b1,b2,...,bn),求点积 a·b=a1b1+a2b2+...+anbn。 输入: 第一行是一个整数 n(1<=n<=1000)。 第二行包含 n 个整数 a1,a2,...,an。 第三行包含 n 个整数 b1,b2,...,bn。 相邻整数之间用单个空格隔开。每个整数的绝对值都不超过 1000。 输出: 一个整数,即两个向量的点积结果。 样例输入: 3 146 215
算法设计与分析课后部分习题答案

算法实现题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。
《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法及其分析》课后选择题答案及详解第1 章——概论1.下列关于算法的说法中正确的有()。
Ⅰ.求解某一类问题的算法是唯一的Ⅱ.算法必须在有限步操作之后停止Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产生确定的结果A.1个B.2个C.3个D.4个2.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是()。
A.T(n)=T(n-1)+1,T(1)=1B.T(n)=2nC.T(n)= T(n/2)+1,T(1)=1D.T(n)=3nlog2n答案解析:1.答:由于算法具有有穷性、确定性和输出性,因而Ⅱ、Ⅲ、Ⅳ正确,而解决某一类问题的算法不一定是唯一的。
答案为C。
2.答:选项A的时间复杂度为O(n)。
选项B的时间复杂度为O(n)。
选项C 的时间复杂度为O(log2n)。
选项D的时间复杂度为O(nlog2n)。
答案为C。
第3 章─分治法1.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。
这要求原问题和子问题()。
A.问题规模相同,问题性质相同B.问题规模相同,问题性质不同C.问题规模不同,问题性质相同D.问题规模不同,问题性质不同2.在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面()答案解释最合理。
A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。
但不同方法,算法复杂度上界可能不同3.对于下列二分查找算法,以下正确的是()。
A.intbinarySearch(inta[],intn,int x){intlow=0,high=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;if(x>a[mid])low=mid;elsehigh=mid;}return –1;}B.intbinarySearch(inta[],intn,int x) { intlow=0,high=n-1;while(low+1!=high){intmid=(low+high)/2;if(x>=a[mid])low=mid;elsehigh=mid;}if(x==a[low])returnlow;elsereturn –1;}C.intbinarySearch(inta[],intn,intx) { intlow=0,high=n-1;while(low<high-1){intmid=(low+high)/2;if(x<a[mid])high=mid;elselow=mid;}if(x==a[low])returnlow;elsereturn –1;}D.intbinarySearch(inta[],intn,int x) {if(n>0&&x>=a[0]){intlow= 0,high=n-1;while(low<high){intmid=(low+high+1)/2;if(x<a[mid])high=mid-1;elselow=mid;}if(x==a[low])returnlow;}return –1;}答案解析:1.答:C。
算法设计与分析习题与实验题(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)(⨯=。
【课程练习】习题解答-第五章 详细设计

第五章详细设计1.详细设计的基本任务是什么?有哪几种描述方法?详细设计的基本任务:(1)为每个模块进行详细的算法设计。
(2)为每个模块内的数据结构进行设计。
(3)对数据库进行设计,即确定数据库的物理结构。
(4)其他设计:a.代码设计b.输入/输出格式设计。
c.人机对话设计。
(5)编写详细设计说明书。
(6)评审。
描述方法(三种):a.程序流程图b.PAD图 C.过程设计语言2.结构化程序设计基本要求要点是什么?a.采用自顶向下、逐步求精的程序设计方法b.使用三种基本程序控制结构构造程序1).用顺序方式对过程分解,确定各部分的执行顺序。
2).用选择方式对过程分解,确定某个部分的执行条件。
3).用循环方式对过程分解,确定某个部分重复的开始和结束的条件。
c.主程序员组的组织形式。
3.简述Jackson 方法的设计步骤。
Jsp 方法一般通过以下5个步骤来完成设计:a.分析并确定输入/出数据的逻辑结构,并用Jackson 结构图表示这些数据结构。
b.找出输入数据结构和输出数据结构中有对应关系的数据单元。
c.按一定的规则由输入、输出的数据结构导出程序结构。
d.列出基本操作与条件,并把它们分配到程序结构图的适当位置。
e.用伪码写出程序。
4.请使用流程图、PAD图各PDL语言描述下列程序的算法。
(1)在数据A(1)-A(10)中求最大数和次大数。
(2)输入三个正整数作为边长、判断该三条边构成的三角形是等边、等腰或一般三角形。
答:(1)1)流程图:2)PAD图3)PDL语言定义n1=n2=0输入A(1).......A(10)n1=n2=A(1)while i>10if A(i)>=n1n2=n1n1=A(i)end while5.用PAD图描述下面问题的控制结构。
有一个表A(1)、A(2)、........A(n),按递增顺序排列。
给定一个Keyw值,在表中用折半查找。
若找到将表位置i送入x,否则将零送到x,同时将Key值插入表中。
算法与数据结构C语言习题参考答案1-5章

绪论1.将下列复杂度由小到大重新排序:A.2n B.n! C.n5D.10 000 E.n*log2 (n)【答】10 000< n*log2(n)< n5< 2n < n!2.将下列复杂度由小到大重新排序:A.n*log2(n) B.n + n2 + n3C.24D.n0.5【答】24< n0.5< n*log2 (n) < n + n2 + n33.用大“O”表示法描述下列复杂度:A.5n5/2 + n2/5 B.6*log2(n) + 9nC.3n4+ n* log2(n) D.5n2 + n3/2【答】A:O (n5/2) B:O (n) C:O (n4) D:O (n2)4.按照增长率从低到高的顺序排列以下表达式:4n2 , log3n, 3n , 20n , 2000 , log2n , n2/3。
又n!应排在第几位?【答】按照增长率从低到高依次为:2000, log3n, log2n , n2/3 , 20n , 4n2 , 3n。
n!的增长率比它们中的每一个都要大,应排在最后一位。
5. 计算下列程序片断的时间代价:int i=1;while(i<=n){printf(“i=%d\n”,i);i=i+1;}【答】循环控制变量i从1增加到n,循环体执行n次,第一句i的初始化执行次数为1,第二句执行n次,循环体中第一句printf执行n次,第二句i从1循环到n,共执行n次。
所以该程序段总的时间代价为:T(n) = 1 + n + 2n = 3n+ 1 = O(n)6. 计算下列程序片断的时间代价:int i=1;while(i<=n){int j=1;while(j<=n){int k=1;while(k<=n){printf(“i=%d,j=%d,k=%d\n”,I,j,k);k=k+1;}j=j+1;}i=i+1;}【答】循环控制变量i从1增加到n,最外层循环体执行n次,循环控制变量j从1增加到n,中间层循环体执行n次,循环控制变量k从1增加到n,最内层循环体执行n次,所以该程序段总的时间代价为:T(n) = 1 + n + n{1 + n + n[1 + n + 2n +1] +1 +1}+ 1= 3n3 + 3n2 +4n +2= O(n3)2. 线性表1.试写一个插入算法int insertPost_seq(palist, p, x ),在palist所指顺序表中,下标为p的元素之后,插入一个值为x的元素,返回插入成功与否的标志。
2020年算法分析设计习题答案

第3章 动态规划
2. 石子合并问题 问题描述: 在一个圆形操场的四周摆放着n堆石子. 现在要将石子有次序地合并 成一堆. 规定每次只能选相邻的2堆石子合并成一堆, 并将新的一堆石子数记为 该次合并的得分. 试设计一个算法, 计算出将n堆石子合并成一堆的最小得分和 最大得分. 算法设计: 对于给定n堆石子, 计算合并成一堆的最小得分和最大得分. 数据输入: 由文件input.txt提供输入数据. 文件的第1行是正整数n, 1n100, 表 示有n堆石子. 第2行有n个数, 分别表示n堆石子的个数. 结果输出: 将计算结果输出到文件output.txt, 文件第1行是最小得分, 第2行是最 大得分.
第五章 回溯
运动员最佳配对问题
问题描述: 羽毛球队有男女运动员各n人. 给定2个nn矩阵P和Q. P[i][j]是男运 动员i与女运动员j配混合双打的男运动员竞赛优势; Q[i][j]是女运动员i与男运 动员j配混合双打的女运动员竞赛优势. 由于技术配合和心理状态等各种因素 影响, P[i][j]不一定等于Q[j][i]. 男运动员i和女运动员j配对的竞赛优势是 P[i][j]*Q[j][i]. 设计一个算法, 计算男女运动员最佳配对法, 使得各组男女双方 竞赛优势的总和达到最大.
8.
若m[i,j]>t, 则m[i,j]=t; s[i,j]=k;
第3章 动态规划
再讨论圆周上的石子合并问题, 子结构[i:j]稍作修改 • 定义m[i][len]为合并第i堆到第i+len-1堆石子能得到的最少分数 • 当i+len-1>n时, 指跨过第n堆到第(i+len-1)%n堆,
仅sum函数需要修改
第2章 分治
2-8 设n个不同的整数排好序后存于T[1:n]中. 若存在一个下标i, 1 i n, 使得T[i]=i. 设计一个有效算法找到这个下标. 要求算 法在最坏情况下的计算时间O(log n).
(陈慧南 第3版)算法设计与分析——第5章课后习题答案

(3) 分析算法的时间复杂度 上述算法的时间复杂度为 n 2
(2) 编写 C 程序实现这一算法;
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 1000 struct point { double x; double y; }p1[N],pxSmall[N],pxLarge[N]; double Distance (point a , point b); double min (double a , double b); bool Compare_Y (point a , point b); bool Compare_X (point a , point b); double minDistance (int l, int r); int main() { int n ; double D ; cin>>n;
int main() { int n, x, *a; cin >> n; a = new int[n]; for (int i = 0; i < n; i++) cin >> a[i]; cin >> x; if (Triple_search(a, 0, n - 1, x) == -1) cout << "NotFound!" << endl; else cout << Triple_search(a, 0, n - 1, x) << endl; delete []a; return 0; } int Triple_search(int a[], int l, int r, int x) { if (l <= r) { int m1 = l + (r-l)/3; int m2 = l + (r-l)*2/3; if (a[m2]<x) return Triple_search(a, m2 + 1, r, x); else if (a[m1] < x && a[m2] > x) return Triple_search(a, m1 + 1, m2 - 1, x); else if (a[m1] > x) return Triple_search(a, l, m1 - 1, x); else if (a[m1] == x) return m1; else if (a[m2] == x) return m2; } return -1; }
算法分析与设计(习题答案)

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
算法分析与设计第二版习题答案-第三章到第五章

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-
数据结构与算法第5章课后答案

page: 1The Home of jetmambo - 第 5 章树和二叉树第 5 章树和二叉树(1970-01-01) -第 5 章树和二叉树课后习题讲解1. 填空题⑴树是n(n≥0)结点的有限集合,在一棵非空树中,有()个根结点,其余的结点分成m (m>0)个()的集合,每个集合都是根结点的子树。
【解答】有且仅有一个,互不相交⑵树中某结点的子树的个数称为该结点的(),子树的根结点称为该结点的(),该结点称为其子树根结点的()。
【解答】度,孩子,双亲⑶一棵二叉树的第i(i≥1)层最多有()个结点;一棵有n(n>0)个结点的满二叉树共有()个叶子结点和()个非终端结点。
【解答】2i-1,(n+1)/2,(n-1)/2【分析】设满二叉树中叶子结点的个数为n0,度为2的结点个数为n2,由于满二叉树中不存在度为1的结点,所以n=n0+n2;由二叉树的性质n0=n2+1,得n0=(n+1)/2,n2=(n-1)/2。
⑷设高度为h的二叉树上只有度为0和度为2的结点,该二叉树的结点数可能达到的最大值是(),最小值是()。
【解答】2h -1,2h-1【分析】最小结点个数的情况是第1层有1个结点,其他层上都只有2个结点。
⑸深度为k的二叉树中,所含叶子的个数最多为()。
【解答】2k-1【分析】在满二叉树中叶子结点的个数达到最多。
⑹具有100个结点的完全二叉树的叶子结点数为()。
【解答】50【分析】100个结点的完全二叉树中最后一个结点的编号为100,其双亲即最后一个分支结点的编号为50,也就是说,从编号51开始均为叶子。
⑺已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点。
则该树中有()个叶子结点。
【解答】12【分析】根据二叉树性质3的证明过程,有n0=n2+2n3+1(n0、n2、n3分别为叶子结点、度为2的结点和度为3的结点的个数)。
⑻某二叉树的前序遍历序列是ABCDEFG,中序遍历序列是CBDAFGE,则其后序遍历序列是()。
第3、4、5、6、7章C语言设计 习题答案

第三章习题答案1.掌握算法必须要掌握的五个特性:a)有穷性。
算法执行步骤的次数有限,能在有限时间内完成。
b)确切性。
每一步操作的执行步骤、执行结果确定,不能有二义性。
c)有效性。
算法中的每一步操作都是可执行的,即算法的每一步都能通过手工或机器在有限时间内完成。
d)必须有零个或多个输入。
e)必须有一个或多个输出。
2.算法是指令的有限序列,是求解问题显式的一步一步进行的过程。
为程序编写提供依据。
程序是用C语言单词将算法表达出来的过程。
算法是程序的灵魂。
3.数据类型总体分为三类:a)对象类型。
对象类型的基本类型又分为整型、浮点型、字符型。
b)函数类型。
c)不完全类型。
4.整型可分为:a)有符号整数。
它又包括 short int、int、long int、long long int。
b)无符号整数。
它又包括unsigned short int、unsigned int、unsigned longint、unsigned long long int。
不同数据类型数据的值域范围不同。
5.合法的标识符有:scanf、x、x1、_y 、_y2x、printf、main合法标识符由英文字母、数字、下划线组成,且第一个字符只能是英文字母或下划线。
关键词不能成为合法标识符。
6.略7.8.变量名:x 数据对象:3存储地址:&x 存储单元:8(在VS2005中)9.0x13B1:十六进制int型字面值;3e3:十进制 int型字面值;‘d’:字符型字面值;“my university”:字符串型字面值;99:十进制int型字面值;023:八进制int型字面值;1.3e-4:double型浮点型字面值;33U:十进制unsigned int型字面值;034L:八进制long int型字面值;0x34UL:十六进制unsigned long int型字面值;30.23L:十进制long double型字面值;30.23F:十进制float型字面值;10.\?:?\’:’\”:”\\:\\233:表示八进制int型整数233\x2f:表示十六进制int型整数 2f。
算法与数据结构C语言习题参考答案1-5章

置*/ palist->element[q] = palist->element[q+1]; palist->n = palist->n - 1; /* 元素个数减 1 */ return 1 ; } return 0; } 3. 设有一线性表 e = (e0, e1 , e2 , …, e n-1 ),其逆线性 表定义为 e'= (e n-1 , …, e2 , e1 ,e0)。 请设计一个算法,将用顺序表表示的线性表置逆,要求逆线性表 仍占用原线性表的 空间。 【答】 数据结构 采用 2.1.2 节中顺序表的定义。 思路 考虑对数组 element[ ]进行置逆,即把第一个元素和最后一个 元素换位置,把第二个元素和倒数第二个元素换位置……。 注意 这种调换的工作只需对数组的前一半元素进行,所以设置整数变 量 count 用于存放数组长度的一半的值。大家可以考虑一下:为 什么不能对整个数组进行如上的对元素“换位置”的工作?(提
PNode p1; if(llist==NULL) return 0; p1=llist; while(p1!=NULL&&p1->link!=p)p1=p1->link; /*寻找 p 所指结 点的前驱结点*/ if(p1=NULL) return 0; PNode q=(PNode)malloc(sizeof(struct Node));/*申请新结点 */ if(q=NULL) {printf(“Out of space!!!\n”);return 0;} q->info=x; q->link=p1->link; p1->link=q; return 1; } 7.写一算法,在带头结点的单链表 llist 中,删除 p 所指的结点, 并返回删除成功与否的标 志。 【答】 数据结构 采用 2.1.3 节中单链表定义。 思想: 由于在单链表中,只有指向后继结点的指针,所以只有首先找到
05第五章 人工免疫算法

第五章人工免疫算法习题与答案1. 填空题(1)人工免疫算法的缩写是,它是对的一种模拟。
判别优劣的适应度函数这里称为。
(2)利用生物免疫系统的某一方面原理就可以设计新算法,因此人工免疫算法是多个算法的统称,其中最具代表性的算法有、和。
解释:本题考查人工免疫算法的基础知识。
具体内容请参考课堂视频“第5章人工免疫算法”及其课件。
答案:(1)AIA,生物免疫机理,亲和度(2)否定选择算法、免疫规划算法、克隆选择算法2.给出人工免疫算法的定义,并指出其特征。
解释:本题考查人工免疫算法的定义和特点。
具体内容请参考课堂视频“第5章人工免疫算法”及其课件。
答案:人工免疫算法是基于免疫学理论和生物免疫系统机制而提出的计算智能算法,是对生物免疫机理的一种模拟,并受到遗传算法的启发,因此免疫算法与遗传算法有许多相似之处。
AIS算法具有以下特征:(1)具有全局搜索能力。
(2)具有多样性保持机制。
(3)鲁棒性强。
(4)具有并行分布式搜索机制。
3.关于人工免疫算法,下面说法错误的是()。
A)人工免疫算法是一种全局搜索优化方法。
B)抗原对应着优化问题的可行解。
C)免疫操作可以用于产生新的解。
D)优化问题的寻优过程实际上是免疫系统识别抗原并实现抗体进化的过程。
解释:本题考查人工免疫算法的特点。
具体内容请参考课堂视频“第5章人工免疫算法”及其课件。
答案:B(1)生物免疫系统运用多种免疫调节机制产生多样性抗体以识别、匹配并最终消灭外界抗原,免疫应答中的抗体更新过程是一个全局搜索的进化过程,A 选项正确。
(2)抗原对应着问题,抗体对应着优化问题的可行解,B选项错误。
(3)免疫操作中克隆变异、抗体补充等可以产生新的抗体,对应着新解产生的过程,C选项正确。
(4)优化问题的寻优过程对应着免疫系统识别抗原并实现抗体进化的过程,D选项正确。
4.试写出克隆选择算法的基本流程。
解释:本题考查克隆选择算法CSA的步骤。
具体内容请参考课堂视频“第5章人工免疫算法”及其课件。
第5章课后习题参考答案

第五章习题参考答案3.给定一个单位立方体,一个顶点在(0,0,0),相对的另一个顶点在(1,1,1),过这两个顶点连接一条直线,将单位立方体绕该直线旋转θ角,试导出变换矩阵。
解答:需进行以下复合变换:⑴绕Z轴旋转-45。
角,变换矩阵为:/220 0T1= 2/20 00 1 00 0 1⑵绕Y轴旋转2)角,变换矩阵为:/30 30T2= 0 1 0 030 300 0 0 1⑶绕X轴旋转θ角,变换矩阵为:1 0 0 0T3= 0 cosθs i nθ00 -sinθc o sθ00 0 0 1⑷绕Y轴旋转2)角,变换矩阵为:/30 30T4= 0 1 0 030 300 0 0 1⑸绕Z 轴旋转45。
角,变换矩阵为:/2/20 0 T5= 2/20 0 0 0 1 00 0 0 1 故最后的变换矩阵为: T=T1T2T3T4T5=1/32/3cos θ+ 1/3/3s i n1/3c o s θθ+- 1/3/3s i n 1/3c o s θθ-- 0 1/33sin 1/3cos θθ-- 1/32/3c o s θ+ 1/3/3s i n1/3c o s θθ+- 01/33sin 1/3cos θθ+- 1/3/3s i n1/3c o s θθ-- 1/32/3c o s θ+ 00 0 0 1 6.编程绘制第5题中三棱锥的正等轴测和正二测图。
同上类似,只是变换矩阵改为T 正等=0.70700.40800.70700.4080000.816001-⎡⎤⎢⎥--⎢⎥⎢⎥⎢⎥⎣⎦和T 正二=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡---1000943.0000312.00354.00118.00935.07.编程绘制第5题中三棱锥的斜等测和斜二测投影图。
同上类似,变换矩阵改为:T 斜等=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-1001000707.00707.00001T斜二=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-1001000354.00354.000018.编程绘制第5题中三棱锥的立体一点、二点和三点透视图。
第5章 数据结构与算法 习题与答案

第五章习题(1)复习题1、试述数据和数据结构的概念及其区别。
数据是对客观事物的符号表示,是信息的载体;数据结构则是指互相之间存在着一种或多种关系的数据元素的集合。
(P113)2、列出算法的五个重要特征并对其进行说明。
算法具有以下五个重要的特征:有穷性:一个算法必须保证执行有限步之后结束。
确切性:算法的每一步骤必须有确切的定义。
输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件。
输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。
没有输出的算法没有实际意义。
可行性:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
(P115)3、算法的优劣用什么来衡量?试述如何设计出优秀的算法。
时间复杂度空间复杂度(P117)4、线性和非线性结构各包含哪些种类的数据结构?线性结构和非线性结构各有什么特点?线性结构用于描述一对一的相互关系,即结构中元素之间只有最基本的联系,线性结构的特点是逻辑结构简单。
所谓非线性结构是指,在该结构中至少存在一个数据元素,有两个或两个以上的直接前驱(或直接后继)元素。
树型和图型结构就是其中十分重要的非线性结构,可以用来描述客观世界中广泛存在的层次结构和网状结构的关系。
(P118 P122)5、简述树与二叉树的区别;简述树与图的区别。
树用来描述层次结构,是一对多或多对一的关系;二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。
二叉树是有序的,即若将其左、右子树颠倒,就成为另一棵不同的二叉树。
图也称做网,是一种比树形结构更复杂的非线性结构。
在图中,任意两个节点之间都可能相关,即节点之间的邻接关系可以是任意的,图表示的多对多的关系。
(P121-P124)6、请举出遍历算法在实际中使用的例子。
提示:根据实际生活中需要逐个访问处理的情况举例。
算法设计与分析习题答案1-6章

习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(LeonhardEuler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
图 七桥问题南2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法=m-n2.循环直到r=0m=nn=rr=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
编写程序,求n至少为多大时,n个“1”组成的整数能被2013整除。
#include<iostream>using namespace std;int main(){double value=0;for(int n=1;n<=10000 ;++n){value=value*10+1;if(value%2013==0){cout<<"n至少为:"<<n<<endl;break;}}计算π值的问题能精确求解吗编写程序,求解满足给定精度要求的π值#include <iostream>using namespace std;int main (){double a,b;double arctan(double x);圣经上说:神6天创造天地万有,第7日安歇。
为什么是6天呢任何一个自然数的因数中都有1和它本身,所有小于它本身的因数称为这个数的真因数,如果一个自然数的真因数之和等于它本身,这个自然数称为完美数。
数据结构与算法教程 习题答案 作者 朱明方 吴及 第5章习题解答.docx

第5章习题解答2- 9, 0-6, 4-9, 2-6, 6-4;(1) 请确定图中各个顶点的度; (2) 给出图的连通分量;(3)列出至少有三个顶点的简单路径。
[解答]由题意得到的图如图5-1所示。
[解答]如图5-2所示,分别为1个顶点,2个顶点,3个顶点,4个顶点,5个顶点和6个顶点 的无向完全图。
5. 1 已知一个图有。
到9 一共10个顶点, 图中边为:3-7,1-4, 7-8, 0-5, 5-2, 3-8,(1)顶点:0 12 3 4 顶点的度:213232⑵连通分量1: 连通分量2: (3)连通分量1:连通分量2中:4-6-0, 4-6-2, 6-2-5, 6-2-9, 9-2-6, 0-5-2,如图5-1 (b)所示。
如图5-1 (a)所示。
3- 7-8; 1-4-6, 1-4-9 4- 9-2, 6-0-5, 6-4一9, 9—2-5,共有13条。
5.2向完全图。
请分别画出1个顶点,2个顶点, 3个顶点,4个顶点,5个顶点和6个顶点的无图5-15.3 若无向图G有15条边,有3个度为4的顶点,其余顶点的度不大于3,图G至少有多少个顶点?[解答]设图G至少有x个顶点,根据握手定理有:3 X4 + 3 (x-3) =2X15, x=9(个)5.4 试证明有/个顶点的任何无环连通图均有V -1条边。
[解答]无环连通图即为树。
根据树的性质,有V个顶点的树均有V-1条边。
5.5对于一个有r个顶点和的无向完全图,请问一共有多少个子图?[解答]V 2一共有个子图。
i=05.6对于一个有V个顶点和E条边的无向图,请给出其连通分量个数的上界和下界。
[解答]根据无向图中顶点和边的关系可知,E必然满足0WEWK(片1)/2,由分析可得到:V-E if E<V-1 c = dmin[1 if E>V-1M=V-(l + Jl + 8E)/2 E<V(V-1)/2提示:在不形成环的情况下,连通分量数目达到最小值;当某个连通分量为完全图时, 连通分量数目达到最大值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fenmu=buf[0];
for(i=1;i<N;i++)
{
fenshu_add(1,buf[i],fenzi,fenmu,&fenzi,&fenmu);
if(fenzi==fenmu)
{
sum=0;
{
if(pop()==-1)
{
printf("无效的表达式\n");
break;
}
}
}
if(is_empty())
{
printf("正确的表达式\n");
}
else
printf("无效的表达式\n");
for(k=0;k<=i;k++)
{
//printf("1/%d ",buf[k]);
sum+=buf[k];
}
k=0;
for(k=0;k<=count;k++)
{
if(sum==SUM[k])
{
{
int t;
t=a[t1];
a[t1]=a[t2];
a[t2]=t;
}
int add()
{
int sum=0;
int i=0;
int j;
int k=0;
int h=0;
for(i=0;i<M+1;i++)
for(j=0;j<N;j++)
b[i][j]='Q';
//print_stack();
if(stack!=NULL)
{
top=stack;
stack=stack->next;
temp=top->data;
free(top);
return temp;
}
else
{
int i;
for(i=0;i<M+1;i++)
{
printf("%d",atoi(b[i]));
if(i!=M)
printf("+");
}
printf("=");
}
3.
#include<stdio.h>
#define N 9
int buf[N]={2,3,4,5,6,8,10,12,15};
*fenzi=fenzi1*fenmu2+fenzi2*fenmu1;
}
void try(int t)
{
int j;
if(t>=N)
{
int bool=0;
int sum;
int k;
int i;
int fenzi,fenmu;
for(i=0;i<N;i++)
{
scanf("%c",&buf[i]);
}
a[0]=0;
for(i=1;i<=M;i++)
{
a[i]=1;
}
for(;i<N;i++)
{
a[i]=0;
}
try(1);
void fenshu_add(int fenzi1,int fenmu1,int fenzi2,int fenmu2,int *fenzi,int *fenmu);
void try(int t);
void swap(int t1,int t2);
int SUM[100];
int count=0;
int main()
{
int i;
for(i=0;i<N;i++)
buf[i]=i+1;
try(0);
return 0;
}
void try(int t)
{
int j;
if(t>=N)
{
if(is_right())
output();
}
char buf[N];
int a[N];
char b[M+1][N];
int c[M+1];
int try(int t);
void swap(int t1,int t2);
int add();
void output();
int min=99999;
int main()
{
int i;
bool=1;
break;
}
}
if(k==count+1)
{
SUM[count++]=sum;
for(k=0;k<=i;k++)
printf("1/%d ",buf[k]);
printf("\n");
break;
}
}
if(is_num(buf[i]))
{
if(buf[i+1]=='(')
{
printf("无效的表达式\n");
break;
}
}
if(buf[i]==')')
算法设计与分析(第二版)习题答案(第五章)
主编:吕国英
习题答案
第五章
1.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct s_node
{
char data;
struct s_node *next; }Βιβλιοθήκη i=0; j=0;
h=0;
k=0;
for(j=0;j<N;j++)
{
if(a[j]==1)
{
h=0;
i++;
b[i][h]=buf[j];
//printf("%d ",atoi(b[i]));
//printf("%d %d %c \n",i,h,b[i][h]);
h++;
}
else
{
b[i][h]=buf[j];
//printf("%d %d %c \n",i,h,b[i][h]);
//printf("%d ",atoi(b[i]));
h++;
}
}
/*
for(i=0;i<M+1;i++)
return -1;
}
int is_op(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else
return 0;
}
int is_num(char ch)
{
if(ch<='9'&&ch>='0')
else
for(j=t;j<N;j++)
{
for(j=0;j<N;j++)
printf("%c ",b[i][j]);
printf("\n");
}
*/
for(i=0;i<M+1;i++)
{
sum+=atoi(b[i]);
}
return sum;
}
void output()
}
int main()
{
char buf[100];
printf("输入代数表达式\n");
scanf("%s",buf);
test(buf);
return 0;
}
2.
#include<stdio.h>
#define N 5 //N个数字
#define M 2 //M个加号
break;
}
if(bool==1)
break;
}
}
}
else
{
for(j=t;j<N;j++)
{
swap(t,j);
try(t+1);
swap(t,j);
}
}
}
void swap(int t1,int t2)
{
printf("无效的表达式\n");
break;
}
else
push(buf[i]);
}
if(is_op(buf[i]))
{
if(buf[i+1]==')')
{
printf("无效的表达式\n");