《算法》第四版中的重要算法
最近由于一直在学习算法与数据结构,这里记录一下自己需要实现的《算法》第四版中的部分算法与数据结构。
最基本算法
- 二分查找. P28, P241的基于有序数组的二分查找.
- 队列的链表实现. 算法 1.3 P95
- 栈的链表实现. 算法 1.2 P94;
- 栈的数组实现(动态调整数组). 算法 1.1 P88
- 背包的链表实现. 算法 1.4 P98
排序相关算法
- 插入排序. 算法 2.2 P157 部分有序和小规模数组有效
- 希尔排序. 算法 2.3 P163
- 自顶向下归并排序. 算法 2.4 P171 算法框架, 主要是P170 merge 方法的实现
- 快速排序. 算法 2.5 P182 算法框架, 着重看P184切分(partition)算法.
- 三向切分快速排序. P189
- 基于堆的优先队列. 算法 2.6 P202 需要看P200 swim方法和P201的sink方法的实现.
- 索引优先队列. API P203,
- 堆排序. 算法 2.7 P206
额外重要的数据结构:
- 斐波那契堆(Fibonacci Heap)
符号表相关算法
- 基于二叉查找树的符号表. 算法 3.3 P252 算法框架. 主要看 P252算法3.3(续1)中的get和put方法实现; P261算法3.3(续4)deleteMin和delete方法实现
- 红黑树插入算法, P281; 红黑树的右旋和左旋算法, P277; 颜色转换, P279; 删除最小键和删除算法需要看书对应的代码实现.
- 字符串的hash算法, P294; Horner算法, P506
- 链表法散列表, 算法 3.5 P297
- 线性探测符号表, 算法 3.6; 还需要看P302 delete方法实现; P304 resize方法实现.
- 稀疏向量的实现, P322
额外重要的数据结构:
- KD树
- AVL树
图相关算法
- 无向图数据类型实现, P336
- 深度优先搜索, P339; 解决问题: 两个顶点连通性问题.
- 使用 深度优先 搜索查找无向图中的路径, 算法 4.1, P343; 解决问题: 单点路径问题.
- 使用 广度优先 搜索查找无向图中的路径, 算法 4.2, P346; 解决问题: 单点最短路径问题.
- 使用 深度优先 搜索找出无向图中的所有连通分量, 算法 4.3, P349
- union-find(加权quick-union)算法. 算法 1.5续 P145
- 无环图的判断以及二分图的判断, P352
- 有向图数据类型的实现, P366
- 有向图的可达性(DFS), P367
- 寻找有向环. P372
- 拓扑排序(逆后序). P375
- Kosaraju算法(强连通分量), 算法4.6 P380, 用到了union-find算法.
- 加权无向图 和 加权无向边 的数据结构, P395
- Prim算法即时实现(MST), 算法4.7 P403
- Kruskal算法(MST), 算法4.8 P406
- 边松弛relax方法实现, P418; 顶点松弛, P419
- Dijkstra算法(最短路径), 算法 4.9 P423
- 无环加权有向图的最短路径算法(拓扑排序), 算法 4.10 P427
- Bellman-Ford算法, 算法4.11 P438
额外重要的算法:
- A*搜索算法
- Floyd最短路径算法
字符串相关算法
- 键索引计数法(步骤要搞清楚), P458
- 低有效位排序(LSD), 算法 5.1 P459
- 高位优先字符串排序(MSD), 算法 5.2 P462
- 三向字符串快速排序, 算法 5.3 P469
- 基于单词查找树的符号表(R向Trie树), 算法 5.4 P479
- 三向单词查找树. 算法 5.5 P486
- 最长键(longestPrefixOf), P481; delete操作, P482
- KMP算法. 算法 5.6 P500; DFA数组构造, P499
- 正则表达式模式匹配(NFA理解). 算法 5.9 P524
- Huffman压缩算法. 算法 5.10 P547
- LZW压缩算法. 算法5.11 P552; LZW展开算法. 算法 5.11(续) P554