《数据结构》知识点总结Word文档下载推荐.docx
《《数据结构》知识点总结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数据结构》知识点总结Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
数据运算。
对数据的操作。
定义在逻辑结构上,每种逻辑结构都有一个运算集合。
常用的有:
检索、插入、删除、更新、排序。
数据类型:
是一个值的集合以及在这些值上定义的一组操作的总称。
结构类型:
由用户借助于描述机制定义,是导出类型。
抽象数据类型ADT:
是抽象数据的组织和与之的操作。
相当于在概念层上描述问题。
·
优点是将数据和操作封装在一起实现了信息隐藏。
程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。
算法取决于数据结构。
算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。
评价算法的好坏的因素:
算法是正确的;
执行算法的时间;
执行算法的存储空间(主要是辅助存储空间);
算法易于理解、编码、调试。
时间复杂度:
是某个算法的时间耗费,它是该算法所求解问题规模n的函数。
渐近时间复杂度:
是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。
算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。
时间复杂度按数量级递增排列依次为:
常数阶O
(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。
空间复杂度:
是某个算法的空间耗费,它是该算法所求解问题规模n的函数。
算法的时间复杂度和空间复杂度合称算法复杂度。
第二章线性表
线性表是由n≥0个数据元素组成的有限序列。
n=0是空表;
非空表,只能有一个开始结点,有且只能有一个终端结点。
线性表上定义的基本运算:
构造空表:
Initlist(L)
求表长:
Listlength(L)
取结点:
GetNode(L,i)
查找:
LocateNode(L,x)
插入:
InsertList(L,x,i)
删除:
Delete(L,i)
顺序表是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。
在存储单元中的各元素的物理位置和
逻辑结构中各结点相邻关系是一致的。
地址计算:
LOCa(i)=LOCa
(1)+(i-1)*d;
(首地址为1)
在顺序表中实现的基本运算:
平均移动结点次数为n/2;
平均时间复杂度均为O(n)。
·
平均移动结点次数为(n-1)/2;
线性表的链式存储结构中结点的逻辑次序和物理次序不一定相同,为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息(即指针或链)。
这两部分信息组成链表中的结点结构。
一个单链表由头指针的名字来命名。
单链表运算:
建立单链表·
头插法:
s->
next=head;
head=s;
生成的顺序与输入顺序相反。
尾插法:
head=rear=null;
if(head=null)head=s;
elser->
next=s;
r=s;
平均时间复杂度均为O(n)
加头结点的算法:
对开始结点的操作无需特殊处理,统一了空表和非空表。
查找·
按序号:
与查找位置有关,平均时间复杂度均为O(n)。
按值:
与输入实例有关,平均时间复杂度均为O(n)。
插入运算:
p=GetNode(L,i-1);
next=p->
next;
p->
平均时间复杂度均为O(n)
删除运算:
r=p->
next=r->
free(r);
单循环链表是一种首尾相接的单链表,终端结点的指针域指向开始结点或头结点。
链表终止条件是以指针等于头指针或尾指针。
采用单循环链表在实用中多采用尾指针表示单循环链表。
优点是查找头指针和尾指针的时间都是O
(1),不用
遍历整个链表。
双链表就是双向链表,就是在单链表的每个结点里再增加一个指向其直接前趋的指针域prior,形成两条不同方
向的链。
由头指针head惟一确定。
双链表也可以头尾相链接构成双(向)循环链表。
双链表上的插入和删除时间复杂度均为O
(1)。
顺序表和链表的比较:
基于空间:
·
顺序表的存储空间是静态分配,存储密度为1;
适于线性表事先确定其大小时采用。
链表的存储空间是动态分配,存储密度<1;
适于线性表长度变化大时采用。
基于时间:
顺序表是随机存储结构,当线性表的操作主要是查找时,宜采用。
以插入和删除操作为主的线性表宜采用链表做存储结构。
若插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表。
第三章栈和队列
栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶,另一端称为栈底。
表中无元素时为空栈。
栈的修改是按后进先出的原则进行的,我们又称栈为LIFO表(LastInFirstOut)。
通常栈有
顺序栈和链栈两种存储结构。
栈的基本运算有六种:
构造空栈:
InitStack(S)
判栈空:
StackEmpty(S)
判栈满:
StackFull(S)
进栈:
Push(S,x)
退栈:
Pop(S)
取栈顶元素:
StackTop(S)
在顺序栈中有“上溢”和“下溢”的现象。
“上溢”是栈顶指针指出栈的外面是出错状态。
“下溢”可以表示栈为空栈,因此用来作为控制转移的条件。
顺序栈中的基本操作有六种:
构造空栈·
判栈空·
判栈满·
进栈·
退栈·
取栈顶元素
链栈则没有上溢的限制,因此进栈不要判栈满。
链栈不需要在头部附加头结点,只要有链表的头指针就可以了。
链栈中的基本操作有五种:
队列(Queue)是一种运算受限的线性表,插入在表的一端进行,而删除在表的另一端进行,允许删除的一端称
为队头(front),允许插入的一端称为队尾(rear),队列的操作原则是先进先出的,又称作FIFO表(FirstIn
FirstOut).队列也有顺序存储和链式存储两种存储结构。
队列的基本运算有六种:
置空队:
InitQueue(Q)
·
判队空:
QueueEmpty(Q)
判队满:
QueueFull(Q)
入队:
EnQueue(Q,x)
出队:
DeQueue(Q)
取队头元素:
QueueFront(Q)
顺序队列的“假上溢”现象:
由于头尾指针不断前移,超出向量空间。
这时整个向量空间及队列是空的却产生了“上
溢”现象。
为了克服“假上溢”现象引入循环向量的概念,是把向量空间形成一个头尾相接的环形,这时队列称循环队列。
判定循环队列是空还是满,方法有三种:
一种是另设一个布尔变量来判断;
第二种是少用一个元素空间,入队时先测试((rear+1)%m=front)?
满:
空;
第三种就是用一个计数器记录队列中的元素的总数。
队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表。
为了便于在表尾进行插入(入队)的
操作,在表尾增加一个尾指针,一个链队列就由一个头指针和一个尾指针唯一地确定。
链队列不存在队满和上溢
的问题。
在链队列的出队算法中,要注意当原队中只有一个结点时,出队后要同进修改头尾指针并使队列变空。
第四章串
串是零个或多个字符组成的有限序列。
空串:
是指长度为零的串,也就是串中不包含任何字符(结点)。
空白串:
指串中包含一个或多个空格字符的串。
在一个串中任意个连续字符组成的子序列称为该串的子串,包含子串的串就称为主串。
子串在主串中的序号就是指子串在主串中首次出现的位置。
空串是任意串的子串,任意串是自身的子串。
串分为两种:
串常量在程序中只能引用不能改变;
串变量的值可以改变。
串的基本运算有:
求串长strlen(char*s)
串复制strcpy(char*to,char*from)
串联接strcat(char*to,char*from)
串比较charcmp(char*s1,char*s2)
字符定位strchr(char*s,charc)
串是特殊的线性表(结点是字符),所以串的存储结构与线性表的存储结构类似。
串的顺序存储结构简称为顺序串。
顺序串又可按存储分配的不同分为:
静态存储分配:
直接用定长的字符数组来定义。
优点是涉及串长的操作速度快,但不适合插入、链接操作。
动态存储分配:
是在定义串时不分配存储空间,需要使用时按所需串的长度分配存储单元。
串的链式存储就是用单链表的方式存储串值,串的这种链式存储结构简称为链串。
链串与单链表的差异只是它的结
点数据域为单个字符。
为了解决“存储密度”低的状况,可以让一个结点存储多个字符,即结点的大小。
顺序串上子串定位的运算:
又称串的“模式匹配”或“串匹配”,是在主串中查找出子串出现的位置。
在串匹配中,将主串称为目标(串),子串称为模式(串)。
这是比较容易理解的,串匹配问题就是找出给定模式串P在给定目标串T中首次出现的有效位移或者是全部有效位移。
最坏的情况下时间复杂度是O((n-m+1)m),假如m与n同阶
的话则它是O(n^2)。
链串上的子串定位运算位移是结点地址而不是整数
第五章多维数组
数组一般用顺序存储的方式表示。
存储的方式有:
行优先顺序,也就是把数组逐行依次排列。
PASCAL、C
列优先顺序,就是把数组逐列依次排列。
FORTRAN
地址的计算方法:
按行优先顺序排列的数组:
LOCa(ij)=LOCa(11)+((i-1)*n+(j-1))*d.
按列优先顺序排列的数组:
LOCa(ij)=LOCa(11)+((j-1)*n+(i-1))*d.
矩阵的压缩存储:
为多个相同的非零元素分配一个存储空间;
对零元素不分配空间。
特殊矩阵的概念:
所谓特殊矩阵是指非零元素或零元素分布有一定规律的矩阵。
稀疏矩阵的概念:
一个矩阵中若其非零元素的个数远远小于零元素的个数,则该矩阵称为稀疏矩阵。
特殊矩阵的类型:
对称矩阵:
满足a(ij)=a(ji)。
元素总数n(n+1)/2.I=max(i,j),J=min(i,j),LOCa(ij)=LOC(sa[0])+(I*(I+1)/2+J)*d.
三角矩阵:
上三角阵:
k=i*(2n-i+1)/2+j-i,LOCa(ij)=LOC(sa[0])+k*d.
下三角阵:
k=i*(i+1)/2+j,LOCa(ij)=LOC(sa[0])+k*d.
对角矩阵:
k=2i+j,LOCa(ij)=LOC(sa[0])+k*d.
稀疏矩阵的压缩存储方式用三元组表把非零元素的值和它所在的行号列号做为一个结点存放在一起,用这些结点组成的一个线性表来