绪论
数据结构
逻辑结构
线性
线性表
顺序结构
顺序表
1~n 插入i个位置前 move 1 i-1 new i n ; 插入i个位置后 move 1 i new i+1 n
链式结构
单链表
双链表
循环链表
静态链表
使用数组实现
比较
存储 顺序表
运算 查找 顺序表| 增删 链表
环境 顺序表
受限线性表
队列
顺序队列
判满 Q.rear - Q.front = MaxSize - 1
循环队列
判满 (Q.rear + 1) % MaxSize = Q.front
链式队列
双端队列
栈
顺序栈
链栈
共享栈
数组
存储结构
行优先 00 01 10 11
列优先 00 10 01 11
压缩存储
同元素共用 0元素不分配
对称矩阵
arr[n*(n+1)/2] equal arr[n][n] 1start
(i+1)i/2+j i>=j
(j+1)j/2+i i<j
三角矩阵
三对角矩阵
稀疏矩阵
String
基本概念
主串
子串
串长
存储结构
定长顺序结构
堆分配存储
块链存储
模式匹配算法
朴素
改进的KMP
非线性
树
性质
树中 结点数 = 总度数 + 1
度为m的树中 第i层的最多结点数 m^(i-1) m=3 i=3 9
高度为h,m叉树中 最多结点数 (m^(h)-1) / (m-1) m=3 h=3 13
结点数为n的m叉树的最小高度 logm(n(m-1) + 1)
术语
有序树和无序树
路径长度 边的个数
森林 互不相交的树的集合
一般树与森林
存储结构
顺序存储 index data parent 双亲表示法
顺序存储 P + 链式存储C 孩子表示法
链式存储 Chile Parent Brother
遍历
先根遍历
后根遍历
操作
树与森林之间的转换
Chile Parent Brother
遍历
应用
查并集
二叉树
特殊二叉树
满二叉树 h为高度 结点数 2^h - 1
完全二叉树 h为高度 编号与满二叉树一致
二叉排序树 左小 右大
结点删除you
左子树空 ,右子树
右子树空 ,左子树
左右均不空 右子树的左子女 or 左子树的右子女
查找效率
ASL = 结点高度和/结点数
二叉平衡树 左右子树高度差 <=1
插入
不平衡的处理
LL 右单旋转
Lnode的Lchild不变,Rnode的Rchild不变
Lnode的Rchild to Rnode的Lchild
RR 左单旋转
Lnode的Lchild不变,Rnode的Rchild不变
Rnode的Lchild to Lnode的Rchild
LR = LLRR
RL = RRLL
哈夫曼树 最小带权长度二叉树
带权路径长度WPL = 路径长度*权重 之和
存储结构
链式存储 常用
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
顺序存储 层序遍历的编号
操作
三种遍历
先序 中左右
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<>();
preorder(root,res);
return res;
}
public void preorder(TreeNode root, List<Integer> res){
if(root==null){
return;
}
res.add(root.val);
preorder(root.left,res);
preorder(root.right,res);
}
}
中序 左中右
后序 左右中
层序遍历
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(root==null){
return ret;
}
Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
while(!queue.isEmpty()){
List<Integer> temp = new LinkedList<>();
int leveSize = queue.size();
for(int i = 0; i < leveSize; ++i){
TreeNode node = queue.poll();
temp.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
ret.add(temp);
}
return ret;
}
}
线索二叉树
lchild ltag data rtag rchild
rtag ltag
应用
哈夫曼树
排序二叉树
图
定义
有向图
出度
入度
无向图
度
简单图
无环
无重复边
完全图
有向
无向
子图
连通图 顶点间是至少是单向可到达
连通分量 极大连通子图
强连通图 顶点间是相互可到达
强连通分量 极大强连通子图
生成树 包含图中所有顶点的极小连通子图,边可不要就不要
生成森林 由生成树组成
稠密图/稀疏图 边的数
简单路径 顶点不重复出现
有向树 1个顶点 入度为0 其他入度为1
网 边上有权值的图
存储结构
邻接矩阵法 数组
[1,2][1,3][2,3][3,2]
1234
0110
0010
0100
邻接表 链表
[1,2][1,3][2,3][3,2]
1->2->3
2->3
3->2
邻接多重表
无向图
node data| firstPointer
edge nodeIndex|next|nextIndex|nextIndexEdge
十字链表
[v1,v2][v1,v3]
[v3,v1][v3,v4]
[v4,v1][v4,v2][v4,v3]
v1 0
v2 1
v3 2
v4 3
node data| inPointer| outPointer
edg outIndex| inIndex| sameIn|next
遍历
深度优先DFS
递归
性能分析 bad空间|V|
邻接表 时间V+E
邻接矩阵 V^2
深度优先生成树、生成森林
广度优先BFS
层序遍历
性能分析 bad空间|V|
邻接表 时间V+E
邻接矩阵 V^2
广度优先生成树
深度优先搜索
应用
最小生成树
prim
点优先
kruskal
线优先
最短路径
Dijkstra 单源最短路径
Floyd 单源最短路径
有向无环图DAG
同一数组只出现一次
AOV网 与拓扑排序
关键路径
关键路径通常(但并非总是)是决定项目工期的进度活动序列。它是项目中最长的路径,即使很小浮动也可能直接影响整个项目的最早完成时间
关键路径不唯一
集合
物理结构
顺序
链式
索引
Map
散列
数据的运算
数据结构的基本概念
数据 信息载体
数据对象 相同性质的数据元素的集合
数据元素 数据的基本单位
数据元素 数据的基本单位
数据元素 数据的基本单位
数据类型
原子类型
结构类型
抽象数据类型
数据结构
数据元素的集合
算法和评价
特征
特性 有穷性 确定性 可行性 输入 输出
判断标准
正确性
可读性
健壮性
效率和低存储量要求
度量
空间复杂度
时间复杂度
数据的运算
静态查找
元素是否存在
通过属性查找
动态查找
静态查找 + 插入、删除
线性结构
顺序查找
ASL
n个元素 一般线性表
average (n+1)/2
bad n+1
n个元素 有序线性表
average (n+1)/2
bad n/2 + n/(n+1)
折半查找
n个元素 有序线性表
average log2(n+1) - 1
分块查找
ASL
n个元素 一般线性表 b块 块长s
average
索引查找+块内查找 = (b+s)/2 + 1
average s = n^(1/2)
n^(1/2) + 1
average
s/2 + [log2(b+1)]
二叉排序树
查找成功 ASL = 高度和/非叶子数 圆点
查找不成功 ASL = 叶子路径和/叶子数 方块
树形结构
二叉排序树
二叉平衡树
B树
多路平衡查找树
高度
h = (n+1)/2 +1
B+树 符合数据库需求的B树
散列表
ASL = 关键数 比较次数之和/关键字数
查找效率
散列函数
冲突处理
装载因子
排序
排序法 | 最好 | 平均时间 | 最坏 | 稳定 | 额外空间 |
---|---|---|---|---|---|
冒泡排序 | O(n) | O(n^2) | O(n^2) | 稳定 | O(1) |
选择排序 | O(n^2) | O(n^2) | O(n^2) | 不稳定 | O(1) |
插入排序 | O(n) | O(n^2) | O(n^2) | 稳定 | O(1) |
快速排序 | O(n log n) | O(n log n)~ O(n) | O(n^2) | 不稳定 | O(n log n) |
堆排序 | O(n log n) | O(n log n) | O(n log n) | 不稳定 | O(1) |
希尔排序 | 不稳定 | O(1) | |||
归并排序 | O(n log n) | O(n log n) | O(n log n) | 稳定 | O(n) |
基数排序 | O(d(r + n)) | O(d(r + n)) | O(d(r + n)) | 稳定 | O( r ) |