当前位置:文档之家› 严飞_软件技术基础沈被娜习题解答

严飞_软件技术基础沈被娜习题解答

2.1 什么是数据结构?它对算法有什么影响?数据结构是指同一数据对象中各数据元素间存在的关系。

数据结构对算法的影响:算法的实现必须借助程序设计语言中提供的数据类型及其运算。

一个算法的效率往往与数据的表达形式有关,因此数据结构的选择对数据处理的效率起着至关重要的作用。

它是算法和程序设计的基本部分,它对程序的质量影响很大。

2.2何谓算法?它与程序有何区别?广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。

计算机算法是通过计算机能执行的算法语言来表达的。

和程序的区别:一个程序包括两个方面的容:(1)对数据的描述,即数据结构。

(2)对操作的描述,即算法。

所以算法是程序的一个要素。

2.3 何谓频度,时间复杂度,空间复杂度?说明其含义。

频度:在某个算法中某个语句被重复执行的次数就是此语句的频度。

时间复杂度:是用来估算一个算法的执行时间的量,以算法中频度最大的语句来度量。

空间复杂度:指在算法中所需的辅助空间的单元,而不包括问题的原始数据占用的空间。

2.4试编写一个求多项式Pn =anxn +an-1 xn-1+a1x+a0的值Pn(x 0)的算法,要求用乘法次数最少,并说明算法中主要语句的执行次数及整个算法的时间复杂度。

A=(a0, a1……an)mul = 1 //sum=afor i=1 to nmul = mul * x // xsum = A[i]*mul + sum //求和end(i)进行了n次时间复杂度为:2n2.5计算下列各片段程序中X←X+1执行次数(1)for i=1 to nfor j=1 to ifor k=1 to jx←x+1end(k)end(j)end(i)执行次数:n*n*ni←1while i<n dox←x+1i←i+1end(while)执行次数:n-1(3)for i=1 to nj←1for k=j+1 to nx← x+1end(k)end(i)执行次数:n*(n-1)2.6 数据的存储结构主要有哪两种?它们之间的本质区别是什么?数据的存储结构:向量和链表。

本质区别:向量是连续存放的,其存储空间是静态分配的,以存放顺序来表达元素的前后件的关系。

链式存储结果不需要一组连续的存储单元,其数据元素可以分散存放在存储空间中,其元素关系由指针来指向。

2.8已知线性表L(a 1, a 2, … , a n ) 元素按递增有序排列。

用向量作为存储结构,试编写算法:删除表中值在c 与d 之间(c<=d)的元素找到第1个大于等于c的元素,序号为s找到第一个大于d 的元素,序号为tL[s] ← L[t]L[s+1] ← L[t+1]…L[s+m] ← L[t+m] // s+m = t -1 m = t – s - 1L[s + i ] ← L[t + i ] // i = 0 to t-s-1i=1; // i 从1 循环到ns = -1; // 第1个大于等于c 的元素序号t = -1; // 第1个大于d 的元素序号for i = 1 to n step -1if s ==-1 and L[i]>=c // 找到第1个大于等于c 的元素s = iif t == -1 and L[i] >d // 找到第1个大于d 的元素t = i ;end (i)if s != -1 and t !=-1i = swhile i < t and i + t – s <=nL[i] = L [i + t – s ]i++end(while)elsereturn(错误 没有找到 元素在c 和d 之间)end(if)for j=c to n-d+cL[j]<--L[j+d-c]//把j+d-c 项给jEnd(j)N<--n-d+c//所有项数减少Return2.9 线性表A,B中的元素为字符串类型,用向量结构存储,试编写算法,判断B是否为A的子序列(例如A=ENGLISH ,B=LIS ,则B为A的子序列)A[m] B[n]A:B:i=1 检查A中第1个元素开始的字符串是否与B匹配i=2 检查A中第2个元素开始的字符串是否与B匹配……i= m – n + 1 检查 A中第(m-n+1)个元素开始的字符串是否与B匹配A[m]B[n]if ( m<n ) then return errorfor ( i =1; i<= m-n+1; i++)for (j = 1; j<= n ; j++)if (A[i+j-1 ] != B[j ])break;end(j)if j>n then return( A字符串中第i个字符开始的子串与B匹配 ) end(i)renturn (找不到匹配的子串)设A,B两个线性表的元素个数为m,nIf (m<=n)then{return}For i=0 to n-1a=A[i]for j=0 to m-1if(a=B[j])then{b++}end(j)end(i)if(b=m)then{B 为A的子集}return2.11写一个将向量L (a 1 ,a 2, a n )倒置的算法。

