收藏 分享(赏)

浙大远程数据结构与算法离线答案-最完整版DOC.docx

上传人:HR专家 文档编号:11865170 上传时间:2021-03-10 格式:DOCX 页数:55 大小:558.86KB
下载 相关 举报
浙大远程数据结构与算法离线答案-最完整版DOC.docx_第1页
第1页 / 共55页
浙大远程数据结构与算法离线答案-最完整版DOC.docx_第2页
第2页 / 共55页
浙大远程数据结构与算法离线答案-最完整版DOC.docx_第3页
第3页 / 共55页
浙大远程数据结构与算法离线答案-最完整版DOC.docx_第4页
第4页 / 共55页
浙大远程数据结构与算法离线答案-最完整版DOC.docx_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、浙江大学远程教育学院数据结构与算法课程离线作业一、填空题:(【序号,章,节】。)【1,1, 2】线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。【2,1, 2】为了最快地存取数据元素,物理结构宜采用序存储结构。3,1,2】数据结构的三要素是逻辑结构,物理结构, 操作。【3,1, 2】存储结构可根据数据元素在机器中的位置是否一定连续分为顺序存储结构 ,链式存储结构 。【4,1, 3】度量算法效率可通过时间复杂度和空间复杂度_来进行。【5,1,3】设 n 为正整数,下面程序段中前置以记号的语句的频度是n(n+1)/2。for (i=0; in;

2、 i+)for (j=0; jn; j+)if (i+j=n-1)aij=0;【6,1, 3】设 n 为正整数,试确定下列各程序段中前置以记号的语句的频度 :(1) i=1; k=0; while (i=n-1)i+; k+=10 * i;/ 语句的频度是 _ n-1 _。(2) k=0;for (i=1; i=n; i+)for (j=i; jnext=null_【10,3,2】在一个 表中p 所指 点 (p 所指不是最后 点 )之后插入一个由指 s 所指 点, 行s-next=_ p-next_;和 p-next=_s_的操作。【11,3,2】在一个 表中 除p 所指 点 , 行以下操作:

3、q= p-next;p-data= p-next-data;p-next=p-next-next_;free(q);【12,3,2】 点的 循 表Head 的判空条件是 _ Head-next=null_;不 点的 循 表的判空条件是_ Head=null_。【13,3,2】已知 L 是 表 点的非空 表 , 且 P 点既然不首元 点 ,也不是尾元 点 , 从下列提供的答案中 合适的 句序列。a. 除 P 点的直接前 点的 句序列是_10 12 8 11 4 14_。b. 除 点 P 的 句序列是 _10 12 7 3 14_。c. 除尾元 点的 句序列是 _9 11 3 14_。(1) P

4、= P-next;(2) P-next = P;2(3) P-next = P-next -next;(4) P = P-next -next;(5) while (P != NULL )P = P-next;(6) while (Q-next != NULL )P = Q; Q = Q-next;(7) while (P-next != Q)P = P-next;(8) while (P-next-next != Q) P = P-next;(9) while (P-next-next != NULL ) P = P-next;(10) Q = P;(11) Q = P-next;(12)

5、P = L;(13) L = L-next;(14) free (Q);【 14, 3, 3】对一个栈,给定输入的顺序是A 、 B、 C,则全部不可能的输出序列有C A B。【15, 3, 3】 .在栈顶指针为HS 的链栈中,判定栈空的条件是head-next=null。【16,3,3】下列程序把十进制数转换为十六进制数,请填写合适的语句成分。void conversion10_16() InitStack(&s); scanf( “ %d” ,&N); while(N)_ Push(s, N%16)_;N = N/16;while(!StackEmpty(s)_ Pop(s, e);if(e

6、=9)printf(“ %d” ,e);else printf(“-%c10+”,eA );/* conversion */【17,3,4】若用一个大小为6 个元素的数组来实现循环队列,且当前rear=0 和 front=3。当从队列中删除一个元素,再加入两个元素后,rear 和 front 的值分别是2和4 。【18,3,4】堆栈和队列都是线性表, 堆栈是 _后进先出 _的线性表 , 而队列是 _3先进先出 _的线性表。【19,3,4】若用一个大小为 6 个元素的数组来实现循环队列,且当前 rear=0 和 front=3 。 当从 队列 中删 除一 个 元素 ,再 加入 两个 元素 后,

7、rear 和 front 的 值分 别是2 和4。【20,4,2】已知一棵树边的集合是 ,。那么根结点是e,结点b 的双亲是d,结点a 的子孙有bcdj,树的深度是4,树的度是3,结点 g 在树的第3层。【21,4, 3】从概念上讲,树与二叉树是二种不同的数据结构,将树转化为二叉树的基本的目的是树可采用二叉树的存储结构并利用二叉树的已有算法解决树的有关问题【22, 4, 3】满三叉树的第i 层的结点个数为i-1,深度为 h 时该树中共有h33 -1结点。【23,4,3】已知一棵完全二叉树有 56 个叶子结点,从上到下、从左到右对它的结点进行编号,根结点为 1 号。则该完全二叉树总共结点有 _1

8、11_个;有 _7_层;第 91 号结点的双亲结点是 _45_号;第 63 号结点的左孩子结点是 _号。【24,4,3】下列表示的图中,共有 _5 _个是树;有_3 _个是二叉树;有_2 _个是完全二叉树。4【25,4, 4】n 个结点的二叉排序树的最大深度是n,最小深度为log2 ?+1_【26,4,3】如果某二叉树的后序遍历序列是ABCDEFGHI ,中序遍历序列是 ACBIDFEHG,则其先序遍历序列的第一个字母是I,最后一个字母是G。【 27,4,3】下列二叉树的中序遍历序列是_ DBNGOAEC_;后序遍历序列是 _ DNOGBECA_。5【28,5,4】 HASH 表的大小 n (

9、n=10), HASH 函数 h(x)=x % 7,如果二次探 再散列方法 Hi=(H(key)+di) mod 10 (di = 12 2 2 解决冲突,在HASH表中依次插入关,2 ,3 ,) 字 1,14,55,20,84,27 以后,关 字1 、 20和27 所在地址的下 分 是、_ 和。插入上述 6 个元素的平均比 次数是。答案: 1 、7 、5 、2【29,6,3】 无 G 的 接矩 A ,若( vi,vj )属于 G 的 集合, 元素Aij 等于1, 22、 无向 G 的 接矩 A ,若 Aij 等于 0, Aji 等于0 。【30, 6, 3】若一个 用 接矩 表示, 除从第i

10、 个 点出 的所有 的方法是矩 第 i 行全部置 零。【31,6,2】 一个 G=V ,A,V=a,b,c,d,e,f,A=,。那么 点 e 的入度是2;出度是1;通 点 f 的 回路有2条;就 通性而言, 是 通 ;它的 通分量有1个;其生成 可能的最大深度是5。【32,7,1】排序 程一般需 两个基本操作,它 是比 和移 。【33,7, 2】在 一 关 字是(54,38,96,45,15,72,60,23,83)的 行直接插入排序 ,当把第七个 (关 字是60)插入到有序表 , 找插入位置需比 3次6分别与 54 、72 、96 比较【34,7, 4】插入排序、希尔排序、选择排序、快速排序

11、、堆排序、归并排序、和基数排序方法中,不稳定的排序方法有选择排序、快速排序、堆排序、希尔排序7二、综合题(选自教材数据结构各章习题,采用word 文件格式上传)【 1,1,3】试分析下面一段代码的时间复杂度:if ( A B ) for ( i=0; ii; j- )A += B;else for ( i=0; ii; j- )A += B;if 中的时间复杂度为: O(n*n 2) 即 O(n 3)else 中的时间复杂度为: O(n*n) 即 O(n 2)【 2,1,3】测试例 1.3 中秦九韶算法与直接法的效率差别。令 f ( x) 1100/ i ,计xii 1算 f (1.1) 的值

12、。利用 clock()函数得到两种算法在同一机器上的运行时间。答:从运行结果可以看出秦九昭算法效率上有很大优势;#include#include#includeclock_t start,stop;double duration;#defineMAXN 10#defineMAXK 1e7double f1( intn , double a,double x);double f2( intn , double a,double x);/ 秦九昭算法double f1( intn , double a,double x)8inti =0 ;double p = a0;for (i=n;i0;i-)

13、p = ai-1 + x * p;returnp;/ 直接算法double f2( intn , double a,double x)inti =0 ;double p = a0;for (i=n;i0;i-)p += ai*pow(x,i);returnp;intmain()inti ;double aMAXN ;for (i=0;iMAXN;i+)ai=(double )i;start = clock();for (i=0;iMAXK;i+)f2(MAXN-1,a,1.1);stop = clock();duration = (double )(stop-start)/CLK_TCK/MA

14、XK ;printf( 直接算法: );printf(ticks = %fn,( double )(stop-start);9printf(duration = %6.2en,duration);for (i=0;iMAXN;i+)ai=(double )i;start = clock();for (i=0;iMAXK;i+)f1(MAXN-1,a,1.1);stop = clock();printf( 秦九昭算法: );printf(ticks = %fn,(double )(stop-start);printf(duration = %6.2en,duration);return0;【 3

15、,1,3】 试分析最大子列和算法1.3的空间复杂度。答:在 1.4中存在 4 种解决最大子列的算法,具体空间复杂度如下:1 、穷举法:算法并没有开辟另外的存储空间进行存储,利用的是累加所以空间复杂度为 O(2);2 、部分穷举:同上3 、分而治之:利用递归解决问题,故空间复杂度为O(N);4 、在线处理:为O(2);【 4,1,3】试给出判断 N 是否为质数的 O(N ) 的算法。答案:#include#include10intis_prime(intn)inti = 0;if (n!= 2 & n % 2 = 0)return0;for (i=3;i=sqrt(double )n);i+=2

16、)if (n % i = 0)return0;return1;void main()intnum = 0 ,result =0 ;printf(Input the num:);scanf(%d, &num);result = is_prime(num);if (result)printf(%d is a primen, num);elseprintf(%d is not a primen, num);Input the num: 55 is a prime.【 5,2,2】 写程序, 入整数 n 和 a , 出 S=a+aa+aaa+ aaa(n 个 a) 的 果。答案:11#includes

17、tdio.hint main()int a,b,n,i,s=0;scanf(%d %d,&a,&n);b=a;for(i=1;i=n;i+)s+=a;a=a*10+b;printf(%dn,s);【 6,2,3】请编写递归函数,输出123.n的全排列( n 小于 10 ) , 并观察 n 逐步增大时程序的运行时间。答案:#include#includevoid pailie(int * data,intn,intcurr)inti = 0 ;if(curr=n-1)for (i = 0; i n; +i )printf(%d, datai);printf(n );else12for (i =

18、curr; i n; +i)intt;t = datacurr, datacurr = datai, datai = t;pailie(data, n, curr+1);t = datacurr, datacurr = datai, datai = t;intmain()clock_t end;clock_t start = clock();intn = 0;inti = 0;intas10 = 0,0,0,0,0,0,0,0,0,0;/n 小于等于 10scanf(%d, &n);for (i = 0; i n; +i)asi = i+1;pailie(as, n, 0);end = clo

19、ck();printf(The time was: %dn, (end - start) / CLK_TCK);return0;13N 为 714N 为 9分析来看时间上虽然有比较大的增长,但主要用于打印;但在时间复杂度上是随着n 的变大呈直线上升趋势;【 7,3,2】 给定一个顺序存储的线性表L = (a1 ,a2 ,an ) ,请设计一个算法15删除所有值大于min 而且小于 max 的元素。SeqList Delete(SeqList &L,intmin,intmax)inti;=0,j=0for (i=0; imin & L.elemimax)for (j=i;jL.length;j+

20、)L.elemj=L.elemj+1;-L.length;returnL ;【 8,3,2】给定一个顺序存储的线性表L = ( a1 ,a2 ,an ) ,请设计一个算法查找该线性表中最长递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为 (3,4,6,8)。void main()intn, i, j, k;intA1024=;intdp1024=;scanf(%d, &n);for (i=1; i=n; i+)scanf(%d, Ai);dp1 = 1;/ 有n个阶段for (i=2; i=0; j-)if(AiAj)dpi = max(dpi, dpj+1);

21、intmaximum = dp1;for (i=2; i=n; i+)maximum = max(maximum, dpi);printf(%d maximum is : n, maximum);【 9,3,3】 如果有 1 、2 、 3、 4、 5 按顺序入栈,不同的堆栈操作(pop, push)顺序可得到不同的堆栈输出序列。请问共有多少种不同的输出序列?为什么?答案:按照正常情况, 1,2,3,4,5的全排列组合共有5! = 120,即 120 种,但由于像: 12435 、 12534 之类的无法按顺序出入栈,故按照顺序入栈的情况共有56 种:以 1 开始排列组合为 14 种17以 2

22、开始排列组合为 14 种以 3 开始的排列组合为 9 种以 4 开始的排列组合为 4 种以 5 开始的排列组合为 1 种【 10,3,2】请编写程序将中缀表达式转换为后缀表达式。答案:使用栈的循序存储结构实现、栈的顺序存储结构,用一维数组实现#include#include#defineOK 1#defineERROR -1#defineTRUE 1#defineFALSE 018#defineMAXSIZE 10typedefintStatus;typedefchar ElemType;typedefstructElemType dataMAXSIZE;inttop;/ 栈顶指针Stack;

23、/1.初始化Status InitStack(Stack *S)inti;for (i=0;idatai=NULL;S-top=-1;returnOK;/2.创建一个长度为 n的堆栈Status CreateStack(Stack *S,intn)inti =0;if (nMAXSIZE | n1)printf( 输入长度有误! n );returnERROR;for (i=0;idatai=rand()%100+1;S-top=n-1;returnOK;Status push(Stack *S,ElemType e)if (MAXSIZE-1=S-top)printf( 栈已满 n );re

24、turnERROR;/ 栈顶指向的元素有值+(S-top);19S-dataS-top=e;returnOK;/4.出栈Status pop(Stack *S,ElemType *e)/ 将栈顶元素出栈,传给 e if (-1=S-top)printf( 栈为空! n );returnERROR;*e=S-dataS-top;-(S-top);returnOK;/5.中缀表达式转后缀表达式void MidToFinal(char *mid, char *final)/ 中缀表达式为 middle ,要转换成后缀表达式传给 last/ 新建一个栈,来存储符号char e;Stack S;if (

25、OK!=InitStack(&S)printf( 初始化栈失败! n );/ 当带转换的字符串 *mid 未终止时,循环处理while (*mid)/ 如果是数字,则直接输出if (*mid= 0& *mid= 9 )*(final+)=*(mid+);continue ;elseif (*mid= +| *mid=-| *mid=*| *mid=/| *mid=(| *mid=)/ 输入的是合法运算符号, 比较之前是否有更高优先级的符号if (S.top=-1 |(=*mid)/ 当符号栈为空或遇到左括号时,符号入栈push(&S,*(mid+);continue ;20if ( )=*mi

26、d)/ 遇到右括号时,栈顶元素依次出栈;直到遇到第一个左括号时结束pop(&S,&e);*(final+)=e;while (pop(&S,&e) & e!=()*(final+)=e;/ printf(%cn,e);mid+;continue ;/ 后续的处理都要取出临时的栈顶元素, 与当前输入的符号 *mid 相比较;当临时栈顶元素优先级大于等于输入符号的优先级时,出栈;否则符号入栈(已经弹出一个,记得把弹出的元素也入栈)pop(&S,&e);if ( + =*mid |-=*mid)if (e= ()push(&S,();push(&S,*(mid+);continue ;else *(

27、final+)=e; push(&S,*(mid+);continue ;elseif ( *=*mid |/=*mid)if ( *=e |/=e)*(final+)=e;push(&S,*(mid+);continue ;else push(&S,e); push(&S,*(mid+);continue ;else printf( 输入的字符不合法!%cn,*mid);return ;21/ 当待转换的字符已经结束时,符号栈至少还有一个元素(中缀表达式的特点:数字结尾;后缀表达式以符号结尾);将栈中的元素依次出栈while (S.top!=-1)pop(&S,&e);*(final+)=e

28、;/ 字符串的结束符!*final=0;intmain()char data=3+(5*6-7/1*7)*9;char final= ;MidToFinal(data,final);printf(%sn ,final);return0;【 11,4,3】设二叉树的存储结构如下:12345678910Lchild00237580101dataJHFDBACEGIRchild0009400000其中根结点的指针值为6,Lchild,Rchild 分别为结点的左、右孩子指针域,data 为数据域。( 1) 画出二叉树的逻辑结构。( 2) 写出该树的前序、中序和后序遍历的序列。答:22前序遍历: ECBHFDJIGA中序遍历: ABCEDFHGIJ后序遍历: ECHFJIGDBA【12,4,4】可以生成如下二叉排序树的关键字的初始排列有几种?请写出其中的任意 5 个。23解: 30 种。任写 5 个序列如下:(5,4, 7, 6, 2, 3, 1);(5,7, 4, 6, 2, 3, 1);(5,4, 7, 2, 3, 1, 6);(5,7, 6, 4, 2, 3, 1);(5,7, 6, 4, 2, 1, 3)【1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 计算机原理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报