版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构考研真题及知识点解析考察目标1.
掌握数据结构的根本概念、根本原理和根本方法。2.
掌握数据的逻辑结构、存储结构及根本操作的实现,能够对算法进行根本的时间复杂度与空间复杂度的分析。3.
能够运用数据结构的根本原理和方法进行问题的分析与求解;具备采用C、C++或Java语言设计与实现算法的能力。第2章线性表一、考研知识点〔一〕线性表的定义和根本操作〔二〕线性表的实现1.顺序存储2.链式存储3.线性表的应用二、考查重点1.线性结构的特点;2.线性表在顺序存储及链式存储方式下的根本操作及其应用;3.线性表的顺序存储及链式存储情况下,其不同和优缺点比拟,及其各自适用的场合。单链表中设置头指针、循环链表中设置尾指针而不设置头指针的各自好处;4.能分析所写算法的时间和空间复杂度。分析:线性表是一种最简单的数据结构,在线性表方面,主要考查线性表的定义和根本操作、线性表的实现。在线性表实现方面,要掌握的是线性表的存储结构,包括顺序存储结构和链式存储结构,特别是链式存储结构,是考查的重点。另外,还要掌握线性表的根本应用。线性表一章在线性结构的学习乃至整个数据结构学科的学习中,其作用都是不可低估的。线性表一章小的知识点比拟少,一般会出一个综合题,并且容易和第三章、第九章和第十章的内容结合来考,注意对根本知识的理解,能够利用书上的理论解决具体问题。学习过程中要注意多积累,多看、多写一些相关算法。三、考研真题〔一〕选择题近几年第2章没有考选择题,只有两个计算时间复杂度的题目,因为此章主要是线性表的操作,而且又是这门课的一个根底,考综合题的可能性比拟大,可以和第3章、第9章和第10章的内容结合来出题。1.〔11年〕设n是描述问题规模的非负整数,下面程序片段的时间复杂度是〔A〕。x=2;while(x<n/2)x=2*x;A.O(logn)
B.O(n)
C.O(nlogn)
D.O(n2)2.〔12年〕求整数n〔n>=0〕的阶乘的算法如下,其时间复杂度是〔B〕。intfact(intn){if(n<=1)return1;returnn*fact(n-1);}A.o(log2n)B.O(n)C.O(nlog2n)D.O(n2)分析:考查的是算法时间复杂度的计算。可以放在第二章,实际这内容贯穿每一章内容中算法的度量。〔二〕综合题1.〔09年〕一个带有表头结点的单链表结点结构为(data,link),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点〔k为正整数〕。假设查找成功,算法输出该结点的data值,并返回1;否那么,只返回0。要求:〔1〕描述算法的根本设计思想;〔2〕描述算法的详细实现步骤;〔3〕根据设计思想和实现步骤,采用程序设计语言描述算法〔使用C或C++或JAVA语言实现〕,关键之处给出简要注释。分析:此题考查线性表的链式存储,主要是线性表的根本操作的应用。做此题时要把握算法的效率。〔1〕算法根本思想如下:从头到尾遍历单链表,并用指针p指向当前结点的前k个结点。当遍历到链表的最后一个结点时,指针p所指向的结点即为所查找的结点。〔2〕详细实现步骤:增加两个指针变量和一个整型变量,从链表头向后遍历,其中指针p1指向当前遍历的结点,指针p指向p1所指向结点的前k个结点,如果p1之前没有k个结点,那么p指向表头结点。用整型变量i表示当前遍历了多少结点,当i>k时,指针p随着每次遍历,也向前移动一个结点。当遍历完成时,p或者指向表头结点,或者指向链表中倒数第k个位置上的结点。〔3〕算法描述:intlocate(Linklistlist,intk){p1=list->link;p=list;i=1;while(p1){p1=p1->link;i++;if(i>k)p=p->next;//如果i>k,那么p也后移}if(p==list)return0;//链表没有k个结点else{printf(“%\n”,p->data);return1;}}2.〔10年〕设将n(n,1)个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P〔0﹤P﹤n〕个位置,即将R中的数据由〔X0X1……Xn-1〕变换为〔XpXp+1……Xn-1
X0
X1……Xp-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<=(high-low)/2;i++){temp=R[low+i];R[l0ow+i]=R[high-i];R[high-i]=temp;}}voidconverse(intR[],intn,intp){reverse(R,0,p-1);reverse(R,p,n-1);reverse(R,0,n-1);}〔3〕上述算法中三个reverse函数的时间复杂度分别是O(p/2)、O((n-p)/2)、O(n/2),故所设计算法的时间复杂度为O(n),空间复杂度为O(1)。解法二:算法思想:创立大小为p的辅助数组S,将R中前p个整数依次暂存在S中,同时将R中后n-p个整数左移,然后将S中暂存的p个数依次放回到R中的后续单元。时间复杂度为O(n),空间复杂度为O(p)。3.〔11年〕一个长度为L〔L>=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〕假设a<b,那么舍弃序列A中较小的一半,同时舍弃序列B中较大的一半,要求舍弃的长度相等;3〕假设a>b,那么舍弃序列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(A[m1]==B[m2])returnA[m1];elseif(A[m1<B[m2])if(s1+d1)%2==0{s1=m1;d2=m2;}else{s1=m1+1;d2=m2;}elseif(s1+d1)%2==0{d1=m1;s2=m2;}else{d1=m1+1;s2=m2;}}returnA[s1]<B[s2]?A[s1]:B[s2];}〔3〕算法的时间复杂度为O(logn),空间复杂度为O(1)。4.〔12年〕假定采用带头结点的单链表,如果有共同后缀,长度分别为len1和len2〔这个条件是我查了一些资料后加上的,网上给的资料这个题目不完整〕,那么可共享相同的后缀存储空间,例如,“loading”和“Beijing”,如以下图所示。设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为〔data,next〕,请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置〔如图中字符i所在结点的位置p〕。要求:〔1〕给出算法的根本设计思想。 〔2〕根据设计思想,采用C或C++或JAVA语言描述算法,关键之处给出注释。〔3〕说明你所设计算法的时间复杂度。分析:两个单链表有公共结点,那么从公共结点开始,它们的next都指向同一个结点。由于每个单链表结点只有一个next域,因此,从第一个公共结点开始,之后它们所有的结点都是重合的,不可能再出现分叉。因此,我们判断两个链表是不是有重合的局部,只要分别遍历两个链表到最后一个结点。如果两个尾结点是一样的,说明它们有公共结点;否那么两个链表没有公共的结点。因为两个链表长度不一定一样,在顺序遍历两个链表到尾结点时,并不能保证在两个链表上同时到达尾结点。假设一个链表比另一个长k个结点,我们先在长的链表上遍历k个结点,之后再同步遍历,此时能够保证同时到达最后一个结点。在遍历中,第一个相同的结点就是第一个公共结点。〔1〕算法思想:根据两个单链表的长度,求出它们的长度之差;在长的单链表上先遍历长度之差个结点;同步遍历两个单链表,直接找到相同的结点,假设有相同结点返回该节点,假设没有那么一直到链表结束。〔2〕算法实现:LinkListsearch〔LinkListstr1,LinkListstr2,intlen1,int2〕{if〔len1>len2〕{long=str1->next;short=str2->next;k=len1-len2;}else{long=str2->next;short=str1->next;k=len2-len1;}while(k){long=long->next;k--;}while(long){if(long==short)returnlong;else{long=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〕的有限序列〔n>0〕。A.表元素B.字符C.数据元素D.数据项E.信息项4.假设某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,那么利用〔A〕存储方式最节省时间。A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,那么采用〔D〕存储方式最节省运算时间。A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表6.假设长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为〔C〕(1<=i<=n+1)。A.O(0)B.O(1)C.O(n)D.O(n2)7.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为〔C〕。A.O(n)O(n)B.O(n)O(1)C.O(1)O(n)D.O(1)O(1)8.线性表〔a1,a2,…,an〕以链接方式存储时,访问第i位置元素的时间复杂性为〔C〕。A.O〔i〕B.O〔1〕C.O〔n〕D.O〔i-1〕〔二〕综合题1.掌握线性表中几个最根本的操作算法〔1〕链表的建立头插法建表voidreatelistf(linklist&head,intn){//逆序输入n个数据元素,建立带头结点的单链表linklistp;head=(linklist)malloc(sizeof(LNode));head->next=NULL;for(i=n;i>0;i--){p=(linklist)malloc(sizeof(LNode));Scanf(“%d”,&p->data);p–>next=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;r–>next=p;r=p;}}〔2〕逆置操作顺序表的就地逆置voidreverse(SqList&A){for(i=1,j=A.length;i<j;i++,j--)A.elem[i]<->A.elem[j];//元素交换}链表的就地逆置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(i>0&&j>0){if(la.elem[i]>=lb.elem[j]){la.elem[k]=la.elem[i];k--;i--;}else{la.elem[k]=lb.elem[j];k--;j--;}}if(j>0)//判断lb是否为空{la.elem[k]=lb.elem[j];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->data<=pb->data){r=pa->next;pa->next=C->next;C->next=pa;pa=r;}else{r=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->data<q->data){pre=p;q=p->next;}p=p->next;}pre->next=q->next;free(q);}分析:此算法的高效在于在循环过程中利用最小值结点的前驱指针进行比拟,比拟结束后直接保存了最小值结点的前驱,方便进行删除操作。〔2〕设单链表的表头指针为h,结点结构由data和next两个域构成,其中data域为字符型。写出算法dc(h,n),判断该链表的前n个字符是否中心对称。例如xyx,xyyx都是中心对称。分析:判断链表中数据是否中心对称,通常使用栈。将链表的前一半元素依次进栈。在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两元素比拟,假设相等,那么将链表中下一元素与栈中再弹出元素比拟,直至链表到尾。这时假设栈是空栈,那么得出链表中心对称的结论;否那么,当链表中一元素与栈中弹出元素不等时,结论为链表非中心对称,结束算法的执行。intdc〔Linklisth,intn〕{∥h是带头结点的n个元素单链表,链表中结点的数据域是字符。chars[];inti=1;∥i记结点个数,s字符栈p=h->next;∥p是链表的工作指针,指向待处理的当前元素。for〔i=1;i<=n/2;i++〕∥链表前一半元素进栈。{s[i]=p->data;p=p->next;}i--;∥恢复最后的i值if〔n%2==1〕p=p->next;∥假设n是奇数,后移过中心结点。while〔p!=null&&s[i]==p->data〕{i--;p=p->next;}∥测试是否中心对称。if〔p==null〕return1;∥链表中心对称elsereturn0;∥链表不中心对称}∥算法结束。〔3〕两个单链表A和B,其头指针分别为heada和headb,编写一个过程从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前。分析:在单链表中删除自第i个元素起的共len个元素,应从第1个元素起开始计数,记到第i个时开始数len个,然后将第i-1个元素的后继指针指向第i+len个结点,实现了在A链表中删除自第i个起的len个结点。这时应继续查到A的尾结点,得到删除元素后的A链表。再查B链表的第j个元素,将A链表插入之。插入和删除中应注意前驱后继关系,不能使链表“断链”。另外,算法中应判断i,len和j的合法性。LinklistDelInsert〔Linklistheada,Linklistheadb,inti,j,len〕{∥heada和headb均是带头结点的单链表。if〔i<1||len<1||j<1〕{printf〔“参数错误\n”〕;exit〔0〕;}∥参数错,退出算法。p=heada;∥p为链表A的工作指针,初始化为A的头指针k=0;∥计数while〔p!=null&&k<i-1〕∥查找第i个结点。{k++;p=p->next;}if〔p==null〕{printf〔“给的%d太大\n”,i〕;exit〔0〕;}∥i太大,退出算法q=p->next;∥q为工作指针,初始指向A链表第一个被删结点。k=0;while〔q!=null&&k<len〕{k++;u=q,q=q->next;free〔u〕;}∥删除结点,后移指针。if〔k<len〕{printf〔“给的%d太大\n”,len〕;exit〔0〕;}p->next=q;∥A链表删除了len个元素。if(heada->next!=null)∥heada->next=null说明链表中结点均已删除,无需往B表插入{while〔p->next!=null〕p=p->next;∥找A的尾结点。q=headb;∥q为链表B的工作指针。k=0;∥计数while〔q!=null&&k<j-1〕∥查找第j个结点。{k++;q=q->next;}∥查找成功时,q指向第j-1个结点if〔q==null〕{printf〔“给的%d太大\n”,j〕;exit〔0〕;}p->next=q->next;∥将A链表链入q->next=heada->next;∥A的第一元素结点链在B的第j-1个结点之后}//iffree〔heada〕;∥释放A表头结点。}〔4〕按1,3,5,...4,2的顺序重排双向循环链表L中的所有结点。分析:next链和pre链的调整分开进行。从前往后调整奇数链,然后从后往前调整偶数链,最后修改pre指针。voidReform(DuLinkList&L)
{
p=L->next;
while(p->next!=L&&p->next->next!=L)
{
p->next=p->next->next;
p=p->next;
}//从前往后调整奇数链
if(p->next==L)p->next=L->pre->pre;
elsep->next=L->pre;//根据链表中元素个数是奇数还是偶数处理表尾结点
p=p->next;
while(p->pre->pre!=L)
{
p->next=p->pre->pre;
p=p->next;
}//从后往前调整偶数链
p->next=L;
for(p=L;p->next!=L;p=p->next)p->next->pre=p;//重新修改前驱指针
L->pre=p;
}第3章栈和队列一、考研知识点〔一〕栈和队列的根本概念〔二〕栈和队列的顺序存储结构〔三〕栈和队列的链式存储结构〔四〕栈和队列的应用二、考查重点1.栈和队列的特点,及其应用;2.栈的顺序存储和链式存储的入栈和出栈操作,以及判断栈的空和满的条件;3.队列的顺序存储和链式存储的入队和出队操作,以及判断队列空和满的条件;4.理解栈与递归的关系,利于对以后章节〔树和图〕的学习和复习。分析:栈和队列是两种特殊的线性表,在这方面,要求我们掌握栈和队列的根本概念,以及他们之间的区别。对于栈和队列的存储结构(包括顺序存储结构、链式存储结构)要有较深的理解,对于栈和队列的应用,例如,排队问题、子程序调用问题、表达式问题等,要搞清楚。此章内容是线性表的深化,如果线性表理解的好,这一章就比拟容易。这一章小的知识点比拟多,一般容易出选择题,从09-12年的考研真题来看,主要是考查栈和队列的特点及其应用、栈的入栈出栈操作和队列的入队出队操作、判断栈和队列的空与满的条件。一般不会单独出综合题,如果出综合题会将栈和队列作为其他结构中一个小环节出题,比方和线性表结合,作为实现递归的工具和二叉树结合等。三、考研真题〔一〕选择题1.〔09年〕为解决计算机和打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入缓冲区,而打印机那么依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是〔〕。A.栈B.队列C.树D.图分析:答案是B,此题可以认为考查队列的特点,也可以看做是考查四种数据结构的特点。2.〔09年〕设栈S和队列Q的初始状态均为空,元素abcdefg依次进入栈S。假设每个元素出栈后立即进入队列Q,且7个元素出队顺序是bdcfeag,那么栈S的容量至少是〔〕。A.1B.2C.3D.4分析:答案是C,此题考查栈的入栈和出栈操作和队列的入队和出队操作。3.〔10年〕假设元素a,b,c,d,e,f依次进栈,允许进栈、退栈操作交替进行。但不允许连续三次进行退栈工作,那么不可能得到的出栈序列是〔
〕。A.dcebfa
B.cbdaef
C.dbcaef
D.afedcb分析:答案是D,此题考查栈的入栈和出栈操作,但题目出的不是太严谨,严格说应该是CD两个答案。4.〔10年〕某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,那么不可能得到的顺序是〔C〕A.bacde
B.dbace
C.dbcae
D.ecbad分析:答案是C,此题考查队列的入队和出队操作。5.〔11年〕元素a,b,c,d,e依次进入初始为空的栈中,假设元素进栈后可停留、可进栈,直到所有元素都出栈,那么在所有可能的出栈序列中,以元素d开头的序列个数是A.3
B.4
C.5
D.6分析:答案是B,出栈序列必为d_c_b_a.e的顺序不定,在任意一个“_”上都有可能。6.〔11年〕循环队列存储在一维数组A[0..n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。假设初始时队列为空,且要求第1个进入队列的元素存储在A[0]处,那么初始时front和rear的值分别是A.0,0
B.0,n-1
C.n-1,0
D.n-1,n-1分析:答案是B,插入元素时,front不变,rear+1,而插入第一个元素之后,队尾要指向尾元素,显然,rear初始应该为n-1,front为07.〔12年〕操作符包括’+’、’-’、’*’、’/’、’(’和’)’。将中缀表达式a+b-a*((c+d)/e-f)+g转换为等价的后缀表达式ab+acd+e/f-*-g+时,用栈来存放暂时还不能确定运算次序的操作符,假设栈初始为空,那么转换过程中同时保存在栈中的操作符的最大个数是〔〕。A.5B.7C.8D.11分析:答案是A,此题考查栈的应用,将中缀表达式转化为后缀表达式,转化过程中利用两个栈分别存放操作符和转化后的表达式,要明确两个栈中元素的进出情况。〔二〕综合题10年考研综合题的第二题如果用解法二,可以认为考查了队列的根本操作,因为栈和队列本身是线性结构,所以考试时可以综合来考,和第2章的内容没有太明显的界限。四、练习题〔一〕选择题1.一个栈的输入序列为123…n,假设输出序列的第一个元素是n,输出第i〔1<=i<=n〕个元素是〔B〕。A.不确定B.n-i+1C.iD.n-i2.假设一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,那么第j个输出元素是〔D〕。A.i-j-1B.i-jC.j-i+1D.不确定的3.输入序列为ABC,可以变为CBA时,经过的栈操作为〔B〕。A.push,pop,push,pop,push,popB.push,push,push,pop,pop,popC.push,push,pop,pop,push,popD.push,pop,push,push,pop,pop4.循环队列存储在数组A[0..m]中,那么入队时的操作为〔D〕。A.rear=rear+1B.rear=(rear+1)mod(m-1)C.rear=(rear+1)modmD.rear=(rear+1)mod(m+1)5.假设用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再参加两个元素后,rear和front的值分别为〔B〕?A.1和5B.2和4C.4和2D.5和1〔二〕综合题这一章一般不会单独出综合题,和其他章节的结合在相关章节中有例题表达。第5章数组和广义表一、考研知识点特殊矩阵的压缩存储二、考查重点一维数组属于线性表范畴,但多维数组不属于线性表。在这方面,主要掌握数组的存储结构,例如按行优先、按列优先等,某个元素存在的地址是什么。对于特殊矩阵(二维数组)的压缩存储原理也要搞清楚。重点考查特殊矩阵的压缩存储中矩阵中元素在存储空间中地址的计算,只要掌握计算的方法就行,计算时需要特别注意矩阵首元素的下标值以及存储空间首元素的下标值。三、考研真题近几年此知识点没有出题。四、练习题1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,那么a85的地址为〔B〕。A.13B.33C.18D.402.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为(B)。A.BA+141B.BA+180C.BA+222D.BA+2253.假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,那么LOC[5,5]=〔B〕。A.808B.818C.1010D.10204.将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A6665〔即该元素下标i=66,j=65〕,在B数组中的位置K为〔B〕。A.198B.195C.197D.1965.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。从供选择的答案中选出应填入以下关于数组存储表达中〔〕内的正确答案。〔1〕存放A至少需要〔E〕个字节;〔2〕A的第8列和第5行共占〔A〕个字节;〔3〕假设A按行存放,元素A[8,5]的起始地址与A按列存放时的元素〔B〕的起始地址一致。〔1〕A.90B.180C.240D.270E.540〔2〕A.108B.114C.54D.60E.150〔3〕A.A[8,5]B.A[3,10]C.A[5,8]D.A[0,9]6.设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1≤i,j≤n,且i≤j)在B中的位置为(B)。A.i(i-l)/2+jB.j(j-l)/2+iC.j(j-l)/2+i-1D.i(i-l)/2+j-1第6章树和二叉树一、考研知识点〔一〕树的根本概念〔二〕二叉树1.二叉树的定义及其主要特征2.二叉树的顺序存储结构和链式存储结构3.二叉树的遍历4.线索二叉树的根本概念和构造〔三〕树、森林1.树的存储结构2.森林与二叉树的转换3.树和森林的遍历〔四〕树与二叉树的应用哈夫曼〔Huffman〕树和哈夫曼编码二、考查重点1.二叉树的定义与特点;2.二叉树的性质及应用;3.二叉树的遍历〔遍历过程及算法实现〕;4.线索二叉树的构造;5.树的存储及树与二叉树的转换;6.哈夫曼树构造和哈夫曼编码。分析:二叉树和树是两种不同的概念,这一点是必须要搞清楚的。在这个局部,我们要掌握树的定义、二叉树的定义及主要特征(特殊的二叉树、二叉树的性质)。在二叉树的顺序存储结构和链式存储结构方面,特别是链式存储结构,因为很多应用都是建立在链式存储根底上,例如,二叉树的遍历(前序遍历、中序遍历、后序遍历)就是一种典型的应用。在特殊的二叉树中,完全二叉树的概念是必须要搞清楚的,其次,线索二叉树的根本概念和构造。多棵独立的树就组成了森林,树的存储结构和遍历、森林的遍历、树和二叉树的转换、森林和二叉树的转换等知识,也要了解。最后就是树的应用,通常会作为综合应用类试题出现,包括等价类问题、哈夫曼(Huffman)树和哈夫曼编码等。此章知识点比拟多,并且每个知识点都可能出题,因此要做到对每一个知识点的理解和掌握,选择题和综合题都可以出,综合题一般会现在二叉树的遍历及其应用、树与二叉树的转换和哈夫曼树的构造及哈夫曼编码。三、考研真题〔一〕选择题1.〔09年〕给定二叉树如下图。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。假设遍历后的结点序列为3,7,5,6,1,2,4,那么其遍历方式是〔〕。A.LRNB.NRLC.RLND.RNL分析:答案是D,此题考查二叉树的遍历。2.〔09年〕一棵完全二叉树的第6层〔设根为第1层〕有8个叶结点,那么完全二叉树的结点个数最多是〔〕。A.39B.52C.111D.119分析:答案是C,此题考察二叉树的性质2以及完全二叉树的概念。3.〔09年〕将森林转换为对应的二叉树,假设在二叉树中,结点u是结点v的父结点的父结点,那么在原来的森林中,u和v可能具有的关系是〔〕。I.父子关系II.兄弟关系III.u的父结点与v的父结点是兄弟关系A.只有IIB.I和IIC.I和IIID.I、II和III分析:答案是B,此题考查树与二叉树的转换,因为u是v的父结点,假设v是u的左子树,那么u与v是父子关系,假设v是u的右子树,那么u与v是兄弟关系。4.〔10年〕以下线索二叉树中〔用虚线表示线索〕,符合后序线索树定义的是〔
〕。分析:答案是D,此题考查二叉树的线索化。5.〔10年〕在一棵度为4的树T中,假设有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,那么树T的叶节点个数是〔〕。A.41
B.82
C.113
D.122分析:答案是B,此题考查二叉树的性质,利用二叉树的性质3的证明思路进行求解。6.〔10年〕对n(n大于等于2)个权值均不相同的字符构成哈夫曼树,关于该树的表达中,错误的选项是〔〕。A.该树一定是一棵完全二叉树
B.树中一定没有度为1的结点C.树中两个权值最小的结点一定是兄弟结点
D.树中任一非叶结点的权值一定不小于下一层任一结点的权值分析:答案是A,此题考查哈夫曼树的构造,以及哈夫曼树的特点。7.〔11年〕假设一棵完全二叉树有768个结点,那么该二叉树中叶结点的个数是〔〕。A.257
B.258
C.384
D.385分析:答案是C,考查二叉树的性质,叶结点个数为你n那么度为2的结点个数为n-1,总结点个数为偶数,那么度为1的结点个数为1,因此2n=768。8.〔11年〕假设一棵二叉树的前序遍历序列和后序遍历序列分别为1,2,3,4和4,3,2,1,那么该二叉树的中序遍历序列不会是〔〕。A.1,2,3,4
B.2,3,4,1
C.3,2,4,1
D.4,3,2,1分析:答案是C,考查二叉树的遍历。此题可以用画图的方式进行判断。9.〔11年〕一棵有2011个结点的树,其叶结点个数116,该树对应的二叉树中无右孩子的结点个数是〔〕。A.115
B.116
C.1895
D.1896分析:答案是D,此题考查二叉树和树的转换。考虑一种特殊的情况,设题意中的树是如以下图所示的结构,那么对应的二叉树中仅有前115个叶结点有右孩子。10.〔年〕假设一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b,c,d,e,a,那么根结点的孩子结点〔〕。A.只有eB.有e、bC.有e、cD.无法确定分析:答案为A。此题考查二叉树的遍历,根据我们的常识,由前序序列和后序序列不能确定二叉树,但此题并不是确定二叉树而是确定二叉树的根结点的孩子结点,因为根结点可以确定,仔细分析前序和后序序列,可以判断出孩子结点只有e,因此答案为A。〔二〕综合题1.〔12年〕设有6个有序表A、B、C、D、E、F,分别含有10、35、40、50、60和200个数据元素,各表中元素按升序排列。要求通过5次两两合并,将6个表最终合并成一个升序表,并在最坏情况下比拟的总次数到达最小。请答复以下问题。〔1〕请写出合并方案,并求出最坏情况下比拟的总次数。〔2〕根据你的合并过程,描述N〔N>=2〕个不等长升序表的合并策略,并说明理由。分析:根据排序中的归并排序的思想,多个有序表通过两两归并可以得到一个有序表,因为多个归并段的长度不同,在进行两两归并时要想减少比拟的次数,是先将元素少的表进行归并,再归并元素多的表。这样这个问题就转化为最优二叉树的构造问题,将6个有序表的长度看做6个叶子结点的权值,由此构造最优二叉树。〔此分析是根据个人理解做的,暂时没有权威机构的标准答案〕四、练习题〔一〕选择题1.一个具有1025个结点的二叉树的高h为〔C〕。A.11B.10C.11至1025之间D.10至1024之间2.一棵二叉树高度为h,所有结点的度或为0或为2,那么这棵二叉树最少有(B)结点。A.2hB.2h-1C.2h+1D.h+13.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C)次序的遍历实现编号。A.先序B.中序C.后序D.从根开始按层次遍历4.某二叉树的前序序列和后序序列正好相反,那么该二叉树一定是〔C〕的二叉树。A.空或只有一个结点B.任一结点无左子树C.高度等于其结点数D.任一结点无右子树5.假设X是二叉中序线索树中一个有左孩子的结点,且X不为根,那么X的前驱为(C)。A.X的双亲B.X的右子树中最左的结点C.X的左子树中最右结点D.X的左子树中最右叶结点6.一棵左右子树均不空的二叉树在先序线索化后,其中空的链域的个数是(B)。A.0B.1C.2D.不确定〔二〕综合题1.二叉树的根本遍历算法〔1〕二叉树前序、中序、后序和层次遍历的非递归算法前序voidPreOrder(BitreeT){InitStack(S);Push(S,T);
while(!StackEmpty(S))
{pop(S,p);
visit(p->data);if(p->rchild!=NULL)push(S,p->rchild);
if(p->lchild!=NULL)push(S,p->lchild);
}}中序voidInOrder(BitreeT){InitStack(S);p=T;
while(!StackEmpty(S)||p!=NULL){while(p!=NULL){push(S,p);p=p->lchild;}if(!StackEmpty(S)){pop(S,p);
visit(p->data);p=p->rchild;
}}}后序voidPostOrder(BitreeT){Bitreestack[],p;inttag[],top=0;p=T;while(top>0||p!=NULL)
{while(p!=NULL){top++;stack[top]=p;tag[top]=0;p=p->lchild;}if(top>0){p=stack[top];while(tag[top]==1){top--;visit(p->data);p=stack[to}
if(top>0){p=stack[top];p=p->rchild;tag[top]=1;}
}}}层次voidLayerOrder(BitreeT){InitQueue(Q);
EnQueue(Q,T);
while(!QueueEmpty(Q))
{DeQueue(Q,p);
visit(p->data);
if(p->lchild)EnQueue(Q,p->lchild);
if(p->rchild)EnQueue(Q,p->rchild);
}}〔2〕二叉树遍历递归算法的应用求二叉树中叶子结点的数目intLeafCount_BiTree(BitreeT){if(!T)return0;//空树没有叶子
elseif(!T->lchild&&!T->rchild)return1;elsereturnLeaf_Count(T->lchild)+Leaf_Count(T>rchild);}交换所有结点的左右子树。voidBitree_Revolute(BitreeT){if(T!=NULL)T->lchild<->T->rchild;
if(T->lchild)Bitree_Revolute(T->lchild);
if(T->rchild)Bitree_Revolute(T->rchild);}求二叉树中以值为x的结点为根的子树深度。intGet_Sub_Depth(BitreeT,intx){if(T->data==x)
{printf("%d\n",Get_Depth(T));
exit1;}
else{if(T->lchild)Get_Sub_Depth(T->lchild,x);if(T->rchild)Get_Sub_Depth(T->rchild,x);}}intGet_Depth(BitreeT){if(!T)return0;
else{
m=Get_Depth(T->lchild);
n=Get_Depth(T->rchild);
return(m>n?m:n)+1;
}}判断两棵树是否相似的递归算法。intBitree_Sim(BitreeB1,BitreeB2){if(!B1&&!B2)return1;
elseif(B1&&B2)return(Bitree_Sim(B1->lchild,B2->lchild)&&Bitree_Sim(B1->rchild,B2->rchild))elsereturn0;
}2.二叉树非递归遍历算法的应用〔1〕判断一二叉树是否为完全二叉树。intFull_Bitree(BitreeT){InitQueue(Q);flag=0;
EnQueue(Q,T);while(!QueueEmpty(Q))
{
DeQueue(Q,p);
if(!p)flag=1;
elseif(flag)return0;
else{
EnQueue(Q,p->lchild);
EnQueue(Q,p->rchild);
}
}return1;}〔2〕在二叉树中查找值为x的结点,编写算法输出x的所有祖先。voidPostOrder(BitreeT,intx){Bitreestack[],p;inttag[],top=0;p=T;while(top>0||p!=NULL){while(p!=NULL&&p->data!=x){top++;stack[top]=p;tag[top]=0;p=p->lchild;}if(p->data==x){printf(“”);for(i=1;i<=top;i++)printf(stack[i]->data);return;}while(tag[top]==1&&top>1)top--;if(top>0){p=stack[top];p=p->rchild;tag[top]=1;}
}}分析:二叉树遍历算法的应用中关键的一个环节是分析要实现相关功能应该选择二叉树的哪一种遍历方式有利于实现,如以上两个例子中分别选用二叉树的层次遍历和后序遍历实现具体操作,主要对遍历算法稍加处理就可以实现了。3.从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的根本目的是什么,并指出树和二叉树的主要区别。分析:树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,也就是说树〔树是森林的特例,即森林中只有一棵树的特殊情况〕可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题。4.如果给出了一个二叉树结点的前序序列和中序序列,能否构造出此二叉树?假设能,请证明之。假设不能,请给出反例。如果给出了一个二叉树结点的前序序列和后序序列,能否构造出此二叉树?假设能,请证明之。假设不能,请给出反例。分析:给定二叉树结点的前序序列和对称序〔中序〕序列,可以唯一确定该二叉树。因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两局部,左边〔设l个元素〕表示左子树,假设左边无元素,那么说明左子树为空;右边〔设r个元素〕是右子树,假设为空,那么右子树为空。根据前序遍历中“根-—左子树—右子树”的顺序,那么由从第二元素开始的l个结点序列和中序序列根左边的l个结点序列构造左子树,由前序序列最后r个元素序列与中序序列根右边的r个元素序列构造右子树。由二叉树的前序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两局部。例如,任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不同的二叉树。5.给定一组数列〔15,8,10,21,6,19,3〕分别代表字符A,B,C,D,E,F,G出现的频度,试表达建立哈夫曼树的算法思想,画出哈夫曼树,给出各字符的编码值,并说明这种编码的优点。分析:考查哈夫曼树的构造和哈夫曼编码,过程略。编码的优点是采用前缀编码,出现频度最高的字符编码最短,减少编码长度,减少出错率。第7章图一、考研知识点〔一〕图的根本概念〔二〕图的存储及根本操作1.邻接矩阵法2.邻接表法〔三〕图的遍历1.深度优先搜索2.广度优先搜索〔四〕图的根本应用1.最小〔代价〕生成树2.最短路径3.拓扑排序4.关键路径二、考查重点1.图的根本概念及特点;2.图的存储结构〔邻接矩阵和邻接表〕;3.图的深度优先和广度优先遍历;4.图的应用〔最小生成树的构造过程、拓扑序列的生成、最短路径和关键路径的求解过程〕。分析:在数据结构中,图的结构是最复杂的,这里的概念也是最多的。我们要掌握图的根本概念(有向图、无向图、连通、路径、子图、出度、入度、生成树、最短路径、关键路径等)。图的存储及根本操作主要有邻接矩阵法和邻接表法,我们要掌握这有向图和无向图的这2种存储方法,要清楚图的连通和存储方法之间的关系。例如,一个顶点的出度和邻接矩阵中1的个数有什么关系,等等。图的遍历方法有深度优先搜索和广度优先搜索,我们要掌握这2种遍历方法的算法实现。给出一个具体的图,要能知道它的遍历次序。在数据结构课程中,图的根本应用是最多的,也是最复杂的,我们要掌握这些应用的复杂度分析。要掌握的具体应用主要包括最小(代价)生成树、最短路径、拓扑排序、关键路径。在给出的一个具体的图中,我们要会利用条件,求出上述应用的结果。这一章的内容也比拟多,尤其大的知识点比拟多,容易出综合题,特别是图的应用。在理解最小生成树、拓扑排序、最短路径和关键路径的求解的同时要注意和具体问题结合,一般不会直接考,会和具体问题结合来考,例如09年的考研题。这一章考算法的可能性不大,但那两个最根本的遍历算法最好掌握。三、考研真题〔一〕选择题1.〔09年〕以下关于无向连通图特性的表达中,正确的选项是〔〕。I.所有顶点的度之和为偶数II.边数大于顶点个数减1III.至少有一个顶点的度为1A.只有IB.只有IIC.I和IID.I和III分析:答案是A,此题考查无向连通图的特性。2.〔10年〕假设无向图G-〔V.E〕中含7个顶点,那么保证图G在任何情况下都是连通的,那么需要的边数最少是〔〕。A.6
B.15
C.16
D.21分析:答案是C,此题考查无向连通图的特点,解题时需要注意保证图G在任何情况下都是连通的这句话,这是关键。因为要保证图在任何情况下都连通,先考虑6个顶点全连通需要15条边,加上一个顶点后,加上一条边保证第七个顶点与图连通,因此至少需要16条边。3.〔10年〕对以下图进行拓补排序,可以得到不同的拓补序列的个数是〔〕。A.4
B.3
C.2
D.1分析:答案是B,此题考查图的拓扑排序。4.〔11年〕以下关于图的表达中,正确的选项是〔〕。I.回路是简单路径II.存储稀疏图,用邻接矩阵比邻接表更省空间III.假设有向图中存在拓扑序列,那么该图不存在回路A.仅II
B.仅I、II
C.仅III
D.仅I、III分析:答案是C,此题考查图的根本概念。回路对应于路径,简单回路对应于简单路径;II刚好说反了,III是拓扑有序的必要条件。5.〔12年〕对有n个结点,e条边且使用邻接表存储的有向图进行广度优先遍历,其算法时间复杂度是〔〕。A.O(n)B.O(e)C.O(n+e)D.O(n*e)分析:答案为C。此题考查有向图的遍历,只要清楚邻接表的存储方式,答案很直接。6.〔12年〕假设用邻接矩阵存储有向图,矩阵中主对角线以下的元素均为零,那么关于该图拓扑序列的结构是〔〕。A.存在,且唯一B.存在,且不唯一C.存在,可能不唯一D.无法确定是否存在分析:答案为C。此题考查图的邻接矩阵存储方式和拓扑排序。7.〔12年〕如下有向带权图,假设采用迪杰斯特拉算法求原点a到其他各顶点的最短路径,得到的第一条最短路径的目标顶点是b,第二条最短路径的目标顶点是c,那么到其余各最短路径的目标顶点依次是〔〕。〔此题暂时不完整,但题目比拟简单,考察最短路径的求解过程〕A.d,e,fB.f,e,dC.D.8.〔12年〕以下关于最小生成树的说法中,正确的选项是〔〕。I.最小生成树的代价唯一II.权值最小的边一定会出现在所有的最小生成树中III.用普里姆算法从不同顶点开始得到的最小生成树一定相同IV.普里姆算法和克鲁斯卡尔算法得到的最小生成树总不相同A.仅IB.仅IIC.仅I、IIID.仅II、IV分析:此题考查最小生成树的概念和构造方法,我认为I和II正确,可是答案没有选项,因为题目是考生回忆的,是不是某个地方表达有错误?〔答案待定〕〔二〕综合题1.〔09年〕带权图〔权值非负,表示边连接的两顶点间的距离〕的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假定从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法:〔1〕设最短路径初始时仅包含初始顶点,令当前顶点u为初始顶点;〔2〕选择离u最近且尚未在最短路径中的一个顶点v,参加到最短路径中,修改当前顶点u=v;〔3〕重复步骤〔2〕,直到u是目标顶点为止。请问上述方法能否求得最短路径?假设该方法可行,请证明之;否那么,请举例说明。分析:此题考查最短路径的求解思路,只是没有直接考书上的最短路径的求解过程,而是换个角度考查对最短路径求解的理解。解答:该方法求得的路径不一定是最短路径。例如,对于以下图所示的带权图,如果按照题中的原那么,从A到C的最短路径为A->B->C,事实上其最短路径为A->D->C。2.〔11年〕有6个顶点〔顶点编号为0-5〕的有向带权图G,其邻接矩阵A为上三角矩阵,按行优先为主序保存在如下的一维数组中。46∞∞∞5∞∞∞43∞∞33要求:〔1〕写出图G的邻接矩阵A。〔2〕画出有向带权图G。〔3〕求图G的关键路径,并计算该关键路径的长度。解答:此题考查图的邻接矩阵的存储以及关键路径的求解,同时考查了特殊矩阵的压缩存储,主要是考查的图的根本知识。〔1〕图G的邻接矩阵A如下所示。〔2〕有向带权图G如以下图所示。〔3〕关键路径为0->1->2->3->5〔如以下图粗线所示〕,长度为16。四、练习题〔一〕选择题1.无向图G=(V,E),其中:V={a,b,c,d,e,f},E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},由顶点a开始对该图进行深度优先遍历,得到的顶点序列正确的选项是〔D〕。A.a,b,e,c,d,fB.a,c,f,e,b,dC.a,e,b,c,f,dD.a,e,d,f,c,b2.在有向图G的拓扑序列中,假设顶点Vi在顶点Vj之前,那么以下情形不可能出现的是〔D〕。A.G中有弧<Vi,Vj>B.G中有一条从Vi到Vj的路径C.G中没有弧<Vi,Vj>D.G中有一条从Vj到Vi的路径3.用DFS遍历一个无环有向图,并在DFS算法退栈返回时打印相应的顶点,那么输出的顶点序列是(B)。A.逆拓扑有序B.拓扑有序C.无序的4.下面哪一方法可以判断出一个有向图是否有环〔回路〕〔AB〕。A.深度优先遍历B.拓扑排序C.求最短路径D.求关键路径5.下面关于求关键路径的说法不正确的选项是〔C〕。A.求关键路径是以拓扑排序为根底的B.一个事件的最早开始时间同以该事件为尾的弧的活动最早开始时间相同C.一个事件的最迟开始时间为以该事件为尾的弧的活动最迟开始时间与该活动的持续时间的差D.关键活动一定位于关键路径上〔二〕综合题1.给定n个村庄之间的交通图,假设村庄i和j之间有道路,那么将顶点i和j用边连接,边上的Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?分析:每个顶点到其余各顶点的最短路径中最长的有n条,求这n条中最短的一条。2.设顶点a,b,c,d,e表示一个乡的5个村庄,弧上的权值表示为两村之间的距离;①求每个村庄到其它村庄的最短距离;②乡内要建立一所医院,问医院设在哪个村庄才能使各村离医院的距离较近。分析:每个顶点到其余各顶点最短路径之和最短的一个。3.有6个村子,相互间道路的距离如下图。拟合建一所小学,A处有小学生50人,B处40人,C处60人,C处20人,E处70人,F处90人,问小学应该建在哪个村子,是学生上学最为方便〔走的总路程最短〕。分析:此问题还是归为最短路径问题,考虑路径的总体状况。解答:先求出任意两点间的最短路径下表所示:ABCDEFA0267811B204569C640125D751014E862103F1195430将每行数字分别乘以各村小学生人数得下表:ABCDEFA0100300350400550B800160200240360C360240060120300D1401002002080E560420140700210F9908104503602700按列相加其总和最小的列所对应村子即是所求村子。4.某企业使用一台设备,在每年年初,企业领导部门就要决定是购置新的,还是继续使用旧的设备。假设购置新设备,就要支付一定的购置费用;假设继续使用旧设备,那么需支付一定的维修费用。现在的问题是如何制定一个几年之内的设备更新方案使得总支付费用最小。表1设备年初价格第1年第2年第3年第4年第5年1111121213表2维修费用使用年数0-11-22-33-44-5维修费用5681118分析:此问题同样可以归为最短路径问题,假定每年年初都购置新设备,可以把每年年初作为一个顶点,任意两个顶点之间的连线表示设备的使用情况,权值用使用过程中的费用表示,这样可以构造一个图,在图中求从第一年年初到第五年末的最短路径,路径上的顶点就是设备更新方案。解答:设vi表示第i年购进一台新设备,〔vi,vj〕表示设备由第i年初使用到第j年初,权值表示使用费用,得到以下图:在图中求由v1到v6的最短路径得到两条:v1-v3-v6和v1-v4-v6,因此设备的更新方案为在第1年和第3年年初更新设备或者是在第1年和第4年年初更新设备,总费用是53。5.下表给出了某工程各工序之间的优先关系和各工序所需时间〔1〕画出相应的AOE网〔2〕列出各事件的最早发生时间,最迟发生时间〔3〕找出关键路径并指明完成该工程所需最短时间.工序代号ABCDEFGHIJKLMN所需时间15105081540300151206015302040先驱工作----A,BBC,DBEG,IEIF,IH,J,KLG分析:此题考查关键路径的求解过程,求解过程略。第9章查找一、考研知识点〔一〕查找的根本概念〔二〕顺序查找法〔三〕折半查找法〔四〕二叉排序树〔五〕平衡二叉树〔六〕B-树及其根本操作、B+树的根本概念〔七〕散列〔Hash〕表〔八〕查找算法的分析及应用二、考查重点1.顺序表的查找及平均查找长度;2.有序表的查找〔折半查找〕及平均查找长度;3.二叉排序数的构造及查找效率分析;4.平衡二叉树的构造;5.B-树与B+树的定义和特点;6.哈希表的构造〔哈希函数构造方法:除留余数法,处理冲突的方法:开放定址法和链地址法〕及平均查找长度。分析:在给定的数据集合中查找某个关键值就是查找,查找的根本方法主要有顺序查找法、折半查找法、B-树、散列(Hash)表及其查找。考的比拟多的是折半查找和散列表,我们要掌握它们的根本概念和方法,例如散列表的碰撞如何解决,装载因子的概念等;二叉排序树、平衡二叉树的根本概念和应用,特别是二叉排序树的根本性质和特点要能很好地理解。另外,我们要掌握各种查找算法的分析及应用,最好能把各种查找在查找成功、查找失败的情况下的最好、平均、最坏的平均查找次数的计算方法搞清楚。这一章可以认为是线性表和二叉树在查找中的应用,利用前面所学知识来解决新的问题,重点是分析各种查找方式下的时间效率,选择题和综合题都可以出。综合题出哈希表的可能性比拟多,也有可能出算法题,这样会和第2章线性表和第6章二叉树结合来考,总之是和前面的内容有联系的,一定要掌握各种查找方法的思想并能进行分析。三、考研真题〔一〕选择题1.(09年)以下二叉排序树中,满足平衡二叉树定义的是〔〕。分析:答案是B,此题考查平衡二叉树的定义。2.〔09年〕以下表达中,不符合m阶B树定义要求的是〔〕。A.根结点最多有m棵子树B.所有叶结点都在同一层上C.各结点内关键字均升序或降序排列D.叶结点之间通过指针链接分析:答案是D,此题考查B-树的定义,题目出的不太严格,但是利用排除法可以得到答案。3.〔10年〕在以下所示的平衡二叉树中插入关键字48后得到新平衡二叉树,在新平衡二叉树中,关键字37所在节点的左、右结点中保存的关键字分别是〔〕。A.13,48B.24,48C.24,53D.24,90分析:答案是C,此题考查平衡二叉树的调整过程。4.〔10年〕一个长度为16的顺序表L,其元素按关键字有序排列,假设采用折半查找法查找一个不存在的元素,那么比拟次数最多是〔〕。A.4
B.5
C.6
D.7分析:答案是A,此题考查有序表的折半查找的思想。5.〔11年〕对于以下关
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年高纯铝光箔项目可行性研究报告
- 2024年银花蒜宝项目可行性研究报告
- 2024年网盘项目可行性研究报告
- 2024年眼镜胶粒项目可行性研究报告
- 2024年度协议管理流程与要点版B版
- 2024年云计算平台广告投放合同
- 2024版城市智能化基础设施建设借款合同
- 2024年度医疗设备供应与维护协议3篇
- 年度版权许可与转让协议(2024版)3篇
- 2024年度住宅小区物业管理与服务协议版B版
- 土地权属争议案件调查处理文书格
- 樱花栽培管理浅谈
- 《探究串并联电路中电流的规律》说课稿
- 医院回避制度
- 新概念第二册第62课
- 在全市现代生态(富硒)循环农业现场会上的讲话
- DB63∕T 954-2020 压力容器安全使用管理规范
- 第四讲(2)转炉主体设备
- 武汉大学2011年博士研究生入学考核申请表
- 《设计色彩》全套教学课件(完整版)
- 排球体育运动宣传PPT模板
评论
0/150
提交评论