数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
三要素:逻辑结构、存储结构和数据的运算。主要讲的时逻辑结构,下面会分别说明各结构。
线性结构 | 特征 | 应用 |
---|---|---|
栈 | 后进先出 | 表达式求值;递归中 |
队列 | 先进先出 | 层次遍历 ;计算机系统中应用 |
串 | 模式匹配算法-KMP | |
数组 | 存储特殊矩阵:对称矩阵、三角矩阵、稀疏矩阵(十字链表法) |
二叉树,先序遍历(PreOrder)、中序遍历(InOrder)、后序遍历(PostOrder)、层次遍历;
线索二叉树,为方便找到直接前驱和后继,内容有线索二叉树构造、遍历、找前驱和找后继;
树,孩子兄弟表示法、双亲表示法和孩子表示法,应用:哈夫曼编码
先根遍历
⇔
\Leftrightarrow
⇔ 二叉树先序遍历
后根遍历
⇔
\Leftrightarrow
⇔ 二叉树中序遍历
图存储:邻接矩阵、邻接表、十字链表(有向图)、邻接多重表(无向图)
图的遍历:广度优先搜索 (BFS),深度优先搜索 (DFS)
图的应用:
最小生成树 【Prim(普里姆)、Kruskal(克鲁斯卡尔)】
最短路径 【Dijkstra(迪杰斯特拉)、Floyd(弗洛伊德)】
拓扑排序(AOV网)
关键路径
因为文章篇幅太长了,把查找和排序也加个链接,这里就简单说下是个什么东西
查找算法链接(相同)
思想:从头到尾挨个找(反过来也行)
顺序查找时间复杂度:
O
(
n
)
O(n)
O(n)
又称“二分查找”,仅适用于有序的顺序表
折半查找时间复杂度=
O
(
log
2
n
)
O(\log_2n)
O(log2n)
思想:
索引表中记录每个分块的最大关键字、分块的区间;
先查索引表(顺序或折半),再对分块内进行顺序查找.
块内无序,块间有序
设索引查找和块内查找的平均查找长度分别为
L
1
L_1
L1、
L
s
L_s
Ls,则分块查找的平均查找长度为
A
S
L
=
L
1
+
L
s
ASL=L_1 + L_s
ASL=L1+Ls
A
L
S
=
s
2
+
2
s
+
n
2
s
,
当
s
=
n
时
,
A
L
S
最
小
=
n
+
1
ALS = \frac{s^2+2s+n}{2s},当s=\sqrt n时,ALS_{最小}=\sqrt{n}+1
ALS=2ss2+2s+n,当s=n时,ALS最小=n+1
n个结点的二叉树最小高度为
⌊
log
2
n
⌋
+
1
\lfloor{\log_2n}\rfloor + 1
⌊log2n⌋+1 或是
⌈
log
2
(
n
+
1
)
⌉
\lceil{\log_2(n+1)}\rceil
⌈log2(n+1)⌉
对具有n个关键字的树型结构,具有n+1个叶结点
左子树节点值 ≤ \leq ≤ 根节点值 ≤ \leq ≤ 右子树结点值
查找思路:
若树非空,目标值与节点的值比较:
若相等,则查找成功;
若小于根节点,则在左子树上查找,否则在右子树上查找;
查找成功返回节点指针,失败返回NULL
AVL Tree链接
∣
左
子
树
高
−
右
子
树
高
∣
≤
1
\lvert 左子树高 -右子树高 \rvert \leq 1
∣左子树高−右子树高∣≤1,平衡因子只可取-1、0或1。
平衡二叉树平均查找长度为
O
(
log
2
n
)
O(\log_2n)
O(log2n)
简要特点:
左右跟,根叶黑
不红红,黑路同
查找时间复杂度: O ( log 2 n ) O(\log_2n) O(log2n)
插入步骤
B树结构:
装填因子 α \alpha α越大,平均查找长度变大,“冲突”越多,查找效率越低
处理冲突方法
排序算法链接
就看上面这个链接!
排序算法 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
直接插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 稳定 |
折半插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 稳定 |
希尔排序 | 不确定,与增量d选择有关,比插入排序好 | O ( 1 ) O(1) O(1),仅顺序表 | 不稳定 |
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 稳定 |
快速排序 | O ( n log 2 n ) O(n\log_2n) O(nlog2n),划分平均最快,有序或逆序最慢 O ( n 2 ) O(n^2) O(n2) | 平均 O ( log 2 n ) O(\log_2n) O(log2n),最好: O ( log 2 n ) O(\log_2n) O(log2n),最坏: O ( n ) O(n) O(n) | 不稳定 |
简单选择排序 | O ( n 2 ) O(n^2) O(n2),与序列初始状态无关 | O ( 1 ) O(1) O(1) | 不稳定 |
堆排序 | O ( n log 2 n ) O(n\log_2n) O(nlog2n) | O ( 1 ) O(1) O(1) | 不稳定 |
归并排序 | O ( n log 2 n ) O(n\log_2n) O(nlog2n),与序列初始状态无关 | O ( n ) O(n) O(n) | 稳定 |
基数排序 | O ( d ( n + r ) ) O(d(n+r)) O(d(n+r)),与初始序列次序无关 | O ( r ) O(r) O(r),一般用队列 | 稳定 |
冒泡排序
快速排序
简单选择排序
堆排序