1.数据:数据时所有能输入到计算机并被计算机程序处理的的符号总称
2.数据元素:数据元素是数据的基本单位
3.数据项:数据项是数据元素的最小单位
4.数据对象:数据对象是指性质相通的数据元素集合
5.数据类型:数据类型是一个值的集合与定义在此值集合上的一些操作的总称
6.抽象数据类型(ADT):通常(数据对象,数据关系,基本操作)这样的三元组来表示抽象数据类型
数据项->数据元素->数据
数据结构=逻辑结构+存储结构+运算
1.逻辑结构:指数据元素之间的逻辑关系
逻辑结构分4类基本结构:
(1)集合结构
(2)线性结构(一对一关系)
(3)树形结构(一对多关系)
(4)图状结构或网状结构(多对多关系)
线性结构:线性表,栈,队列
非线性结构:树,图,集合
2.存储结构(又称物理结构)
主要有顺序存储,链式存储,索引存储,散列存储
3.运算:数据的运算是在数据的逻辑结构上定义的操作算法(如增删改查)
评价算法的优略的基本标准:
正确性:能够确保对于某种相对程度的随机输入有正确的输出
快速性:算法设计合理,执行效率高,可以用时间复杂度度量
可读性:算法描述清晰易懂,使于修改和移植
健壮性:当输入非法数据时,算法能够做出适当的反应和处理
节省性:算法占用存储容量合理,可以使用空间复杂度或者存储密度度量
1.算法的时间复杂度
时间复杂度是指算法在计算机内执行时所需运行时间的度量
记作:T(n)=O(f(n)),其中n为问题的规模大小
常见的时间复杂度:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n的2次方)<O(n的3次方)<O(2的n次方)<O(n的阶乘)<O(n的n次方)
2.算法的空间复杂度
空间复杂度是指算法在计算机内执行时所需存储空间的度量
记作:S(n)=O(n),其中n为问题的规模大小
线性表分为顺序存储和链式存储
顺序存储对应顺序表,链式存储对应单链表,双链表,循环链表,静态链表
线性表的顺序存储方式就是用一组地址连续的存储单元依次存储线性表的各个元素,可以借助一维数组实现
顺序表的插入,删除,修改,查找(统称增删改查)
顺序表的优缺点:
优点:结构简单,可直接定位到表中任意元素,并可随机存取,连续存取速度快
缺点:存储空间难于准确静态分配,分配大了浪费空间,分配小了不够用,
插入,删除操作不太方便,需要移动大量元素,效率较低
在链式存储结构下,线性表的存储空间可以分散不连续的,一个指针的存储节点的结构如图
单链表的节点知识
1.结点:通常指一个数据元素相关的存储空间
2.表头元素:线性表中的第一个数据元素
3.表尾元素:线性表中的最后一个数据元素
4.首元结点:在链式存储结构中,存储线性表中的第一个数据元素
5.头节点:在链表存储结构中,存储线性表中第一个数据元素,其作用是使用有关链表编程时,空表和非空表不分别加以考虑,这样的程序既简单又效率高
单链表的操作
单链表的插入,删除,修改,查找
头插法和尾插法
步骤:插入
q->next=p->next;
p->next=q;
步骤:删除
q=p->next
p->next=p->next->next
free(q)
单链表的优缺点
优点:存储空间动态分配,可以按需要使用,插入删除节点操作通常只需要修改指针,不必移动数据元素
缺点:每一结点附加指针域,非随机存取结构,查找定位需从头指针出发顺着链表扫描
双链表的插入,删除,修改,查找
步骤:插入
q->next=p->next;q->prior=p
p->next->prior;
p->next=q;
步骤:删除
p->next->prior=p->prior;p->prior->next=p-next;
在无法或者不便于动态生成节点的场合,例如有些高级语言中没有“指针”数据类型要想发挥链表结构的长处,可用一个一维数组空间模拟可利用空间表,构造静态链表,
静态链表的操作
静态链表的插入,删除,查找,修改
栈:栈,共享栈,链栈,栈的应用
队列:队列,循环队列,双端队列(输出受限,输入受限,不受限),链队,队列的应用
栈:只允许在一端进行插入或删除操作的线性表,四个字:先进先出,向栈中插入元素称为入栈,从栈中删除元素称为出栈
栈的操作
“上溢”现象—当栈满时,再作进栈运算产生空间溢出的现象
“下溢”现象—当栈空时,作退栈运算产生的溢出现象
共享栈
共享栈(双栈):
两个栈共同开辟一个存储空间,让一个栈的栈底为该空间的始端,另一个栈的栈底为该空间的末端,当元素进站时,都从两端向中间延申,这样就能够使剩余的空间为任意一个栈使用,
栈1的操作:
入栈:top1=top1+1;A[top1]=value;
出栈:e=A[top1];top1=top1-1;
栈2的操作:
入栈:top2=top2-1;A[top2]=value;
出栈:e=A[top2];top2=top2+1;
栈空:top=null;
栈满:不存在的!
入栈:p->next=top;top=p;
出栈:e=top->data;top=top->next;
顺序栈和链栈的比较
时间性能比较:顺序栈和链栈基本操作的算法,时间复杂度均为O(1)
空间性能比较:初始时顺序栈必须确定一个固定的长度,所以又存储元素个数的限制和空间的浪费的问题 链栈没有栈满的问题,只有内存没有可用空间时才会出现栈满的,但每个元素都需要一个指针域,从而产生结构性的开销,一般结论:当站在使用过程中元素个数变化较大时,用链栈比较好,反之应该使用顺序栈
栈的应用:主要是在括号比配,表达式求值,递归中前缀表达式和后缀表达式
移符号求后缀后移符号,求前缀前移符号
只允许在表的一端进行插入,而在表的另一端进行删除,四个字:先进先出
向队列中插入元素称为入队,从队列中删除元素称为出队,
简单队列可能存在假溢出或者假满的问题
为了解决假溢出或者假满这一问题,一般将顺序队列构成循环队列
指允许两端都可以进行入队和出队操作的队列(不受限)
输出受限的双端队列:允许在一端进行插入和删除,但在另一端允许插入的双端队列称之为输出受限的双端队列
输入受限的双端队列:允许在一端进行插入和删除,但在另一端允许删除的双端队列称之为输入受限的双端队列
实际上是一个同时带有队头指针和队尾指针的单链表
空队:front=null;rear=null;
满队:不存在滴!
入队:rear->next=p;rear=rear->next;
出队:e=front->data;front=front->next;
循环队列与链式队列的比较
时间性能比较
循环队列与链式队列基本操作的算法都需要常数时间O(1)
循环队列是事先申请好空间,使用期间不释放
链式队列是每次申请和释放节点也会存在一些时间开销
空间性能比较
循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题
矩阵:对称矩阵,三角矩阵(上三角,下三角),三对角矩阵,稀疏矩阵
度:子树的个数
树的度:树中结点的最大度数
根节点:一个树可以只有一个结点
叶子结点:度为0的结点,也称为终端结点
分支结点:度不为0的结点,也称为非叶子结点或者非终端节点
层数:根结点在第一层,根结点的子结点在第二层以此类推
深度:是从根节点开始自顶向下逐层累加的
高度:是从叶子节点开始自底向上逐层累加的
有序树:树中任意结点的子结点之间有顺序关系
无序树:树中任意结点的子结点之间没有顺序关系
树中两个结点之间的
路径:由这两个结点之间经过的结点序列构成
路径长度:路径上所经过的边的个数
孩子:结点的子树
双亲:结点是子树的双亲
兄弟:同一个双亲的孩子之间称为兄弟
堂兄弟:双亲在同一层的结点互为堂兄弟
祖先:从根到此节点所经分支上的所有结点称之为此节点的祖先
子孙以某节点为根的子树中的任意结点都称之为该节点的子孙
满二叉树,完全二叉树
1.树中的结点树等于所有节点的度数加一,树中结点总数为n,则n=分支数+1
2.非空二叉树上叶子结点数等于度为2的结点数加一,即n0=n2+1,结点总数n=n0+n1+n2
3.结点i的左孩子编号为2i,右孩子编号为2i+1
4.非空二叉树上第k层上至多有2的k-1次方个结点(k大于等于1)
5高度为h的二叉树至多有2的h次方减一个结点(h大于等于1)
6.具有n个节点的完全二叉树的高度为log以2为底n的对数向下取整加一
1.先序遍历:若二叉树非空,访问根节点,先根遍历左子树,后跟遍历右子树
2.中序遍历:若二叉树非空,则中根遍历左子树,访问根节点,中根遍历右子树
3.后序遍历:若二叉树非空,则后根遍历左子树,后根遍历右子树,访问根节点
4.层序遍历:从二叉树的根节点开始,按自上而下,从左到右的顺序进行遍历
1.双亲表示法:采用一组连续空间来存储每个节点,在每个节点中增设一个伪指针,指示其双亲结点在数组中的位置
2.孩子表示法:将每个结点的孩子结点都用单链表链接起来,(n个结点就有n个孩子链表)
3.孩子兄弟表示方法(二叉树表示法)
以二叉链表作为树的存储结构,孩子兄弟表示法使每个节点包括三个部分
节点值,指向结点第一个孩子的指针,指向结点下一个兄弟节点的指针(沿此域可以找到结点的所有兄弟结点)
1.先根遍历:若树非空,则先访问根结点,再按从左到右的顺序遍历根结点的每颗子树,其访问顺序与这棵树与这棵树相应二叉树的先序遍历顺序相同
2.后根遍历:若树非空,则按从左到右的顺序遍历根节点的每颗子树,之后再访问根节点,其访问顺序与这棵树相应的二叉树的中序遍历顺序相同
二叉树排序树(BST),也称二叉查找树或者二叉判定树(左小右大)
1.定义:
(1)若左子树非空,则左子树上所有结点关键字值均小于根节点的关键字值
(2)若右子树非空,则右子树上所有结点关键字值均大于根节点的关键字值
(3)左,右子树本身也分别是一颗二叉排序树
2.二叉树排序树的插入
请按顺序插入:53,17,78,9,45,65,94,81,88,23
3.二叉排序树的删除
删除操作的实现过程按3种情况来处理
(1)若被删除结点是叶子节点,则直接删除
(2)若结点Z只有一颗左子树或右子树,则直接删除
(3)若结点Z有左,右子树,则令Z的直接后继(或直接前驱)代替,然后从二叉排序树中,删去这个直接后继(或直接前驱),这样就转换成了第一种第二种情况,
4.二叉排序树的查找
又称平衡树(AVL):任意节点的左右子树高度差的绝对值不超过1,且子树都是平衡树,定义结点左子树与右子树的高度差为该节点的平衡因子,平衡因子的值只可能是-1,0或者1,
含有20个结点的平衡二叉树的最大深度为()
一般可将失去平衡后进行调整的规律归纳为下列四种情况
1.LL平衡旋转
2.RR平衡旋转
3.LR平衡旋转
4.RL平衡旋转
LL(右转)RR(左转)LR(先左后右)RL(先右后左)
带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树
W:weighted,P:path,L:len
带权路径长度的求法:构造哈夫曼树,节点值乘以到根节点的高度值之和为带权路径长度
前缀编码:如果在一个编码方案中,任何一个编码都不是其他任何编码的前缀(最左子串),则称该编码是前缀编码。
能构成正常二叉树的编码都是前缀编码,所有的字符结点都是叶子结点
图的专业术语,图结构的存储
1.有向图和无向图
2.简单图和多重图
简单图:不存在重复边,不存在顶点到自身的边
多重图:图中某两个结点之间的边数多余一条,又允许顶点通过同一条边和自己关联
3.完全图(也称简单完全图)在无向图中,任意两个顶点之间都存在边
4.稠密图,稀疏图
5.连通,连通图和连通分量
在无向图中,若顶点v到顶点w有路径存在,则称v和w是连通的
若图G中任意两个顶点之间都是连通的,则称图G为连通图,否则称之为非连通图
无向图中的极大联通子图称为连通分量
6.强连通图,强连通分量
在有向图中,若从顶点v到顶点w和从顶点w到顶点w到顶点v之间都有路径,则称这两个顶点之间是强连通的,若图中任意一对顶点都是强连通的,则称此图为强连通图
有向图中的极大强连通子图称为有向图的强连通分量
7.路径,路径长度和回路
顶点v到顶点w之间的一条路径是指顶点序列
路径上边的数目称为路径长度
第一个定点给和最后一个顶点相同的路径称为回路或环
8.简单路径,简单回路
在路径序列中,顶点不重复出现的路径称为简单路径
除第一个顶点和最后一个顶点外,其余顶点不重复的回路称之为简单回路
9.距离
从顶点u出发到顶点v的最短路径若存在,则此路径的长度称之为u到v的距离
若从u到v根本不存在路径,则记该距离为无穷
10.生成树,生成森林
连通图的生成树是包含图中全部顶点的一个极小连通子图
若图中顶点数为n,则它的生成树含有n-1条边
在非连通图中,连通分量的生成树构成了非连通图的生成森林
11.有向树
一个顶点的入度为0,其余顶点为入度均为1的有向图,称之为有向树
1.邻接矩阵:用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系)存储顶点之间的邻接关系的二维数组称为邻接矩阵
2.邻接表
3.邻接多重表:是无向图的一种链式存储结构
4.十字链表
图的遍历,最小生成树,最短路径
图遍历的生成树
最小生成树
最短路径
拓扑排序
由某个集合上第一个偏序得到该集合上的一个全序
关键路径
AOE网:一个带权的有向无环图,通常AOE网可用来估计工程的完成时间
顶点:表示时间,弧:表示活动,权:表示活动持续的时间
分块查找
基本思想:将查找表分为若干块,块内元素可以无序,但块间是有序的
散列表
散列函数:一个把查找表中关键字映射成该关键字对应的地址的函数,记为hash(key)=addr
散列(hsah)表:根据关键字而直接进行访问的数据结构
常用的散列函数:1.直接定址法,H(key)=a*key+b,2.除留余数法,H(key)=key%p
处理冲突的方法:
1.开放定址法:取定某一增量序列后,对应的处理方法就是确定的,通常有一下四种取法:
(1)线性探测法,(2)平方探测法(二次探测法)(3)再散列法,(4)伪随机法
2.拉链法
B树的基本操作
B树又称多路平衡查找树,B树中所有结点的孩子结点数的最大值称为B的树的阶,通常用m表示
B树的插入
B树的删除:
当删除的K值不是叶子时,有下列几种情况:
(1)若左子树中的个数大于二分子m向上取整减一,则找前驱取代,再删除K
(2)若右子树中的个数大于二分子m向上取整减一,则找后继取代,再删除K
(3)若左右子树中的个数等于二分子m向上取整减一,两子树合并,再删除K
当删除的k值是叶子时,有以下几种情况:
(1)若所在结点的个数大于二分子m向上取整减一,直接删,
(2)若所在结点的个数等于二分子m向上取整减一且兄弟节点的个数大于等于二分子m向上取整,父子换位
(3)若所在结点的个数等于二分子m向上取整减一且兄弟结点的个数等于二分子m向上取整,父子合并
B树的特性
一颗m阶B树或为空树,或为满足如下特性的m叉树
(1)树中每个结点至多有m颗子树(即至多含有m-1个关键字)
(2)若根节点不是终端结点,则至少有两颗子树
(3)除根结点外的所有非叶子结点至少有二分子m棵子树(即至少含有二分子m向上取整减一个关键字)
(4)所有的叶子结点都出现在同一层次上,并且都不带信息
KMP算法
插入排序
希尔排序
冒泡排序
快速排序
选择排序
堆排序
归并排序
基数排序