数据结构考研知识点总结.pdf
《数据结构考研知识点总结.pdf》由会员分享,可在线阅读,更多相关《数据结构考研知识点总结.pdf(34页珍藏版)》请在冰豆网上搜索。
数据结构考研真题及知识点解析数据结构考研真题及知识点解析考察目标考察目标1.掌握数据结构的基本概念、基本原理和基本方法。
2.掌握数据的逻辑结构、存储结构及基本操作的实现,能够对算法进行基本的时间复杂度与空间复杂度的分析。
3.能够运用数据结构的基本原理和方法进行问题的分析与求解;具备采用C、C+或Java语言设计与实现算法的能力。
第第22章章线性表线性表一、考研知识点一、考研知识点
(一)线性表的定义和基本操作
(二)线性表的实现1.顺序存储2.链式存储3.线性表的应用二、考查重点二、考查重点1线性结构的特点;2线性表在顺序存储及链式存储方式下的基本操作及其应用;3线性表的顺序存储及链式存储情况下,其不同和优缺点比较,及其各自适用的场合。
单链表中设置头指针、循环链表中设置尾指针而不设置头指针的各自好处;4能分析所写算法的时间和空间复杂度。
分析分析:
线性表是一种最简单的数据结构,在线性表方面,主要考查线性表的定义和基本操作、线性表的实现。
在线性表实现方面,要掌握的是线性表的存储结构,包括顺序存储结构和链式存储结构,特别是链式存储结构,是考查的重点。
另外,还要掌握线性表的基本应用。
线性表一章在线性结构的学习乃至整个数据结构学科的学习中,其作用都是不可低估的。
线性表一章小的知识点比较少,一般会出一个综合题,并且容易和第三章、第九章和第十章的内容结合来考,注意对基本知识的理解,能够利用书上的理论解决具体问题。
学习过程中要注意多积累,多看、多写一些相关算法。
三、考研真题三、考研真题
(一)选择题近几年第2章没有考选择题,只有两个计算时间复杂度的题目,因为此章主要是线性表的操作,而且又是这门课的一个基础,考综合题的可能性比较大,可以和第3章、第9章和第10章的内容结合来出题。
1(11年)设n是描述问题规模的非负整数,下面程序片段的时间复杂度是(A)。
x=2;while(x=0)的阶乘的算法如下,其时间复杂度是(B)。
intfact(intn)if(nk时,指针p随着每次遍历,也向前移动一个结点。
当遍历完成时,p或者指向表头结点,或者指向链表中倒数第k个位置上的结点。
(3)算法描述:
intlocate(Linklistlist,intk)p1=list-link;p=list;i=1;while(p1)p1=p1-link;i+;if(ik)p=p-next;/如果ik,则p也后移if(p=list)return0;/链表没有k个结点elseprintf(“%n”,p-data);return1;2.(10年)设将n(n,1)个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P(0Pn)个位置,即将R中的数据由(X0X1Xn-1)变换为(XpXp+1Xn-1X0X1Xp-1)要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C+或JAVA语言表述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度分析分析:
此题考查的是数组的操作,线性表的顺序存储的核心就是数组,因此此题实质上是考查的线性表的顺序存储的操作及其应用。
做此题时要考虑算法的时间和空间复杂度。
解法一解法一:
(1)算法的基本设计思想:
可以将这个问题看做是把数组ab转化成数组ba(a代表数组的前p个元素,b代表数组中余下的n-p个元素),先将a逆置得到a-1b,再将b逆置得到a-1b-1,最后将整个a-1b-1逆置得到(a-1b-1)-1=ba。
设reverse函数执行将数组元素逆置的操作,对abcdefgh向左循环移动3(p=3)个位置的过程如下:
reverse(0,p-1)得到cbadefgh;reverse(p,n-1)得到cbahgfde;reverse(0,n-1)得到defghabc。
注:
reverse中,两个参数分别表示数组中待转换元素的始末位置。
(2)算法描述:
voidreverse(intR,intlow,inthigh)/将数组中从low到high的元素逆置inttemp;for(i=0;i=1)的生序列S,处在第L/2个位置的数称为S的中位数,例如,若序列S1=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。
例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。
现在有两个等长升序序列A和B,试设计一个在时间和空间方面都尽可能高效的算法,找出两个序列A和B的中位数。
要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C+或JAVA语言描述算法,关键之处给出注释。
分析分析:
此题考查线性表的顺序存储,主要是线性表的基本操作的应用。
做此题时要把握算法的效率。
(1)算法的基本设计思想如下:
分别求出序列A和B的中位数,设为a和b,求序列A和B的中位数过程如下:
1)若a=b,则a或b即为所求中位数,算法结束;2)若ab,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求舍弃的长度相等;在保留的两个升序序列中,重复过程1)-3),直到两个序列中只含一个元素时为止,较小者即为所求的中位数。
(2)算法实现如下:
intM_search(intA,intB.intn)ints1=0,d1=n-1,m1,s2=0,d2=n-1,m2;/分别表示序列A和B的首位数、末尾数和中位数While(s1!
=d1|s2!
=d2)m1=(s1+d1)/2;m2=(s2+d2)/2;if(Am1=Bm2)returnAm1;elseif(Am1Bm2)if(s1+d1)%2=0s1=m1;d2=m2;elses1=m1+1;d2=m2;elseif(s1+d1)%2=0d1=m1;s2=m2;elsed1=m1+1;s2=m2;returnAs1len2)long=str1-next;short=str2-next;k=len1-len2;elselong=str2-next;short=str1-next;k=len2-len1;while(k)long=long-next;k-;while(long)if(long=short)returnlong;elselong=long-next;short=short-next;returnNULL;(3)由于每个表仅遍历一遍,因此算法时间复杂度为O(len1+len2),空间复杂度为O
(1)。
四、练习题四、练习题
(一)选择题1下述哪一条是顺序存储结构的优点?
(A)A存储密度大B插入运算方便C删除运算方便D可方便地用于各种逻辑结构的存储表示2下面关于线性表的叙述中,错误的是哪一个?
(B)A线性表采用顺序存储,必须占用一片连续的存储单元。
B线性表采用顺序存储,便于进行插入和删除操作。
C线性表采用链接存储,不必占用一片连续的存储单元。
D线性表采用链接存储,便于插入和删除操作。
3线性表是具有n个(C)的有限序列(n0)。
A表元素B字符C数据元素D数据项E信息项4若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(A)存储方式最节省时间。
A顺序表B双链表C带头结点的双循环链表D单循环链表5某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D)存储方式最节省运算时间。
A单链表B仅有头指针的单循环链表C双链表D仅有尾指针的单循环链表6若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为(C)(1=inext=NULL;for(i=n;i0;i-)p=(linklist)malloc(sizeof(LNode);Scanf(“%d”,&p-data);pnext=head-next;head-next=p;尾插法建表voidcreater(linklist&head)charch;linklistp,r;head-next=NULL;r=head;while(ch=getchar()!
=)p=(linklist)malloc(sizeof(LNode);p-data=ch;p-next=r-next;rnext=p;r=p;
(2)逆置操作顺序表的就地逆置voidreverse(SqList&A)for(i=1,j=A.length;ij;i+,j-)A.elemiA.elemj;/元素交换链表的就地逆置voidLinkList_reverse(Linklist&L)p=L-next;q=p-next;while(q)r=q-next;q-next=p;p=q;q=r;L-next-next=NULL;/修改第一个元素的指针值L-next=p;/修改表头结点指针值(3)线性表的合并顺序表的合并:
顺序存储的线性表la,lb的关键字为整数,元素非递减有序,线性表空间足够大,试编写高效算法,将lb中元素合并到la中,使新的la的元素仍非递减有序。
分析:
从后往前插入,避免移动元素voidunion(Sqlistla,Sqlistlb)m=la.length;n=lb.length;k=m+n;i=m;j=n;/循环指针赋值,从后往前比较while(i0&j0)if(la.elemi=lb.elemj)la.elemk=la.elemi;k-;i-;elsela.elemk=lb.elemj;k-;j-;if(j0)/判断lb是否为空la.elemk=lb.elemj;k-;j-;la.length=m+n;链表的合并:
把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原结点空间。
分析:
本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,因为合并以后是逆序,因此采用头插法,最后处理A或B的剩余元素。
LinkListUnion(LinkListA,LinkListB,LinkListC)pa=A-next;pb=B-next;C=A;A-next=null;while(pa!
=null&pb!
=null)if(pa-datadata)r=pa-next;pa-next=C-next;C-next=pa;pa=r;elser=pb-next;pb-next=C-next;C-next=pb;pb=r;while(pa!
=null)r=pa-next;pa-next=C-next;C-next=pa;pa=r;while(pb!
=null)r=pb-next;pb-next=C-next;C-next=pb;pb=r;returnC;(4)链表的拆分:
设L为一单链表的头指针,单链表的每个结点由一个整数域data和指针域next组成,整数在单链表中是无序的。
设计算法,将链表中结点分成一个奇数链和一个偶数链,算法中不得申请新的结点空间。
分析:
利用原链表空间,在原链表的分解过程中新建链表。
voiddiscreat(linklistL)s=L-next;p=L;p-next=NULL;q-next=NULL;while(s!
=NULL)r=s-next;if(s-data%2!
=0)/奇数链链接s-next=p-next;p-next=s;else/偶数链链接s-next=q-next;q-next=s;s=r;2算法练习
(1)试编写在带头结点的单链表中删除最小值结点的高效算法。
voiddelete(linklistL)p=L-next;pre=L;q=p;while(p-next!
=NULL)/找最小值元素,pre指向最小值的前驱if(p-next-datadata)pre=p;q=p-ne