对L(a 1,a 2, ... ..., a n )如果是奇数个元素,则1, 15 交换 1, n 交换2,14 交换 2, n-1 交换3,13 交换 3,n-2 交换4,12 交换 4,n-3 交换5,11 交换 5,n-4 交换6,10 交换 6,n-5 交换7,9 交换 7,n-6 交换8,8 交换 8,n-7 交换9,7 交换 9,n-8 交换? 停止如果是偶数个元素,则1,14 交换 1, n 交换2,13 交换 2, n-1 交换3,12 交换 3,n-2 交换4,11 交换 4,n-3 交换5,10 交换 5,n-4 交换6,9 交换 6,n-5 交换7,8 交换 7,n-6 交换8,7 交换? 8,n-7 交换? 停止小结:n 个元素倒置的算法是,i = 1while ( i<n-i+1)a[i] 与 a[n-i+1] 交换i++end(while)a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a130 a14 a15a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a130 a14 a152.12试编写算法求已知单链表长度,并考虑表空的情况。

p = headi = 0While(p!=nil) //表不为空P<-- next(p)//移动到下一个元素i++End(while)Return i //返回数据的个数head2.13试编写算法删除单链表中第k个结点。

GETNODE(q)GETNODE(p)q<-headFor i=1 to k-1q<-next(q)End(i)P<-next(q);next(q)<-next(p)Ret(p)Return2.14 已知一循环链表中数值已按递增有序排列现要插入一个新结点,并使插入一个新节点,并使插入后链表仍为有序序列GETNODE(p)Data(p)=aWhile(data(p)<data(n))n<-next(n)End(while)q <-nnext(p) <--next(q)<-preturn2.18 设在长度大于1 的循环链表中,即无头结点,也无头指正,p为指向链表中每个节点的指针,试编写算法删除该节点的前趋结点。

q<-Next(p)//找到该节点的前趋结点p<-next(q);next(q)<-next(p)RET(p)Return2.20 试用单链表表示两个多项式:A=4X12 +5X8+6X3+4 ,B=3X12+6X7+2X4+5(1)设计此两个多项式的数据结构II 答案参见33页即可2.22 CQ[0:10]为一循环队列,初态 front=rear=1,画出下列操作后队的头,尾指示器状态:(1)d,e,b,g,h入队;rear=6 front=1(2)d,e出队 rear=6 front=3(3)I,j,k,l,m入队 rear=0 front=3(4)b出队 rear=0 front=4(5)n,o,p,q,r入队 rear=5 front=42.25 有一个二维数组A[1:m ;1:n],假设A[3,2]地址为1110,A[2,3]地址为1115,若每个单元占一个空间,问A[1,4]的地址是多少答案:11202.26 用三维数组和带行辅助向量形式表示下列稀疏矩阵:答案:6 3 28I 1 2 3 5 6Pos 1 2 4 1 3Num 3 2 1 1 1(2)参考上面的,和47,48页的容2.28将题图2.3的一般树化为二叉树。

答案:2.29 设一颗完全二叉数有1000个结点,试问:(1)有多少个叶子结点 489(2)有多少个度为2的结点 2(3) 有多少个结点只有非空左子树 12.30 设一颗二叉树其中序和后序遍历为中序:BDCEAFHG后序:DECBHGFA答案:ABCDEFHG2.31.对二叉树写出如下算法:(1)复制一棵二叉树;(2)判断两棵二叉树是否相等;(3)计算二叉树的树叶;(4)计算二叉树的深度;解:1)//复制一棵二叉树/*算法思想采用递规函数来实现(1)如果树为空,则复制一棵空树;(2)如果树不为空,则依次递规复制已知二叉树的左子树和有子树;(3)生成一个新的根结点,使复制得到的左子树和右子树的根指针分别成为这个新生成结点的左指针域和右指针域的值。

算法编写:*/BiTree *CopyTree(BiTree *T){//if(!T) return NULL;if(T->lchild)newlchild=CopyTree(T->lchild);//else newlchild=NULL;//if(T->rchild)newrchild=CopyTree(T->rchild);//else newrchild=NULL;//newnode=GetTreeNode(T->data,newlchild,newrchild); //return newnode;}//CopyTreeBiTNode *GetTreeNode(TelemType item,BiTNode *lptr,BiTNode *rptr){ //T=new BiTNode;T->data=item;T->lchild=lptr;T->rchild=rptr;return T;}//GetTreeNode(2)在这里要对一种情况进行说明当root1的左子树与root2的左子树相同,root1的右子树与root2的右子树相同时,这两颗二叉树相同。

相关主题