全知识整理目录
数据结构整理的目录包括了许多的数据结构相关知识。
概述
本文使用正常人的语序来总结,数据结构的大部分知识点,概念。书本上的反人类话语就不出现了。
诸如:算法的特征,评价算法的优劣标准,非终端节点等常用的概念性,需要理解记忆的总结。
更多更仔细的介绍,需要参考数据结构全知识目录。
第一章 基本概念
数据结构:是研究数据的组织,存储,和运算的一般方法。
数据:客观表示事物的符号表示。
数据元素:数据的基本单位,数据元素用于描述一个完整的对象。
数据对象:集合内数据元素的性质相等,就可以称之为数据对象。
抽象数据类型(ADT):不仅包含数据还包含操作集,对外表示细节和操作细节不可见,详解见另一篇专门写的博客ADT详解。
逻辑结构
集合结构
线性结构
非线性结构
树结构
图结构或网状结构
存储结构
顺序存储结构
链式存储结构
逻辑结构
二元组(D,R)
D是数据关系的集合
R是D关系上的集合
()表示有序<>表示无序
算法
特征
有穷性,确定性,可行性,输入,输出。
评价算法标准
正确性,可读性,健壮性,高效性。
第二章 线性表
线性表:
由n个数据特征相同的元素构成的有限序列。
空表:
n=0的线性表。
非空线性表或线性结构的特点:
存在第一个和最后一个数据元素,出第一个都有前驱,除最后一个都有后继。
顺序表
线性表的顺序存储结构,是一种随机存取的数据结构。
链表
详情见链表的基本操作,链表的基本操作
第三章 栈和队列
栈
先进后出的数据结构。
队列
先进先出的数据结构。
队空的条件:Q.front == Q。rear
队满的条件:(Q.rear+1)%1MAXQSIZE == Q.front
链栈
第四章 串,数组和广义表
串
BF算法
普通的暴力算法,挨个比较。
KMP算法(KMP详细介绍)
广义表
广义表一般记作LS=(a1,a2,a3......an),LS是表名,n是长度。
第五章 树和二叉树
树
就是有n个节点的有限集。
基本术语
结点的度:结点后继的个数。
树的度:结点度的最大值。
叶子:没有后继的结点。
非终端结点:有后继的结点,除根节点。
树的深度:就是树有多少层。
有序树和无序树:有序是从左到右从上到下依次排列,无序就是随便排。
森林:m(m>0)棵互不相交的树的集合。
二叉树
二叉树和树的区别:二叉树是有序树,树不一定是有序树。
二叉树的性质:在二叉树的第i层上最多有2^(i-1)个结点。
公式:终端结点树n0,度为2的结点树n2,那么n0=n2+1。
满二叉树:深度为k且含有2^k-1个结点的二叉树。
完全二叉树:
- 叶子结点只可能在层次最大的两层出现。
- 对任意结点,右分支最大层次为L,那么左分支
- 必定为L或L+1。
具有n个结点的完全二叉树,的深度为[log2n](向下取整)+1。
遍历二叉树
前序:根左右
中序:左根右
后序:左右根
ps:反正记住,什么序根就在那个位置,依次左右
线索二叉树
概念:线索二叉树分为先序,中序,后序。当序列化一次之后,Rtag或者Ltag置为1,序列那边就将那边置为1。
方法:而线索二叉树,只需要记得以下几点,先序,中序,后序都可以理解:
- 左孩子存在,为左孩子,左孩子为空,序列化是找到他的前驱。
- 右孩子存在,为右孩子,右孩子为空,序列化是找到他的后继。
- 前驱或者后继没有了,就置为NULL。
详细线索二叉树,如这篇博客的介绍-->线索二叉树
平衡二叉搜索树
平衡二叉搜索树,最重要的是平衡因子,平衡因子只能为1,0,-1,超出就需要调整。
左旋转:当前插入平衡因子不满足的节点,向左下滑。
右旋转:当前插入平衡因子,造成右线路问题,需要右旋。
左右旋转和右左旋转:先左单旋,再右单旋,或者反之。
简易方法:只要从下往上,看看到一个平衡因子不满足的,就开始调整,这样左右旋就变成了,相对简易的,先左单旋,再右单旋。
详细介绍平衡二叉搜索树,过程,代码,如下链接-->平衡二叉搜索树
树和森林
哈夫曼树与哈夫曼编码
概念:哈夫曼树是最优二叉树,哈夫曼编码是以最少的字符,包含最多的信息。
构造方式:第一次选出最小权重的,两个结点构成二叉树,以后每次选出一个最小的结点与根节点构成二叉树,根节点权重=左右两个子树权重的和。
详细介绍哈夫曼树与哈夫曼编码-->哈夫曼树与哈夫曼编码
第六章 图
基本术语
度:分为出度和入度,到自己的叫入度,到别人的叫出度。
简单图:(大部分我们所遇见的,题中的图都是简单图):
- 不存在重复的边。
- 不存在顶点到自身的边。
完全图:任意两节点之间都存在路径(注意可以不是所有边都连通)。
连通图:任意两点都连通。
AOE网
关键路径:是代表工程的最长执行时间的。
最早发生时间v(e):最短的执行时间路径。
最迟发生时间v(l):最终最大的执行时间-路径最长耗时。
v(e)=v(l)就是关键路径。
图的遍历
深度优先遍历:对应树的先序遍历。
广度优先遍历:对应树的层级遍历。
最小生成树的几种得到方式
Kruskal算法:朴素的算法,每次全局的选择权值最小的边。
Prim算法:在已插入顶点的基础之上,每次选择出一条能够连接到的权值最小的边。
最短路径的求法:
Dijstra算法:Dijstra算法是求最短路径当中的,一种朴素算法,依据dist数组,每次插入一个顶点之后,对dist数组进行更新。
Floyd算法:相较于Dijstra算法而言,可以求负权值的边,依据的是整个表,每次插入一个顶点之后对表进行更新,最后一个顶点插入之后生成的表,就是最后的最短路径。