数据结构期末复习要点(严蔚敏版)4

合集下载

严蔚敏数据结构-第四章 串

严蔚敏数据结构-第四章 串
S1 4 a b c d S2 2 e f T 6 a b c d e f
15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串

数据结构(严蔚敏)完整第4章ppt课件

数据结构(严蔚敏)完整第4章ppt课件

// 用T返回由S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE。
第四章 串
完整版课件
1
【课前思考】
1. "串就是线性表"的结论是否正确?
从数据结构的观点来说,串是一种特殊的 线性表;但就数据类型而言,串不是线性表。
2. 串和线性表的主要差别是什么?
希望你带着这个问题开始这一章的学习, 并能在学完这一章的内容之后能得出正确 的结论。
完整版课件
2
【学习目标】
1. 理解“串”类型定义中各基本操作的特 点,并能正确利用它们进行串的其它操作。 2. 理解串类型的各种存储表示方法。 3. 理解串匹配的各种算法。
} ADT String
完整版课件
11
StrAssign (&T, chars)
初始条件:chars 是字符串常量。 操作结果:把 chars 赋为 T 的值。
完整版课件
12
StrCopy (&T, S) 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。
完整版课件
13
DestroyString (&S)
完整版课件
37
#define MAXSTRLEN 255 // 用户可在255以内定义最大串长
typedef unsigned char Sstring [MAXSTRLEN + 1];
// 0号单元存放串的长度
完整版课件
38
或:
typedef struct { /* 串结构定 义 */
char ch[MAXLEN];
此串的串值,即字符序列即可。但在
多数非数值处理的程序中,串也以变

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解第1章绪论一、什么是数据结构数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。

二、基本概念和术语1数据数据是对客观事物的符号表示,是计算机科学中所有能输入到计算机中并能被计算机程序处理的符号的总称。

2数据元素数据元素是数据的基本单位。

3数据对象数据对象是性质相同的数据元素的集合,是数据的一个子集。

4数据结构数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

(1)数据结构的基本结构根据数据元素之间关系的不同特性,通常有下列四类基本结构:①集合。

数据元素属于“同一个集合”,并无其他复杂关系。

②线性结构。

数据元素之间存在一个对一个的关系。

③树形结构。

数据元素之间存在一个对多个的关系。

④图状结构或网状结构。

数据元素之间存在多个对多个的关系。

【注意】区分这四种基本结构可以根据元素间的对应关系。

如图1-1所示为上述四类基本结构的关系图。

图1-1 四类基本结构的关系图(2)数据结构的形式定义数据结构的形式定义为:Data_Structure=(D,S)其中:D表示数据元素的有限集,S表示D上关系的有限集。

(3)数据结构在计算机中的表示数据结构包括数据元素的表示和关系,在计算机中称为数据的物理结构(又称存储结构)。

其中,关系有两种表示方法:顺序映象和非顺序映象。

这两种表示方法对应两种存储结构:顺序存储结构和链式存储结构。

a.顺序映象:用相对位置来表示数据元素之间的逻辑关系。

b.非顺序映象:用指针表示数据元素之间的逻辑关系。

5数据类型数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

6抽象数据类型抽象数据类型(ADT)由一个值域和定义在该值域上的一组操作组成。

【注意】抽象数据类型是对数据类型架构的一种全局体现,使我们能够更加清晰地看待某一数据类型。

7多形数据类型多形数据类型是指其值的成分不确定的数据类型。

数据结构 严蔚敏C语言版 学习复习提纲

数据结构 严蔚敏C语言版 学习复习提纲

期末复习复习第一章绪论数据:计算机处理的信息总称数据项:最小单位数据元素:最基本单数据对象:元素集合数据结构:相互之间存在一种或多种特定关系的数据元素集合。

概念:数据元素之间的关系线性结构:一对逻辑结构非线性结构数据结构树:一对多图:多对多顺序存储结构链表存储结构存储结构。

索引。

基。

散列。

础知数据运算识算法描述:指令的有限有序序列有穷性确定性算法特性可行性算法输入输出时间复杂度算法分析空间复杂度、计算机算法必须具备输入、输出、可行性、确定性、有穷性5个特性。

1 2、算法分析的两个主要方面是空间复杂度和时间复杂度。

3、数据元素是数据的基本单位。

4、数据项是数据的最小单位。

5、数据结构是带结构的数据元素的集合。

6、数据的存储结构包括顺序、链接、散列和索引四种基本类型。

线性表复习第二章定义逻辑关系:前趋后继节省空间基本特点随机存取插、删效率低顺序存储结构插入基本运算删除一个数据一个指针多占空特查找费插、删效率无法查找前趋结单链运算特点:单链表+前趋指针域链表存储双向结构链表插入运算删除特点:单链表的尾结点指针循环指向附加头结点。

链表运算:联接1 、一个指向后继结点的指针、在双链表中,每个结点有两个指针域,包括一个指向前驱结点的指针 2、线性表采用顺序存储,必须占用一片连续的存储单元、线性表采用链式存储,便于进行插入和删除操作3 、线性表采用顺序存储和链式存储优缺点比较。

4 5、简单算法复习栈和队列第三章.栈的概念:在一端操作的线性表LIFO栈的特点:先进后出存储结初始化push 进栈运算算法pop出栈队列概念:在两端操作的线性表FIFO队列特点:先进先出假溢出顺序队列front=rear队空:循环队列front=(rear+1)%MAXSIZE队满:队列front∧队空:链队列rear初始化判空顺序:进队基本运算链队:出队取队首元素1栈和队列的异同点。

、、2栈和队列的基本运算出栈和出队、3 、4基本运算复习串第四章.n(≥)个字符组成的有限序列1定义:由”c……cS=”cc n231串长度、空白串、空串。

数据结构期末复习要点(严蔚敏版)

数据结构期末复习要点(严蔚敏版)

数据结构期末复习要点第一章绪论1、掌握基本概念和术语,看教材P4—P6部分内容;2、看P10—P11关于类C的语法描述,算法设计写代码时可用到;3、掌握算法的特征(5个)和要求(5个)(P13—P14),能够结合具体算法分析算法的时间复杂度和空间复杂度(比如线性表的插入、删除操作,查找、排序等操作),理解O(n)、O(1)等时间复杂度的具体含义(P14—P17)。

第二章线性表1、看教材P21—P26,掌握有关线性表顺序存储的内容:(1)顺序表的随机存取(P21计算地址的公式);(2)顺序表的表示(P22的Typedef);(3)顺序表为空、为满的判定,插入和删除操作的特征以及时间复杂度的分析(P23—P25);(4)有关顺序表的编程题。

2、看教材P27—P30,掌握有关线性表链式存储的内容:(1)单链表的表示(P28的Typedef);(2)单链表为空的判定(带头结点、不带头结点);(3)单链表插入、删除操作的特征(操作点的确定以和指针的修改)以及时间复杂度分析(P29—P30);(4)有关单链表的编程。

3、为节约时间,循环链表、双向链表以及多项式加法可以不看;4、算法设计题要求写代码,在本章体现的可能性比较大。

第三章栈和队列1、顺序栈的表示,栈操作的特点以及为空、为满的判定(P46—P47);2、栈的应用举例看个标题就足够了;3、链队列的表示以及入队、出队操作(P61—P62);4、循环队列为空、为满的判定(P65的代码中);5、离散事件模拟这节不用看;6、第四章只需要看P70就够了,掌握串的特点(元素受限),串长度、空串、串的位置、串相等几个概念即可。

第六章树和二叉树1、看教材P120,了解有关树的概念和术语;2、了解二叉树的链式存储结构(P127),掌握二叉树的性质(P123—P125),并会做题(参考课件或指导书相关内容);3、掌握二叉树的各种遍历算法(P128—P129或课件):(1)能够根据二叉树写出各种遍历序列;(2)能够由两种遍历序列(必须包含中序序列)恢复二叉树;(3)理解二叉树遍历算法的递归代码,能够读懂代码含义。

数据结构习题集答案(C语言版严蔚敏)第四章串

数据结构习题集答案(C语言版严蔚敏)第四章串

第四章串4.10void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r{StrAssign(r,''); //初始化r为空串for(i=Strlen(s);i;i--){StrAssign(c,SubString(s,i,1));StrAssign(r,Concat(r,c)); //把s的字符从后往前添加到r中}}//String_Reverse4.11void String_Subtract(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r{StrAssign(r,'');for(i=1;i<=Strlen(s);i++){StrAssign(c,SubString(s,i,1));for(j=1;j<i&&StrCompare(c,SubString(s,j,1));j++); //判断s的当前字符c是否第一次出现if(i==j){for(k=1;k<=Strlen(t)&&StrCompare(c,SubString(t,k,1));k++); //判断当前字符是否包含在t中if(k>Strlen(t)) StrAssign(r,Concat(r,c));}}//for}//String_Subtract4.12int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数{for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //注意i的取值范围if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T匹配的子串{ //分别把T的前面和后面部分保存为head和tailStrAssign(head,SubString(S,1,i-1));StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));StrAssign(S,Concat(head,V));StrAssign(S,Concat(S,tail)); //把head,V,tail连接为新串i+=Strlen(V); //当前指针跳到插入串以后n++;}//ifreturn n;}//Replace分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S='place', T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?4.13int Delete_SubString(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=Strlen(s)-Strlen(t)+1;i++)if(!StrCompare(SubString(s,i,Strlen(t)),t)){StrAssign(head,SubString(S,1,i-1));StrAssign(tail,SubString(S,i+Strlen(t),Strlen(s)-i-Strlen(t)+1));StrAssign(S,Concat(head,tail)); //把head,tail连接为新串n++;}//ifreturn n,}//Delete_SubString4.14Status NiBoLan_to_BoLan(Stringtype str,Stringtype &new)//把前缀表达式str转换为后缀式new{Initstack(s); //s的元素为Stringtype类型for(i=1;i<=Strlen(str);i++){r=SubString(str,i,1);if(r为字母) push(s,r);else{if(StackEmpty(s)) return ERROR;pop(s,a);if(StackEmpty(s)) return ERROR;pop(s,b);StrAssign(t,Concat(r,b));StrAssign(c,Concat(t,a)); //把算符r,子前缀表达式a,b连接为新子前缀表达式cpush(s,c);}}//forpop(s,new);if(!StackEmpty(s)) return ERROR;return OK;}//NiBoLan_to_BoLan分析:基本思想见书后注释3.23.请读者用此程序取代作者早些时候对3.23题给出的程序.4.15void StrAssign(Stringtype &T,char chars&#;)//用字符数组chars给串T赋值,Stringtype的定义见课本{for(i=0,T[0]=0;chars[i];T[0]++,i++) T[i+1]=chars[i];}//StrAssign4.16char StrCompare(Stringtype s,Stringtype t)//串的比较,s>t时返回正数,s=t时返回0,s<t时返回负数{for(i=1;i<=s[0]&&i<=t[0]&&s[i]==t[i];i++);if(i>s[0]&&i>t[0]) return 0;else if(i>s[0]) return -t[i];else if(i>t[0]) return s[i];else return s[i]-t[i];}//StrCompare4.17int String_Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数{for(n=0,i=1;i<=S[0]-T[0]+1;i++){for(j=i,k=1;T[k]&&S[j]==T[k];j++,k++);if(k>T[0]) //找到了与T匹配的子串:分三种情况处理{if(T[0]==V[0])for(l=1;l<=T[0];l++) //新子串长度与原子串相同时:直接替换S[i+l-1]=V[l];else if(T[0]<V[0]) //新子串长度大于原子串时:先将后部右移{for(l=S[0];l>=i+T[0];l--)S[l+V[0]-T[0]]=S[l];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}else //新子串长度小于原子串时:先将后部左移{for(l=i+V[0];l<=S[0]+V[0]-T[0];l++)S[l]=S[l-V[0]+T[0]];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}S[0]=S[0]-T[0]+V[0];i+=V[0];n++;}//if}//forreturn n;}//String_Replace4.18typedef struct {char ch;int num;} mytype;void StrAnalyze(Stringtype S)//统计串S中字符的种类和个数{mytype T[MAXSIZE]; //用结构数组T存储统计结果for(i=1;i<=S[0];i++){c=S[i];j=0;while(T[j].ch&&T[j].ch!=c) j++; //查找当前字符c是否已记录过if(T[j].ch) T[j].num++;else T[j]={c,1};}//forfor(j=0;T[j].ch;j++)printf("%c: %d\n",T[j].ch,T[j].num);}//StrAnalyze4.19void Subtract_String(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r{r[0]=0;for(i=1;i<=s[0];i++){c=s[i];for(j=1;j<i&&s[j]!=c;j++); //判断s的当前字符c是否第一次出现if(i==j){for(k=1;k<=t[0]&&t[k]!=c;k++); //判断当前字符是否包含在t中if(k>t[0]) r[++r[0]]=c;}}//for}//Subtract_String4.20int SubString_Delete(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=s[0]-t[0]+1;i++){for(j=1;j<=t[0]&&s[i+j-1]==t[i];j++);if(j>m) //找到了与t匹配的子串{for(k=i;k<=s[0]-t[0];k++) s[k]=s[k+t[0]]; //左移删除s[0]-=t[0];n++;}}//forreturn n;}//Delete_SubString4.21typedef struct{char ch;LStrNode *next;} LStrNode,*LString; //链串结构void StringAssign(LString &s,LString t)//把串t赋值给串s{s=malloc(sizeof(LStrNode));for(q=s,p=t->next;p;p=p->next){r=(LStrNode*)malloc(sizeof(LStrNode));r->ch=p->ch;q->next=r;q=r;}q->next=NULL;}//StringAssignvoid StringCopy(LString &s,LString t)//把串t复制为串s.与前一个程序的区别在于,串s业已存在.{for(p=s->next,q=t->next;p&&q;p=p->next,q=q->next){p->ch=q->ch;pre=p;}while(q){p=(LStrNode*)malloc(sizeof(LStrNode));p->ch=q->ch;pre->next=p;pre=p;}p->next=NULL;}//StringCopychar StringCompare(LString s,LString t)//串的比较,s>t时返回正数,s=t时返回0,s<t时返回负数{for(p=s->next,q=t->next;p&&q&&p->ch==q->ch;p=p->next,q=q->next);if(!p&&!q) return 0;else if(!p) return -(q->ch);else if(!q) return p->ch;else return p->ch-q->ch;}//StringCompareint StringLen(LString s)//求串s的长度(元素个数){for(i=0,p=s->next;p;p=p->next,i++);return i;}//StringLenLString * Concat(LString s,LString t)//连接串s和串t形成新串,并返回指针{p=malloc(sizeof(LStrNode));for(q=p,r=s->next;r;r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;}//for //复制串sfor(r=t->next;r;r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;}//for //复制串tq->next=NULL;return p;}//ConcatLString * Sub_String(LString s,int start,int len)//返回一个串,其值等于串s从start位置起长为len的子串{p=malloc(sizeof(LStrNode));q=p;for(r=s;start;start--,r=r->next); //找到start所对应的结点指针rfor(i=1;i<=len;i++,r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;} //复制串tq->next=NULL;return p;}//Sub_String4.22void LString_Concat(LString &t,LString &s,char c)//用块链存储结构,把串s插入到串t的字符c 之后{p=t.head;while(p&&!(i=Find_Char(p,c))) p=p->next; //查找字符cif(!p) //没找到{t.tail->next=s.head;t.tail=s.tail; //把s连接在t的后面}else{q=p->next;r=(Chunk*)malloc(sizeof(Chunk)); //将包含字符c的节点p分裂为两个for(j=0;j<i;j++) r->ch[j]='#'; //原结点p包含c及其以前的部分for(j=i;j<CHUNKSIZE;j++) //新结点r包含c以后的部分{r->ch[j]=p->ch[j];p->ch[j]='#'; //p的后半部分和r的前半部分的字符改为无效字符'#'}p->next=s.head;s.tail->next=r;r->next=q; //把串s插入到结点p和r之间}//elset.curlen+=s.curlen; //修改串长s.curlen=0;}//LString_Concatint Find_Char(Chunk *p,char c)//在某个块中查找字符c,如找到则返回位置是第几个字符,如没找到则返回0{for(i=0;i<CHUNKSIZE&&p->ch[i]!=c;i++);if(i==CHUNKSIZE) return 0;else return i+1;}//Find_Char4.23int LString_Palindrome(LString L)//判断以块链结构存储的串L是否为回文序列,是则返回1,否则返回0{InitStack(S);p=S.head;i=0;k=1; //i指示元素在块中的下标,k指示元素在整个序列中的序号(从1开始) for(k=1;k<=S.curlen;k++){if(k<=S.curlen/2) Push(S,p->ch[i]); //将前半段的字符入串else if(k>(S.curlen+1)/2){Pop(S,c); //将后半段的字符与栈中的元素相匹配if(p->ch[i]!=c) return 0; //失配}if(++i==CHUNKSIZE) //转到下一个元素,当为块中最后一个元素时,转到下一块{p=p->next;i=0;}}//forreturn 1; //成功匹配}//LString_Palindrome4.24void HString_Concat(HString s1,HString s2,HString &t)//将堆结构表示的串s1和s2连接为新串t{if(t.ch) free(t.ch);t.ch=malloc((s1.length+s2.length)*sizeof(char));for(i=1;i<=s1.length;i++) t.ch[i-1]=s1.ch[i-1];for(j=1;j<=s2.length;j++,i++) t.ch[i-1]=s2.ch[j-1];t.length=s1.length+s2.length;}//HString_Concat4.25int HString_Replace(HString &S,HString T,HString V)//堆结构串上的置换操作,返回置换次数{for(n=0,i=0;i<=S.length-T.length;i++){for(j=i,k=0;k<T.length&&S.ch[j]==T.ch[k];j++,k++);if(k==T.length) //找到了与T匹配的子串:分三种情况处理{if(T.length==V.length)for(l=1;l<=T.length;l++) //新子串长度与原子串相同时:直接替换S.ch[i+l-1]=V.ch[l-1];else if(T.length<V.length) //新子串长度大于原子串时:先将后部右移{for(l=S.length-1;l>=i+T.length;l--)S.ch[l+V.length-T.length]=S.ch[l];for(l=0;l<V.length;l++)S[i+l]=V[l];}else //新子串长度小于原子串时:先将后部左移{for(l=i+V.length;l<S.length+V.length-T.length;l++)S.ch[l]=S.ch[l-V.length+T.length];for(l=0;l<V.length;l++)S[i+l]=V[l];}S.length+=V.length-T.length;i+=V.length;n++;}//if}//forreturn n;}//HString_Replace4.26Status HString_Insert(HString &S,int pos,HString T)//把T插入堆结构表示的串S的第pos个字符之前{if(pos<1) return ERROR;if(pos>S.length) pos=S.length+1;//当插入位置大于串长时,看作添加在串尾S.ch=realloc(S.ch,(S.length+T.length)*sizeof(char));for(i=S.length-1;i>=pos-1;i--)S.ch[i+T.length]=S.ch[i]; //后移为插入字符串让出位置for(i=0;i<T.length;i++)S.ch[pos+i-1]=T.ch[pos]; //插入串TS.length+=T.length;return OK;}//HString_Insert4.27int Index_New(Stringtype s,Stringtype t)//改进的定位算法{i=1;j=1;while(i<=s[0]&&j<=t[0]){if((j!=1&&s[i]==t[j])||(j==1&&s[i]==t[j]&&s[i+t[0]-1]==t[t[0]])){ //当j==1即匹配模式串的第一个字符时,需同时匹配其最后一个i=i+j-2;j=1;}else{i++;j++;}}//whileif(j>t[0]) return i-t[0];}//Index_New4.28void LGet_next(LString &T)//链串上的get_next算法{p=T->succ;p->next=T;q=T;while(p->succ){if(q==T||p->data==q->data){p=p->succ;q=q->succ;p->next=q;}else q=q->next;}//while}//LGet_nextLStrNode * LIndex_KMP(LString S,LString T,LStrNode *pos)//链串上的KMP匹配算法,返回值为匹配的子串首指针{p=pos;q=T->succ;while(p&&q){if(q==T||p->chdata==q->chdata){p=p->succ;q=q->succ;}else q=q->next;}//whileif(!q){for(i=1;i<=Strlen(T);i++)p=p->next;return p;} //发现匹配后,要往回找子串的头return NULL;}//LIndex_KMP4.30void Get_LRepSub(Stringtype S)//求S的最长重复子串的位置和长度{for(maxlen=0,i=1;i<S[0];i++)//串S2向右移i格{for(k=0,j=1;j<=S[0]-i;j++)//j为串S2的当前指针,此时串S1的当前指针为i+j,两指针同步移动{if(S[j]==S[j+i]) k++; //用k记录连续相同的字符数else k=0; //失配时k归零if(k>maxlen) //发现了比以前发现的更长的重复子串{lrs1=j-k+1;lrs2=mrs1+i;maxlen=k; //作记录}}//forif(maxlen){printf("Longest Repeating Substring length:%d\n",maxlen);printf("Position1:%d Position 2:%d\n",lrs1,lrs2);}else printf("No Repeating Substring found!\n");}//Get_LRepSub分析:i代表"错位值".本算法的思想是,依次把串S的一个副本S2向右错位平移1格,2格,3格,...与自身S1相匹配,如果存在最长重复子串,则必然能在此过程中被发现.用变量lrs1,lrs2,maxlen 来记录已发现的最长重复子串第一次出现位置,第二次出现位置和长度.题目中未说明"重复子串"是否允许有重叠部分,本算法假定允许.如不允许,只需在第二个for语句的循环条件中加上k<=i即可.本算法时间复杂度为O(Strlen(S)^2).4.31void Get_LPubSub(Stringtype S,Stringtype T)//求串S和串T的最长公共子串位置和长度{if(S[0]>=T[0]){StrAssign(A,S);StrAssign(B,T);}else{StrAssign(A,T);StrAssign(B,S);} //为简化设计,令S和T中较长的那个为A,较短的那个为Bfor(maxlen=0,i=1-B[0];i<A[0];i++){if(i<0) //i为B相对于A的错位值,向左为负,左端对齐为0,向右为正{jmin=1;jmax=i+B[0];}//B有一部分在A左端的左边else if(i>A[0]-B[0]){jmin=i;jmax=A[0];}//B有一部分在A右端的右边else{jmin=i;jmax=i+B[0];}//B在A左右两端之间.//以上是根据A和B不同的相对位置确定A上需要匹配的区间(与B重合的区间)的端点:jmin,jmax.for(k=0,j=jmin;j<=jmax;j++){if(A[j]==B[j-i]) k++;else k=0;if(k>maxlen){lps1=j-k+1;lps2=j-i-k+1;maxlen=k;}}//for}//forif(maxlen){if(S[0]>=T[0]){lpsS=lps1;lpsT=lps2;}else{lpsS=lps2;lpsT=lps1;} //将A,B上的位置映射回S,T上的位置printf("Longest Public Substring length:%d\n",maxlen);printf("Position in S:%d Position in T:%d\n",lpsS,lpsT);}//ifelse printf("No Repeating Substring found!\n");}//Get_LPubSub分析:本题基本思路与上题同.唯一的区别是,由于A,B互不相同,因此B不仅要向右错位,而且还要向左错位,以保证不漏掉一些情况.当B相对于A的位置不同时,需要匹配的区间的计算公式也各不相同,请读者自己画图以帮助理解.本算法的时间复杂度是o(strlrn(s)*strlen(t))。

数据结构(C)严蔚敏——4

数据结构(C)严蔚敏——4
m*n-1
Data Structure 2013-7-10
a0,n-1 a1,n-1
…….. am-1 ,n-1
Page 9
5.3 矩阵的压缩存储
4 8 0 0 0
7 2 3 4
2 7 1 9
3 1 7 8
4 9 8 6
7 2 3 4
重点和难点

重点是学习数组类型的定义及其存储表示。
知识点

数组的类型定义、数组的存储表示、特殊矩阵的压缩存储表示方法、 随机稀疏矩阵的压缩存储表示方法。
Data Structure
2013-7-10
Page 1
5.1 数组的定义
数组是线性表的推广

数组可以看成是一种特殊的线性表,即线性表中数据元素本身也 是一个线性表。 a 01 a 02 ... a 0,n-1 a 00 a a11 a12 ... a1,n-1 列向量 10 A m×n = ... ... ... ... ... a m-1,0 a m-1,1 a m-1,2 ... a m-1,n-1
对称矩阵
n阶矩阵;
aij=aji
Data Structure
1i,j n
2013-7-10 Page 11
特殊矩阵

值相同的元素或者零元素在矩阵中的分布有一定规律。
7 2 3 4
0 7 1 9
0 0 7 8
0 0 0 6
三角矩阵
n阶矩阵; 下(上)三角矩阵:矩阵的上(下)三角(不 包括对角线)中的元均为常数c或零。
a 01 a 02 a11 a12 ... ... a m-1, a m-1,2 1

数据结构 严蔚敏 期末复习题

数据结构 严蔚敏 期末复习题

一.是非题(共分,每题分)1. 数据结构可用三元式表示(D,S,P)。

其中:D是数据对象,S是D上的关系,P是对D的基本操作集。

(f)2 简单地说,数据结构是带有结构的数据元素的集合。

(t)3 判断带头结点的非空循环单链表(头指针为L)中指针p所指结点是最后一个元素结点的条件是:p->next==L。

(t)4线性表的链式存储结构具有可直接存取表中任一元素的优点。

(f)5 线性表的顺序存储结构优于链式存储结构。

(f)6. 在单链表P指针所指结点之后插入S结点的操作是:P->next= S ; S-> next = P->next;。

(f)7 对于插入、删除而言,线性表的链式存储优于顺序存储。

(t)8. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。

(f)9. 栈和队列是操作上受限制的线性表。

(t)10. 栈和队列是与线性表完全不同的一种数据结构。

(f)11. 队列是一种操作受限的线性表,凡对数据元素的操作仅限一端进行。

(f)12. 栈和队列也是线性表。

如果需要,可对它们中的任一元素进行操作。

(f)13. 栈是限定仅在表头进行插入和表尾进行删除运算的线性表。

(f)14. 二叉树中每个结点有两个子结点,而对一般的树,则无此限制,所以,二叉树是树的特殊情形。

(f)15 二叉树是一棵结点的度最大为二的树。

(f)16 赫夫曼树中结点个数一定是奇数。

(t)17 在二叉树的中序遍历序列中,任意一个结点均处在其左孩子结点的后面。

(t)18 假设B是一棵树,B′是对应的二叉树。

则B的后根遍历相当于B′的后序遍历。

(f)19. 通常,二叉树的第i层上有2i-1个结点。

(f)20. 中序线索二叉树的优点是便于在中序下查找直接前驱结点和直接后继结点。

(t)21 二叉树的先序遍历序列中,任意一个结点均处在其孩子结点的前面。

(t)22 由树结点的先根序列和后根序列可以唯一地确定一棵树。

(t)23 邻接多重表可以用以表示无向图,也可用以表示有向图。

《数据结构(C语言版 第2版)》(严蔚敏 著)第四章练习题答案

《数据结构(C语言版 第2版)》(严蔚敏 著)第四章练习题答案

《数据结构(C语言版第2版)》(严蔚敏著)第四章练习题答案第4章串、数组和广义表1.选择题(1)串是一种特殊的线性表,其特殊性体现在()。

A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符若答案:B(2)串下面关于串的的叙述中,()是不正确的?A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储答案:B解释:空格常常是串的字符集合中的一个元素,有一个或多个空格组成的串成为空格串,零个字符的串成为空串,其长度为零。

(3)串“ababaaababaa”的next数组为()。

A.012345678999 B.012121111212 C.011234223456 D.0123012322345答案:C(4)串“ababaabab”的nextval为()。

A.010104101B.010102101 C.010100011 D.010101011答案:A(5)串的长度是指()。

A.串中所含不同字母的个数B.串中所含字符的个数C.串中所含不同字符的个数D.串中所含非空格字符的个数答案:B解释:串中字符的数目称为串的长度。

(6)假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。

A.808 B.818 C.1010 D.1020答案:B解释:以行序为主,则LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818。

(7)设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为()。

A.BA+141 B.BA+180 C.BA+222 D.BA+225答案:B解释:以列序为主,则LOC[5,8]=[(8-1)*8+(5-1)]*3+BA=BA+180。

严蔚敏数据结构复习整理完整版

严蔚敏数据结构复习整理完整版

1.复杂性分析对各种操作的时间复杂性的分析。

主要是链表,树,排序等简单一些的分析。

分析的时候,从简单的入手,学会方法。

后续的各种豆可能让你分析时间复杂度。

线性链表(顺序表和单链表)链表循环链表双向链表2.线性结构队列(循环队列)栈链表主要操作:找某一个元素,插入一个(在哪个位置增加),删除一个(在哪个位置删除)。

栈:查找,插入(位置固定),删除(位置固定)队列:查找,插入(位置固定),删除(位置固定)顺序表(可以视为一个数组)单链表:(删除)(插入)倒置:(查找)循环链表双向链表栈:(插入删除查找)队列(插入删除查找)循环队列的实现,并不是像上面的图那样,实现了一个循环的样子。

3.二叉树基本概念二叉树是每个节点最多有两个子树的有序树。

二叉树常被用于实现二叉查找树和二叉堆。

值得注意的是,二叉树不是树的特殊情形。

二叉树是每个结点最多有两个子树的有序树。

通常根的子树被称作“左子树”(left subtree)和“右子树”(right subtree)。

二叉树常被用作二叉查找树和二叉堆或是二叉排序树。

二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

二叉树不是树的一种特殊情形,尽管其与树有许多相似之处,但树和二叉树有两个主要差别:1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;2。

树的结点无左、右之分,而二叉树的结点有左、右之分。

二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:(1)空二叉树——如图(a);(2)只有一个根结点的二叉树——如图(b);(3)只有左子树——如图(c);(4)只有右子树-—如图(d);(5)完全二叉树-—如图(e)注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形性质(1)在非空二叉树中,第i层的结点总数不超过, i〉=1;(2)深度为h的二叉树最多有2^h—1个结点(h>=1),最少有h个结点;(3)对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;(4)具有n个结点的完全二叉树的深度为(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系: 若I为结点编号则如果I>1,则其父结点的编号为I/2;如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;如果2*I+1〈=N,则其右儿子的结点编号为2*I+1;若2*I+1〉N,则无右儿子。

数据结构-(严蔚敏C语言版)-学习、复习提纲

数据结构-(严蔚敏C语言版)-学习、复习提纲

数据结构-(严蔚敏C语⾔版)-学习、复习提纲期末复习第⼀章绪论复习1、计算机算法必须具备输⼊、输出、可⾏性、确定性、有穷性5个特性。

2、算法分析的两个主要⽅⾯是空间复杂度和时间复杂度。

3、数据元素是数据的基本单位。

数据结算法数据:计算机处理的信息总称数据项:最⼩单位数据元素:最基本单概念:数据元素之间的关系线性结构:⼀对⼀⾮线性结构树:⼀对多图:多对多顺序存储结构链表存储结构算法描述:指令的有限有有穷性确定性可⾏性时间复杂4、数据项是数据的最⼩单位。

5、数据结构是带结构的数据元素的集合。

6、数据的存储结构包括顺序、链接、散列和索引四种基本类型。

第⼆章线性表复习1、在双链表中,每个结点有两个指针域,包括⼀个指向前驱结点的指针、⼀个指向后继结点的指针2、线性表采⽤顺序存储,必须占⽤⼀⽚连续的存储单元定义节省空间随机存取插⼊3、线性表采⽤链式存储,便于进⾏插⼊和删除操作4、线性表采⽤顺序存储和链式存储优缺点⽐较。

5、简单算法第三章栈和队列复习1、栈和队列的异同点。

2、栈和队列的基本运算 3、出栈和出队 4、基本运算存储结栈的概念:在⼀端操作的线性运算算栈的特点:先进后出初始化进栈顺序队队列概念:在两端操作的线性假溢出链队列队列特点:先进先出基本运顺序:队空:队满:(1)队初始化判空进队第四章串复习第五章数组和⼴义表复习定义:由n(≥1)个字符组成的有限序列紧缩格式⾮紧缩格式以字节为单位的存储基本运(s) 串长度 (s12) 联接 (s12) ⽐较模式匹失败链接值匹配算法单字符链表串串变量的存储映像:串名、串值对应关系表顺序存储压缩存储⾏优先顺序存放列优先顺序存放稀疏矩应⽤表达式⼴义表定义:n(≥0)个元素的有限序表头:(A)= a 1 概念:长度、深度、原⼦、⼦表尾:(A)=(a23,…)表结特殊矩对称矩阵三⾓矩阵三元组存储:三元组原⼦结第六章树复习1、三个结点可以组成2种不同形态的树。

2、⼀个稀疏矩阵*n 采⽤三元组形式表⽰,若完成了其的转置运算要经过哪⼏步:⼆叉树概定义:递归定义,不为空双亲、孩⼦、叶⼦、兄弟、存储⽅顺序:满、完全⼆⼆叉树已知先根、中根序列画树;先根线索线索线索树的画法树、森林与⼆叉树的相互树、森⼆叉排树的应哈夫曼左中哈夫曼树的矩阵的⾏、列数值互换、矩阵元素所在⾏列值互换、元素在矩阵中排列的位置)重新排列3、若⼆叉树中每⼀层结点的个数都达到了最⼤,则称为⼀棵满⼆叉树。

严蔚敏数据结构(C语言版)知识点总结笔记课后答案

严蔚敏数据结构(C语言版)知识点总结笔记课后答案

第1章绪论1.1复习笔记一、数据结构的定义数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。

二、基本概念和术语数据数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称,它是计算机程序加工的“原料”。

2.数据元素数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

3.数据对象数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。

4.数据结构数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。

(1)数据结构的基本结构根据数据元素之间关系的不同特性,通常有下列四类基本结构:① 集合。

数据元素之间除了“同属于一个集合”的关系外,别无其它关系。

② 线性结构。

数据元素之间存在一个对一个的关系。

③ 树形结构。

数据元素之间存在一个对多个的关系。

④ 图状结构或网状结构。

数据元素之间存在多个对多个的关系。

如图1-1所示为上述四类基本结构的关系图。

图1-1 四类基本结构的关系图(2)数据结构的形式定义数据结构的形式定义为:数据结构是一个二元组Data_Structure==(D,S)其中:D表示数据元素的有限集,S表示D上关系的有限集。

(3)数据结构在计算机中的表示数据结构在计算机中的表示(又称映象)称为数据的物理结构,又称存储结构。

它包括数据元素的表示和关系的表示。

① 元素的表示。

计算机数据元素用一个由若干位组合起来形成的一个位串表示。

② 关系的表示。

计算机中数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象。

并由这两种不同的表示方法得到两种不同的存储结构:顺序存储结构和链式存储结构。

a.顺序映象的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。

b.非顺序映象的特点是借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解
目录
第 1 章 绪 论............................................................................................................................................... 4 1.1 复习笔记 .......................................................................................................................................... 4 1.2 强化习题详解 ................................................................................................................................... 7 1.3 考研真题与典型题详解 ................................................................................................................... 22
第 4 章 串................................................................................................................................................... 114 4.1 复习笔记 ....................................................................................................................................... 114 4.2 强化习题详解 ................................................................................................................................ 118 4.3 考研真题与典型题详解 ..................................................................................................................138

严蔚敏数据结构复习整理完整版

严蔚敏数据结构复习整理完整版

严蔚敏数据结构复习整理完整版数据结构是计算机科学中的重要基础课程,是指数据组织、存储和处理的方式。

严蔚敏教授是中国计算机教育领域的知名专家,他的《数据结构》一书被广泛使用于计算机相关专业的教学中。

下面是严蔚敏数据结构复习整理的完整版,总结了数据结构的基本概念、常见数据结构的特点和使用场景,以及一些重要的算法思想和应用。

一、数据结构的基本概念1.数据:数据是计算机能识别、处理的符号集合,可以是数字、文字、图像等。

2.数据元素:数据中的一个个基本单位,也称为记录。

3.数据项:数据元素中的一个个最小单位,是不可分割的数据单位。

二、常见数据结构1.数组:一组具有相同数据类型的元素的集合,可以通过下标来访问和操作。

2.链表:一组通过指针连接起来的数据元素的集合,可以分为单向链表和双向链表。

3.栈:一种特殊的线性表,只能在表尾进行插入和删除操作,遵循先进后出的原则。

4.队列:一种特殊的线性表,只能在表尾进行插入操作,在表头进行删除操作,遵循先进先出的原则。

5.树:一种非线性的数据结构,具有层次结构的特点,包括二叉树、二叉树、平衡树等。

6.图:一种非线性的数据结构,由顶点和边组成,包括有向图和无向图。

7.堆:一种完全二叉树的结构,用于实现优先队列等需要快速找到最值的场景。

8.哈希表:一种以键值对形式存储数据的数据结构,通过哈希函数将键映射到对应的位置,常用于快速查找场景。

三、常用算法和应用1.线性查找和二分查找:分别用于在无序数组和有序数组中查找指定的元素。

2.冒泡排序和快速排序:分别用于对数组进行升序排序,冒泡排序的时间复杂度较高,快速排序的时间复杂度较低。

3.广度优先和深度优先:分别用于在图中特定的路径,广度优先适用于找最短路径,深度优先适用于找所有路径。

4.迪杰斯特拉算法和贪心算法:迪杰斯特拉算法用于计算图中最短路径,贪心算法用于求解最优问题时,每一步都选择当前最好的选择。

5.动态规划算法:一种分阶段求解的问题求解方法,适用于具有最优子结构的问题,将问题分解为子问题,并逐步求解。

(完整word版)数据结构老师给的复习要点(严蔚敏版)

(完整word版)数据结构老师给的复习要点(严蔚敏版)

第一章1. 怎样理解“算法+数据结构=程序”这个公式?举例说明。

算法是语句序列解决特定问题的固有程序片段。

数据结构是确定数据间的关系。

从具体问题抽象出一个合适的数学模型、然后设计一个解决此数学模型的算法,最后编写出程序。

寻求数学模型的是指就是数据结构要完成的工作。

参看书p1前两段的描述。

2. 数据结构的概念,它包含哪三方面的内容?数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间饿关系和操作的学科。

参看书p3包含三方面的内容:1、数据之间的逻辑关系2、数据在计算机中的存储方式3、在数据上定义的运算的集合。

3. 数据、数据元素、数据项的基本概念。

举例说明数据元素和数据项的联系与区别。

数据:描述客观事物的数字、字符以及所有能直接输入到计算机中并被计算机程序处理的符号的集合。

数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑或处理。

数据项:数据项是具有独立含义的最小标识单位,是数据元的一个具体值,是数据记录中最基本的、不可分的有名数据单位。

例1:class A{int c[123];int i;};class B{A a;}B b;b.a是数据项,B是数据元素例2:一本书的数目信息为一个数据元素,而数目信息中每一项(如书名、作者名等)为一个数据项4. 从逻辑结构来看,数据结构有哪四种基本结构,各自的特点是什么?1、集合(数据元素之间同属于一个集合,再无其他关系)2、线性结构(数据元素之间存在一对一的关系)3、树形结构(数据元素之间一对多的关系)4、图状结构或网状结构(数据元素之间多对多的关系)5. 从物理结构来看,数据结构有哪两种基本结构,各自的特点是什么?1、顺序存储结构特点:借助元素在存储器中的相应位置来表示数据元素之间的逻辑关系。

2、链式存储结构特定:借助元素在存储地址的指针表示数据元素之间的逻辑关系。

6. 算法的5个特征,4个评价标准是什么?特征:有穷性、确定性、可行性、输入、输出。

严蔚敏-数据结构课后习题及复习资料解析

严蔚敏-数据结构课后习题及复习资料解析

第一章绪论一、选择题1.组成数据的基本单位是()(A)数据项(B)数据类型(C)数据元素(D)数据变量2.数据结构是研究数据的()以及它们之间的相互关系。

(A)理想结构,物理结构(B)理想结构,抽象结构(C)物理结构,逻辑结构(D)抽象结构,逻辑结构3.在数据结构中,从逻辑上可以把数据结构分成()(A)动态结构和静态结构(B)紧凑结构和非紧凑结构(C)线性结构和非线性结构(D)内部结构和外部结构4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。

① (A)数据元素(B)计算方法(C)逻辑存储(D)数据映像② (A)结构(B)关系(C)运算(D)算法5.算法分析的目的是()。

(A)找出数据结构的合理性(B)研究算法中的输入和输出的关系(C)分析算法的效率以求改进(D)分析算法的易懂性和文档性6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。

① (A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法② (A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性(C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性二、判断题1.数据的机内表示称为数据的存储结构。

()2.算法就是程序。

()3.数据元素是数据的最小单位。

()4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。

()5.算法的时间复杂度取决于问题的规模和待处理数据的初态。

()三、填空题1.数据逻辑结构包括、、和四种类型,其中树形结构和图形结构合称为。

2.在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。

3.在树形结构中,树根结点没有结点,其余每个结点有且只有个前驱结点;叶子结点没有结点,其余每个结点的后续结点可以。

4.在图形结构中,每个结点的前驱结点数和后续结点数可以。

5.线性结构中元素之间存在关系,树形结构中元素之间存在关系,图形结构中元素之间存在关系。

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解

严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解

读书笔记
好书啊,严蔚敏数据结构的题集是没有这么详细的答案哇!这书全有!。 重点内容都有介绍,很赞的就是习题部分的解答。
目录分析
1.2强化习题详解
1.1复习笔记
1.3考研真题与典 型题详解
2.2强化习题详解
2.1复习笔记
2.3考研真题与典 型题详解
3.2强化习题详解
3.1复习笔记
3.3考研真题与典 型题详解
4.2强化习题详解
4.1复习笔记
4.3考研真题与典 型题详解
考研真题与典 型题详解
6.2强化习题详解
6.1复习笔记
6.3考研真题与典 型题详解
7.2强化习题详解
7.1复习笔记
7.3考研真题与典 型题详解
9.2强化习题详解
9.1复习笔记
9.3考研真题与典 型题详解
10.2强化习题详解
10.1复习笔记
10.3考研真题与典 型题详解
11.2强化习题详解
11.1复习笔记
11.3考研真题与典 型题详解
作者介绍
精彩摘录
这是《严蔚敏《数据结构》(C语言版)笔记和习题(含考研真题)详解》的读书笔记模板,可以替换为自己 的精彩内容摘录。
谢谢观看
严蔚敏《数据结构》(C语言版)笔 记和习题(含考研真题)详解
读书笔记模板
01 思维导图
03 读书笔记 05 作者介绍
目录
02 内容摘要 04 目录分析 06 精彩摘录
思维导图
本书关键字分析思维导图
习题
数据结构
笔记
名校
复习
重难点
第章
笔记
教材
真题 真题
存储管理
语言版
典型
二叉树

严蔚敏《数据结构》复习笔记及习题 (串)【圣才出品】

严蔚敏《数据结构》复习笔记及习题 (串)【圣才出品】

第4章串4.1 复习笔记一、串及其操作1.串的逻辑结构定义串(或字符串)是由零个或多个字符组成的有限序列。

一般记为S='a1a2…a n' (n≥0)其中,S是串的名,用单引号括起来的字符序列是串的值;a i(1≤i≤n)可以是字母、数字或其他字符;n称为串的长度,零个字符的串称为空串。

两个串相等:当且仅当这两个串的长度相等并且对应位置的字符全部相同。

2.串的基本操作(1)ASSIGN(s,t):赋值操作。

(2)EQUAL(s,t):判等函数。

(3)LENGTH(s):求串长函数。

(4)CONCAT(s,t):连接函数。

(5)SUBSTR(s,start,len):求子串函数。

(6)INDEX(s,t):定位函数。

(7)REPLACE(s,t,v):置换操作。

(8)INSERT(s,pos,t):插入操作。

(9)DELETE(s,pos,len):删除操作。

二、串的存储结构1.静态存储结构串值的访问通过串名的存储映象进行,叫做串的静态存储结构。

和线性表的顺序存储结构一样,采用一组地址连续的存储单元存储串中的字符序列。

串的实际长度是在预定义分配的空间内随意变动的。

一般有两种方式来表示串的实际长度:①将实际长度存储在数组下标为0的位置;②串的末尾用一个结束标记字符标记串的结束,比如C语言中以“\0”标记串的结束。

2.动态存储结构(1)块链存储结构和线性表的链式存储结构相类似,也可采用链表方式存储串值,但由于串中每个数据元素是一个字符,则在存储串的时候每个结点可以存放一个字符,也可以存放多个字符(避免空间的浪费),这种方式称为串的块链存储结构。

例如,图4-1(a)是结点大小为4的链表,图4-1(b)是结点大小为1的链表。

当结点大于1时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上“#”或其他的非串值字符。

图4-1 串值的链表存储方式(2)堆结构串的堆结构仍以一组地址连续的存储单元存放字符序列,但它们的存储空间是在程序执行过程中动态分配的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构期末复习要点
第一章绪论
1、掌握基本概念和术语,看教材P4—P6部分内容;
2、看P10—P11关于类C的语法描述,算法设计写代码时可用到;
3、掌握算法的特征(5个)和要求(5个)(P13—P14),能够结合具体算法分析算法的时间复杂度和空间复杂度(比如线性表的插入、删除操作,查找、排序等操作),理解O(n)、O(1)等时间复杂度的具体含义(P14—P17)。

第二章线性表
1、看教材P21—P26,掌握有关线性表顺序存储的内容:
(1)顺序表的随机存取(P21计算地址的公式);
(2)顺序表的表示(P22的Typedef);
(3)顺序表为空、为满的判定,插入和删除操作的特征以及时间复杂度的分析(P23—P25);
(4)有关顺序表的编程题。

2、看教材P27—P30,掌握有关线性表链式存储的内容:
(1)单链表的表示(P28的Typedef);
(2)单链表为空的判定(带头结点、不带头结点);
(3)单链表插入、删除操作的特征(操作点的确定以和指针的修改)以及时间复杂度分析(P29—P30);(4)有关单链表的编程。

3、为节约时间,循环链表、双向链表以及多项式加法可以不看;
4、算法设计题要求写代码,在本章体现的可能性比较大。

第三章栈和队列
1、顺序栈的表示,栈操作的特点以及为空、为满的判定(P46—P47);
2、栈的应用举例看个标题就足够了;
3、链队列的表示以及入队、出队操作(P61—P62);
4、循环队列为空、为满的判定(P65的代码中);
5、离散事件模拟这节不用看;
6、第四章只需要看P70就够了,掌握串的特点(元素受限),串长度、空串、串的位置、串相等几个概念即可。

第六章树和二叉树
1、看教材P120,了解有关树的概念和术语;
2、了解二叉树的链式存储结构(P127),掌握二叉树的性质(P123—P125),并会做题(参考课件或指导书相关内容);
3、掌握二叉树的各种遍历算法(P128—P129或课件):
(1)能够根据二叉树写出各种遍历序列;
(2)能够由两种遍历序列(必须包含中序序列)恢复二叉树;
(3)理解二叉树遍历算法的递归代码,能够读懂代码含义。

4、线索二叉树、树和森林的遍历略看即可,涉及不多;树与等价问题没讲不用看;
5、掌握Huffman树的相关内容(P144—P148):
(1)给定字符及频率构造Huffman树,设计Huffman编码;
(2)掌握前缀编码的概念,能判定一组编码是否前缀编码。

6、回溯法和树的计数这两节不用看;
7、注意:要能够分析递归程序的执行结果(不局限于二叉树的递归算法)。

第七章图
1、看教材P157—P159,熟悉图的定义和术语;
2、看教材P161—P164,掌握图的邻接矩阵和邻接表两种存储结构:
(1)掌握存储结构的特点(是否对阵、求边数、求结点度等);
(2)能够画出给定图的存储结构,或者根据存储结构画出图的逻辑结构;
(3)能够写出在两种存储结构上进行深度优先和广度优先遍历的序列;
(4)十字链表和邻接多重表不用看了。

3、看教材P173—P176,掌握构造最小生成树的Prim算法和Kruskal算法,能够按照考研指导书P199和P201所示的步骤构造最小生成树;
4、对于拓扑排序算法和关键路径算法,前者可能要求写出拓扑排序序列,后者无法以大题考查,略看即可;
5、知道求最短路径的两个算法的名称和能解决的问题即可,不必太费时间。

第九章查找
1、理解顺序查找的过程,分析索引顺序查找的性能,不用看静态树表查找;
2、看教材P218—P221,掌握折半查找算法:
(1)折半查找的前提;
(2)折半查找的过程;
(3)折半查找的判定树;
(4)折半查找的ASL。

3、掌握二叉排序树算法:
(1)BST的定义和构造(P227—P229);
(2)BST的查找分析(P231);
(3)平衡二叉树(A VL)的定义和BBST的判定(P233)。

4、了解B-树(P238—P239)和B+树(P246)的定义,不看键树;
5、掌握哈希表的构造和哈希查找的过程:
(1)哈希函数掌握“除留余数法”(P255);
(2)冲突处理函数掌握“开放定址法”中的线性探测再散列和二次探测再散列(P257),能够将给定的关键字填入哈希表的适当位置;
(3)分析查找过程中关键字的比较次数。

第十章内部排序
1、看教材P263—P264,掌握学习排序算法的总体思路:
(1)算法思想(排序原则和排序过程);
(2)算法性能(时间和空间复杂度);
(3)算法稳定性(取决于算法本身);
(4)算法的特殊性(适用前提、排序结果);
(5)注意横向分析比较各种排序算法。

2、掌握直接插入排序的算法思想(读懂代码、模拟流程),能够进行性能分析(P265—P266);
3、折半插入排序、2-路插入排序、表插入排序和希尔排序略看即可;
4、能够模拟起泡排序的执行过程,分析起泡排序的时间性能,把握起泡排序的结果特征(P273);
5、看教材P273—P276,掌握快速排序的基本思想(选取枢轴,逆序交换,递归完成),分析快速排序的时间性能(最好、最坏),把握快速排序的适用场合(何时最佳),调整快速排序的执行环境(三者取中法);
6、理解简单选择排序和树形选择排序的基本思想,重点掌握堆排序算法(P277——P282):
(1)堆的定义(小顶堆和大顶堆)和堆排序(初始建堆+重建堆);
(2)能够用完全二叉树的形式完成初始建堆和重建堆(筛选);
(3)明确何时创建什么样的堆(降序创建小顶堆,升序创建大顶堆);
(4)分析堆排序的特点和性能。

7、理解归并排序的特点和性能(稳定的、先进的)(P283—P284);
8、了解基数排序的基本思想(以“分配”和“收集”代替关键字的比较),分析基数排序的性能(P286—P287)。

相关文档
最新文档