




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、(0012)数据结构复习思考题答案1:论述题 1、算法的时间复杂度仅与问题的规模相关吗?2、下列程序段带标号语句的频度和时间复杂度。( 1 ) I=0; while (I<N)&&(AI!=K) I+; /语句3 return(I);( 2 ) n为不小于1的整数(设k的初值等于1)void pp ( int k) if (k=n) /语句1
2、 for (I=0; I语句2 printf(aI); /语句3 else for (I=k-1;I语句4 aI=aI+I; /语句5 pp(k+1); /语句6 &
3、#160; /pp3、常用的存储表示方法有哪几种? 参考答案: 1、不,事实上,算法的时间复杂度不仅与问题的规模相关,还与输入实例中的元素取值等相关,但在最坏的情况下,其时间复杂度就是只与求解问题的规模相关的。我们在讨论时间复杂度时,一般就是以最坏情况下的时间复杂度为准的。2、(1)这个算法完成在一维数组an中查找给定值k的功能。语句三的频度不仅与问题的规模n有关,还与输入实例中a的各元素取值以及k的取值相关,即与输入实例的初始状态复杂有关。若a中没有与k相等的元素,则语句三的频度为n;若a中的第一个元
4、素a0等于k,则语句三的频度是常数0。在这种情况下,可用最坏情况下的时间复杂度作为时间复杂度。在此例中即为O(n)。这样做的原因是:最坏情况下的时间复杂度是在任何输入实例上运行时间的上界。有时,也可能选择将算法的平均(或期望)时间复杂度作为讨论目标。所谓的平均时间复杂度是指所有可能的输入实例以等概率出现的情况下算法的期望运行时间与问题规模的数量级的关系。此例中,以k出现在任何位置的概率相同,都为1/n,则语句三的执行频度为0+1+2+(n-1)/n=(n-1)/2。它决定了此程序段的平均时间复杂度的数量级为f(n)=n,记作O(n)。 (2)在计算包含调用语句的算法的语句频度时,需考虑到调用发
5、生时在被调用算法中各语句的执行情况。本题所示的递归调用较之非递归调用的分析更为复杂。由于k等于n是算法的出口条件,不妨首先分析算法pp(n)的简单情况,这时各语句的执行频度分别为:1,n+1,n,0,0,0; 而当k=n-1,n-2,1时,语句的执行情况和调度情况,如下表所示。 K 值不考虑调用时各语句的执行频度调用情况语句1语句2语句3语句4语句5语句6n1n+1n000/n-1100321pp(n)n-2100431pp(n-1)1100n+1n1pp(2)对于k=1即pp(1)而言,各语句的执行次数还须将调用pp(2)时的执行次数累计到内,pp(2)各语句的执行次数又须将调用pp(3)时
6、执行次数累计到内,由此可的语句频度如下:语句:1+1+1=n语句:0+0+0+(n+1)=n+1语句:0+0+0+n=n语句:(n+1)+n+3=(n-1)(n+4)/2语句:n+(n-1)+2=(n-1)(n+2)/2语句:1+1+.+1+0=n-1算法的时间复杂度可以基于频度最大的语句,应为O(n2)。4、常用的存储表示方法有四种:顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储
7、表示称为链式存储结构。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。 1:论述题 1、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?2、为什么在单循环链表中设置尾指针比设置头指针更好?3、确定下列算法中输出语句的执行次数,并给出算法的时间复杂度。(1) void combi (int n) int I,j,k; for ( I=1; I<=n; I+)
8、60;for ( j=I+1; j<=n; j+) for ( k=j+1; k<=n; k+) cout<<I,J,K;< st1:citation>(2) void binary ( int n) while(n) cout<<N;
9、 n=n/2; 4、常用的存储表示方法有哪几种? 5.分析以下程序段的时间复杂度。 a=0;b=1;for(i=2;i=n;i+)s=a+b;b=a;a=S;6.对于一个栈,给出输入项A,B,C。如果输入项序列由A,B,C组成,试给出全部可能的输出序列 7、已知一个顺序表中的元素按元素值非递减有序排列,编写一个函数删除表中多余的值相同的元素。 参考答案: 1、答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储
10、结构,通常有以下几方面的考虑:1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。2、答:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,
11、其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和 rear, 查找时间都是O(1)。 若用头指针来表示该链表,则查找终端结点的时间为O(n)。3、(1)I取值范围从1n,j取值范围从I+1n,k取值范围从j+1n,情况如下表所示: I值j值k值输出语句的执行次数123, 4, ,nn-2n-1n1n/234,5,nn-3n-1n1n/n-2n-1n1n/n-1n/n/所以,输出语句共执行次数为(n-2)+(n-3)+1)+(n-3)+(n-4)+1)+1= (n-1)(n-2)/2+(n-2)(n-3)/2+1= (n-1)2+(n-2)2+
12、(n-3)2+12)-(n-1)+(n-2)+(n-3)+.+1)/2=(n-1)n(2n-1)/6-n(n-1)/2)/2=(n(n-1)(2n-4)/12=n(n-1)(n-2)/6(2) ceil(log2n); 4、常用的存储表示方法有四种:顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的
13、地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。1:论述题 1、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m和n。试写一算法将这两个链表连接在一起,请分析你的算法的时间复杂度。 2、假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点指针,试编写算法在链表中删除指针s所指结点的前驱结点。 3、指出以下算法中的错误和低效之处,并把它改写为一个既正确又高效的算法。Status DeleteK( SqList &a,int I, int k) /本过程从顺序存储结构的线性表a中删除第I个元素起的k个
14、元素。if (I<1| k<0| I+k > a.length) return ERROR;else for (count=1;count删除一个元素for (j=a.Length; j >=I+1;j-) a.elemj-1 = a.elemj;a.length-;rreturn OK;/DeleteK4、假设稀疏矩阵A采用三元组表示,编写一个函数计算其转置矩阵B,要求B也采用三元组表示5、设二维数组A5*6的每个元素占4个字节,已知Loc(a00)=1000,A共占多少个字节?A的终端结点a45的起始地址为多少?按行和按列优先存储时,a25的起始地址分别为多少?6、
15、编写下列算法(假定下面所用的串均采用顺序存储方式,参数ch、ch1和ch2均为字符型): · 将串r中所有其值为ch1的字符换成ch2的字符。 · 将串r中所有字符按照相反的次序仍存放在r中。 · 从串r中删除其值等于ch的所有字符。 · 从串r1中第index个字符起求出首次与字符r2相同的子串的起始位置。 · 从串r中删除所有与串r3相同的子串(允许调用第(4)小题的函数和第(3)小题的删除子串的函数)。 参考答案: 1、参考答案LinkList Link( LinkList L1 , LinkList L2 )/将
16、两个单链表连接在一起ListNode *p , *q ;p=L1;q=L2;while ( p->next ) p=p->next; /查找终端结点p->next = q->next ; /将L2的开始结点链接在L1之后return L1 ; 本算法的主要操作时间花费在查找L1的终端结点上,与L2的长度无关,所以本算的法时间复杂度为: m+1=O(m)2、参考答案void Delprior ( Link s)p = q = s; while (p->next!=s) q = p;p = p->next;q->next = s;delete ( p);3
17、、参考答案更正:for (j = I+k; j <=a.Length; j+) a.elemj-k = a.elemj; a.Length = a.Length ? k;1:论述题 1、假设在二叉链表中增加两个域:双亲域(parent)以指示其双亲结点;标志域(mark取值0.2)以区分在遍历过程中到达该结点时应继续向左或向右或访问该结点。试以此存储结构编写不用栈进行后序遍历的递推形式的算法。2、设有三对角矩阵 An*n,将其三条对角线上的元素逐行地存储到向量B03n-3中,使得Bk=aij,求: (1)用I , j 表示k的下标变换公式。 (2)用 k 表示 I,j 的下标变换公式。3
18、、 写一算法void StrReplace(char *T, char *P, char *S),将T中首次出现的子串P替换为串S。注意:S和P的长度不一定相等。可以使用已有的串操作。4、 设两个栈共享空间v0.m-1,两栈的栈底分别设在向量的两端,且每个元素占一个分量。试设计这两个栈的插入和删除算法。5、若以1234作为双端队列的输入序列,试分别求出满足以下条件的输出序列:(1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列;(2)能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列;(3)既不能由输入受限的双端队列得到,也不能由输出受限的双端
19、队列得到的输出序列6、已知单链表L是一个递增有序表,试写一高效算法,删除表中值大于min 且小于max的结点(若表中有这样的结点),同时释放被删结点的空间,这里min 和 max是两个给定的参数。请分析你的算法的时间复杂度。7、简述以下算法的功能。(1) void Demo1(SeqStack *S)int I; arr64 ; n=0 ;while ( StackEmpty(S) arrn+=Pop(S);for (I=0, I< n; I+) Push(S, arrI); /Demo1(2) SeqStack S1, S2, tmp;DataType x;/假设栈tmp和S2已做过初
20、始化while ( ! StackEmpty (&S1)x=Pop(&S1) ;Push(&tmp,x);while ( ! StackEmpty (&tmp) ) x=Pop( &tmp);Push( &S1,x);Push( &S2, x);(3) void Demo2( SeqStack *S, int m) / 设DataType 为int 型SeqStack T; int I;InitStack (&T);while (! StackEmpty( S)if( I=Pop(S) !=m) Push( &T,I);w
21、hile (! StackEmpty( &T) I=Pop(&T); Push(S,I); (4)void Demo3( CirQueue *Q) / 设DataType 为int 型int x; SeqStack S;InitStack( &S);while (! QueueEmpty( Q )x=DeQueue( Q); Push( &S,x);while (! StackEmpty( &s) x=Pop(&S); EnQueue( Q,x );/ Demo3(5) CirQueue Q1, Q2; / 设DataType 为int 型int
22、 x, I , m = 0; / 设Q1已有内容, Q2已初始化过while ( ! QueueEmpty( &Q1) ) x=DeQueue( &Q1 ) ; EnQueue(&Q2, x); m+;for (I=0; I< n; I+) x=DeQueue(&Q2) ;EnQueue( &Q1, x) ; EnQueue( &Q2, x);二、填空题1、在有n个叶子结点的哈夫曼树中,其结点总数为 。2、将下三角矩阵A18,18的下三角部分逐行地存储到起始地址为1000的内存单元中,已知每个元素占4个单元,则A7,5的地址为 。 3、高度
23、为5的三阶B-树至少有 个结点。4、具有100个结点的完全二叉树的深度为 。 5、在插入和选择排序中,若初始数据基本正序,则选用_;若初始数据基本反序,则选用_。 参考答案: 1、void PostOrder( Bitree root) /设二叉树的结点含有四个域:/mark , parent , lchild , rchild。p=root;while(p)swith(p->mark)case 0: p->mark=1;if (p->lchild) p->lchild;break;case 1: p->mark=2;if(p->rch
24、ild) p->rchild;break;case 2: p->mark=0;visit(*p);p=p->parent;break;default:;/PostOrder 2、(1) 解: 要求I,j 到k 的下标变换公式,就是要知道在k之前已有几个非零元素,这些非零元素的个数就是k的值,一个元素所在行为I,所在列为j,则在其前面已有的非零元素个数为: (I*3-1)+j-(I+1) 其中 (I*3-1)是这个元素前面所有行的非零元素个数,j-(I+1)是它所在列前面的非零元素个数化简可得: k=2i+j; / c下标是从0开始的。 (2) 解: 因为K和I,j是一一对应的
25、关系,因此这也不难算出: I=(k+1)/3 /k+1表示当前元素前有几个非零元素,被3整除就得到行号j=(k+1)%3+(k+1)/3-1 /k+1除以3的余数就是表示当前行中第几个非零元素,加上前面的0元素所点列数就是当前列号3、 void StrReplace (char *T, char *P, char *S)/串替换int I , m;m=strlen (P);/取得子串长度I=StrMatch(T,P);/取得串匹配位置StrDelete( T,I,m);/删除匹配处子串StrInsert( T, S,I);/将S串插入到匹配位置处4、答案:设用变量I表示栈的编号。类型定义:ty
26、pedef struct ElemType vm; /栈空间向量int top2; /栈顶指针向量DuStack;栈空条件:s0栈:s->top0 = -1s1栈:s->top1 = m栈满条件:s->top0+1=s->top1(此时向量空间全占满)。(1)插入void push(DuStack * s, ElemType x, int I) /当两个栈共享空间时,再由I指定的栈中插入新元素x if (s->top0+1=s->top1) printf("OVERFLOW”); return;switch(I) case 0: s->top
27、0+;s->vs->top0=x;break;case 1: s->top1-;s->vs->top1=x;break; (2) 删除ElemType pop( DuStack *s, int I) /当两栈共享空间时,在由I指定的栈中删除栈顶元素,并返回该元素 switch (I) case 0 : if (s->top0=-1) printf("UNDERFLOW”); return; x=s->vs->top0;s->top0-;break;case 1: if (s->top1=m) printf("UND
28、ERFLOW”); return; x=s->vs->top1;s->top1+;break;return (x); 5、答:(1)4132;(2)4213;(3)4231。6、要解这样的问题,我们首先想到的是拿链表中的元素一个个地与max和min比较,然后删除这个结点,其实因为已知其是有序链表,所以我们只要找到大于min的结点的直接前趋结点,再找到小于max的结点,然后一并把中间的全部摘掉就可以了。 算法如下:void DeleteList ( LinkList L, DataType min , DataType max )ListNode *p , *q ,*r;p=L
29、->next;while( p && p->data <=min ) /找比min大的前一个元素位置q=p;p=p->next; while( p && p->data < max ) /找比max小的最后一个元素位置r=p;p=p->next;free?;/释放这个结点空间 q->next=p; /把断点链上 7、答案:(1)程序段的功能是将一栈中的元素按反序重新排列,也就是原来在栈顶的元素放到栈底,栈底的元素放到栈顶。此栈中元素个数限制在64个以内。(2)程序段的功能是利用tmp栈将一个非空栈的所有元素按原样复
30、制到一个空栈当中去。(3)程序段的功能是将一个非空栈中值等于m的元素全部删去。(4)程序段的功能是将一个循环队列反向排列,原来的队头变成队尾,原来的队尾变成队头。(5)这段程序的功能是将队列1的所有元素复制到队列2中去,但其执行过程是先把队列1的元素全部出队,进入队列2,然后再把队列2的元素复制到队列1中。二、填空题a) 2n-1b) 1208c)
31、; 31d) 7e) 插入排序选择排序1:单选题下列排序算法中,( )算法可能会出现下面情况:初始数据有序时,花费的时间反而最多。 A:堆排序B:冒泡排序C:快速排序D:SHELL排序参考答案:C2:论述题 1、采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。2、编写算法完成下列操作:无重复地输出以孩子兄弟链表存储的树T中所有的边。
32、输出形式为(k1,k2)(ki,kj),其中ki,kj树结点中结点的标识。(提示:修改二叉树遍历的递归算法,使其参数表增加参数father,指向被访问的当前结点的双亲结点。)3、一个深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1开始对全部结点编号,问: (1)各层的结点数目是多少? (2)编号为I的结点的双亲结点(若存在)的编号是多少? (3)编号为I的结点的第j个孩子结点(若存在)的编号是多少? (4)编号为I的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?4、设哈希函数为 H(K)= K mod 7,哈
33、希表的地址空间为 0, 6,开始时哈希表为空,用线性探测法解决冲突,请画出依次插入键值23,14,9,6,30,12,18后的哈希表。二、填空题1、 二叉排序树上,结点的平衡因子定义为该结点_子树的高度减去该结点_子树的高度。2、请列举四种处理哈希冲突的方法: 、 、 、 。3、一个无向图完全图中,共有 条边。4、对如何一颗二叉树,如果其终端结点数为n0,度为2的结点数为n2,则它们之间的关系应为: 。5、下列排序算法中,稳定的排序算法是 (选择排序,堆排序,快速排序,直接插入排序) 参考答案: 1、Boolean visitedMAX;Boolean fin
34、dpath (ALGraph G, int k,int a, int b)for ( I=0; IvisitedI=FALSE;return DFSsearch ( G, k, a, b)Boolean DFSsearch ( ALGraph G, int k, int a, int b)visiteda=TRUE;for (w=FirstAdjVex(G,a); w; w=NextAdjVex(G,a,w) if (!visitedw)if (k=1)&&(w=b) return 1;else if (k=1) continue;else if (w=b) continue;
35、else if ( DFSsearch ( G,k-1,w,b) return 1;visiteda=FALSE; return 0; 2、status outTedge(CSNode* root, CSNode* father ) if ( root) printf(',father->mark, ,',root->mark, )' );if ( outTedge ( root->lchild , root)if( outTedge ( root->rchild , father)return OK;return ERROR;else retu
36、rn OK;3、 答:(1) 设层号为l的结点数目为m=k(l-1) (2) 编号为I的结点的双亲结点的编号是:|_(I+k-2)/k_|(不大于(I+k-2)/k的最大整数。也就是(I+k-2)与k整除的结果.以下/表示整除。 (3) 编号为I的结点的第j个孩子结点编号是:k*(I-1)+1+j; (4) 编号为I的结点有右兄弟的条件是(I+1)/k=(I+2)/k (整除) 并且I!=1 右兄弟的编号是I+1.4、0123456141823930126二、填空题1 左右2
37、 开放定址法再哈希法链地址法建立一个公共溢出区3 1/(2*n*(n-1))4 n0=n2+15、选择排序 直接插入排序1:论述题 1、以单链表作为存储结构实现直接插入排序算法。2、以关键字序列(265,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下排序算法的各趟排序结束时,关键字序列的状态。 (1) 直接插入排序 (2)希尔排序 (3)冒泡排序 (4)快速排序 (5)
38、 直接选择排序 (6) 堆排序 (7) 归并排序 (8)基数排序 上述方法中,哪些是稳定的排序?哪些是非稳定的排序?对不稳定的排序试举出一个不稳定的实例。3、画出对长度为18的有序的顺序表进行二分查找的判定树,并指出在等概率时查找成功的平均查找长度,以及查找失败时所需的最多的关键字比较次数4、某校学生学号由8位十进制数字组成:c1c2c3c4c5c6c7c8。C1c2为入学时年份的后两砬;c3c4为系别:0024分别代表该校的25个系:c5为0或1,0表示本科生,1表示研究生;C6c7c8为对某级某系某类学生的顺序编号,对于本科生,它不超过199,对于研究生,它不超过049,共有4个年级,四年
39、级学生1996年入学。(1)当在校生人数达极限情况时,将他们的学号散列到024999的地址空间,问装载因子是多少?(2)求一个无冲突的哈希函数H1,它将在校生学号散列到024999的地址空间其簇聚性如何?(3)设在校生总数为15000人,散列地址空间为019999,你是否能找到一个(2)中要求的H1?若不能,试设计一个哈希函数H2及其解决冲突的方法,使得多数学号可只经一次散列得到(可设各系各年级本科生平均人数为130,研究生平均人数为20)。(4)用算法描述语言表达H2,并写出相应的查找函数。5、 请描述数列(23,19,30,45,19,12)进行升序快速排序的过程。
40、参考答案: 1、答:#define int KeyType /且定义KeyType为int型 typedef struct nodeKeyType key; /关键字域OtherInfoType info; /其它信息域,只是意思意思struct node * next; /链表中指针域RecNode; /记录结点类型 typedef RecNode * RecList ; /单链表用RecList表示 /下面就是排序算法 void InsertSort(RecList R) /链式存储结构的直接插入排序算法/R是带头结点的单链表RecNode *p,*q,*s,*t; /这四个指针用于保存排
41、序时的结点位置s=R->next; /s指向第一个结点t=R; /t指向头结点p=R->next; /前一个记录q=P->next; /下一个记录 while( q ) /当q为空时表示已经访问完毕所有结点,排序结束if(p->key>q->key)/此时前一关键字大于后一关键字,因此要进行插入操作while (s->key<=q->key&&s!=p) /从头向右逐个比较直到p结点t=s; /记下s结点位置s=s->next; /指针向右移/比较结束,找到比q->key大的第一个结点(记录)t->next
42、=q; /摘下q所指结点,插入到相应位置P->next=q->next;q->next=s; q=p->next; /恢复指针顺序S=R->next; t=R;/endif else /此时没有插入操作,指针按序右移p=p->next; q=q->next;/endwhile/InsertSort 2、答:(1)直接插入排序:(方括号表示无序区) 初始态: 265 301 751 129 937 863 742 694 076 438 第一趟:265 301 751 129 937 863 742 694 076 438 第二趟:265 301 751
43、 129 937 863 742 694 076 438 第三趟:129 265 301 751 937 863 742 694 076 438 第四趟:129 265 301 751 937 863 742 694 076 438 第五趟:129 265 301 751 863 937 742 694 076 438 第六趟:129 265 301 742 751 863 937 694 076 438 第七趟:129 265 301 694 742 751 863 937 076 438 第八趟:076 129 265 301 694 742 751 863 937 438 第九趟:076
44、 129 265 301 438 694 742 751 863 937 2:判断题一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。 参考答案:错误3:判断题哈夫曼树一定是满二叉树。 参考答案:错误4:判断题一个无环有向图的拓扑序列必然是唯一的。 参考答案:错误5:判断题有向图用邻接矩阵表示后,顶点i的入度等于邻接矩阵中第i列的元素个数。 参考答案:正确6:判断题二路归并排序的核心操作是将两个有序序列归并为一个有序序列。 参考答案:正确一、判断题8:判断题有向图用邻接矩阵表
45、示后,顶点i的入度等于邻接矩阵中第i列的元素个数。答案:正确9:判断题二路归并排序的核心操作是将两个有序序列归并为一个有序序列。答案:正确10:判断题一个无环有向图的拓扑序列必然是唯一的。 答案:错误 11:判断题哈夫曼树一定是满二叉树。 答案:错误 12:判断题一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。 答案:错误 二、论述题1.常用的存储表示方法有哪几种?答案:常用的存储表示方法有四种:顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的
46、存储表示称为顺序存储结构。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。2.下列程序段带标号语句的频度和时间复杂度。( 1 ) I=0; while (I<n)&&(aI!=k) I+; /语句3
47、60;return(I);( 2 ) n为不小于1的整数(设k的初值等于1)void pp ( int k) if (k=n) /语句1 for (I=0; I<n; I+) /语句2 printf(aI); /语句3 else for (I=k-1;I<n;I+) /语句4
48、160; aI=aI+I; /语句5 pp(k+1); /语句6 /pp答案:(1)这个算法完成在一维数组an中查找给定值k的功能。语句三的频度不仅与问题的规模n有关,还与输入实例中a的各元素取值以及k的取值相关,即与输入实例的初始状态复杂有关。若a中没有与k相等的元素,则语句三的频度为n;若a中的第一个元素a0等于k,则语句三
49、的频度是常数0。在这种情况下,可用最坏情况下的时间复杂度作为时间复杂度。在此例中即为O(n)。这样做的原因是:最坏情况下的时间复杂度是在任何输入实例上运行时间的上界。有时,也可能选择将算法的平均(或期望)时间复杂度作为讨论目标。所谓的平均时间复杂度是指所有可能的输入实例以等概率出现的情况下算法的期望运行时间与问题规模的数量级的关系。此例中,以k出现在任何位置的概率相同,都为1/n,则语句三的执行频度为0+1+2+(n-1)/n=(n-1)/2。它决定了此程序段的平均时间复杂度的数量级为f(n)=n,记作O(n)。 (2)在计算包含调用语句的算法的语句频度时,需考虑到调用发生时在被调用算法中各语
50、句的执行情况。本题所示的递归调用较之非递归调用的分析更为复杂。由于k等于n是算法的出口条件,不妨首先分析算法pp(n)的简单情况,这时各语句的执行频度分别为:1,n+1,n,0,0,0; 而当k=n-1,n-2,1时,语句的执行情况和调度情况,如下表所示。 K 值不考虑调用时各语句的执行频度调用情况语句1语句2语句3语句4语句5语句6n1n+1n000/n-1100321pp(n)n-2100431pp(n-1)1100n+1n1pp(2)对于k=1即pp(1)而言,各语句的执行次数还须将调用pp(2)时的执行次数累计到内,pp(2)各语句的执行次数又须将调用pp(3)时执行次数累计到内,由此
51、可的语句频度如下:语句:1+1+1=n语句:0+0+0+(n+1)=n+1语句:0+0+0+n=n语句:(n+1)+n+3=(n-1)(n+4)/2语句:n+(n-1)+2=(n-1)(n+2)/2语句:1+1+.+1+0=n-1算法的时间复杂度可以基于频度最大的语句,应为O(n2)。3.算法的时间复杂度仅与问题的规模相关吗?答案:不,事实上,算法的时间复杂度不仅与问题的规模相关,还与输入实例中的元素取值等相关,但在最坏的情况下,其时间复杂度就是只与求解问题的规模相关的。我们在讨论时间复杂度时,一般就是以最坏情况下的时间复杂度为准的。4.常用的存储表示方法有哪几种?答案:常用的存储表示方法有四
52、种:顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。5.确定下列算法中输出语句的执行次数,并给出算法的时间复杂度。(1) void combi (int n) int I,j,k;
53、160; for ( I=1; I<=n; I+) for ( j=I+1; j<=n; j+) for ( k=j+1; k<=n; k+) cout<<I,j,k;(2) void binary ( int n) while(n)
54、; cout<<n; n=n/2; 答案:(1)I取值范围从1n,j取值范围从I+1n,k取值范围从j+1n,情况如下表所示: I值j值k值输出语句的执行次数123, 4, ,nn-2n-1n1n/234,5,nn-3n-1n1n/n-2n-1n1n/n-1n/n/所以,输出语句共执行次数为(n-2)+(n-3)+1)+(n-3)+(n-4)+1)+1= (n-1)(n-2)/2+(n-2)(n-3
55、)/2+1= (n-1)2+(n-2)2+(n-3)2+12)-(n-1)+(n-2)+(n-3)+.+1)/2=(n-1)n(2n-1)/6-n(n-1)/2)/2=(n(n-1)(2n-4)/12=n(n-1)(n-2)/6(2) ceil(log2n); 6.为什么在单循环链表中设置尾指针比设置头指针更好?答案:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和 rear, 查找时间都是O(1)。 若用头指针来表示该链表
56、,则查找终端结点的时间为O(n)。7.何时选用顺序表、何时选用链表作为线性表的存储结构为宜?答案:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的
57、首尾两端,则采用尾指针表示的单循环链表为宜。8.指出以下算法中的错误和低效之处,并把它改写为一个既正确又高效的算法。Status DeleteK( SqList &a,int I, int k) /本过程从顺序存储结构的线性表a中删除第I个元素起的k个元素。if (I<1| k<0| I+k > a.length) return ERROR;else for (count=1;count<k;count+) /删除一个元素for (j=a.Length; j >=I+1;j-) a.elemj-1 = a.elemj;a.length-;rreturn O
58、K;/DeleteK答案:更正:for (j = I+k; j <=a.Length; j+) a.elemj-k = a.elemj; a.Length = a.Length k;9.假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点指针,试编写算法在链表中删除指针s所指结点的前驱结点。答案:void Delprior ( Link s)p = q = s; while (p->next!=s) q = p;p = p->next;q->next = s;delete ( p);10.假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点指针,试编写算法在链表中删除指针s所指结点的前驱结点。答案:void Delprior ( Link s)p = q = s; while (p->next!=s) q = p;p = p->next;q->next = s;delete ( p);11.已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m和n。试写一算法将这两个链表连接在一起,请分析你的算法的时间复杂度算法如下: LinkList Link( Link
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省徐州市2024-2025学年七年级下学期期中道德与法治试题(含答案)
- 财务会计实习感悟5篇
- 幼儿英语教学26个英文字母课件
- 幼儿园班级管理课件
- 2025年福建省中考道德与法治试卷真题(含标准答案)
- 2024-2025学年下学期高一生物人教版期末必刷常考题之基因表达与性状的关系
- 部编版一年级下册识字(二)《操场上》教案
- 建筑施工特种作业-建筑焊工真题库-4
- 入团面试稿子题目及答案
- 9 1 计数原理 排列与组合-高考数学真题分类 十年高考
- GB/T 44192-2024政务服务便民热线数据应用指南
- 安徽省池州市贵池区2023-2024学年七年级下学期末历史试卷
- 酒店运营管理 智慧树知到期末考试答案章节答案2024年山东青年政治学院
- (高清版)JTG 3810-2017 公路工程建设项目造价文件管理导则
- 一人出资一人出力合伙协议范本完整版
- 国家基层糖尿病神经病变诊治指南(2024版)
- 长安汽车使用说明书
- 肺栓塞诊断与治疗指南
- 幼儿园课程故事开展培训
- JJG 62-2017 塞尺行业标准
- (高清版)DZT 0017-2023 工程地质钻探规程
评论
0/150
提交评论