《数据结构》经典算法总结
排序算法
比较排序
-
冒泡排序(Bubble Sort)
- 时间复杂度:O(n²)最坏/平均,O(n)最佳
- 空间复杂度:O(1)
- 稳定排序
-
选择排序(Selection Sort)
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 不稳定排序
-
插入排序(Insertion Sort)
- 时间复杂度:O(n²)最坏/平均,O(n)最佳
- 空间复杂度:O(1)
- 稳定排序
-
希尔排序(Shell Sort)
- 时间复杂度:O(n log n)到O(n²)
- 空间复杂度:O(1)
- 不稳定排序
-
归并排序(Merge Sort)
- 时间复杂度:O(n log n)
- 空间复杂度:O(n)
- 稳定排序
-
快速排序(Quick Sort)
- 时间复杂度:O(n log n)平均,O(n²)最坏
- 空间复杂度:O(log n)
- 不稳定排序
-
堆排序(Heap Sort)
- 时间复杂度:O(n log n)
- 空间复杂度:O(1)
- 不稳定排序
非比较排序
-
计数排序(Counting Sort)
- 时间复杂度:O(n+k)
- 空间复杂度:O(n+k)
- 稳定排序
-
桶排序(Bucket Sort)
- 时间复杂度:O(n+k)平均,O(n²)最坏
- 空间复杂度:O(n+k)
- 稳定排序
-
基数排序(Radix Sort)
- 时间复杂度:O(nk)
- 空间复杂度:O(n+k)
- 稳定排序
查找算法
-
顺序查找(Sequential Search)
- 时间复杂度:O(n)
- 空间复杂度:O(1)
-
二分查找(Binary Search)
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
- 要求数组有序
-
哈希查找(Hash Search)
- 时间复杂度:O(1)平均,O(n)最坏
- 空间复杂度:O(n)
-
二叉搜索树查找(BST Search)
- 时间复杂度:O(log n)平均,O(n)最坏
- 空间复杂度:O(n)
图算法
-
深度优先搜索(DFS)
- 时间复杂度:O(V+E)
- 空间复杂度:O(V)
-
广度优先搜索(BFS)
- 时间复杂度:O(V+E)
- 空间复杂度:O(V)
-
Dijkstra算法(单源最短路径)
- 时间复杂度:O((V+E)log V)使用优先队列
- 空间复杂度:O(V)
-
Bellman-Ford算法(单源最短路径,可处理负权边)
- 时间复杂度:O(VE)
- 空间复杂度:O(V)
-
Floyd-Warshall算法(所有节点对最短路径)
- 时间复杂度:O(V³)
- 空间复杂度:O(V²)
-
Prim算法(最小生成树)
- 时间复杂度:O(E log V)
- 空间复杂度:O(V)
-
Kruskal算法(最小生成树)
- 时间复杂度:O(E log E)
- 空间复杂度:O(E)
-
拓扑排序(Topological Sort)
- 时间复杂度:O(V+E)
- 空间复杂度:O(V)
字符串匹配算法
-
朴素算法(Brute Force)
- 时间复杂度:O(mn)
- 空间复杂度:O(1)
-
KMP算法(Knuth-Morris-Pratt)
- 时间复杂度:O(m+n)
- 空间复杂度:O(m)
-
Boyer-Moore算法
- 时间复杂度:O(mn)最坏,O(n/m)最佳
- 空间复杂度:O(m)
-
Rabin-Karp算法(基于哈希)
- 时间复杂度:O(m+n)平均,O(mn)最坏
- 空间复杂度:O(1)
树相关算法
-
二叉树遍历
- 前序、中序、后序遍历
- 时间复杂度:O(n)
- 空间复杂度:O(h),h为树高
-
AVL树插入/删除
- 时间复杂度:O(log n)
- 空间复杂度:O(n)
-
红黑树插入/删除
- 时间复杂度:O(log n)
- 空间复杂度:O(n)
-
B树/B+树操作
- 时间复杂度:O(log n)
- 空间复杂度:O(n)
动态规划经典问题
- 斐波那契数列
- 背包问题(0-1背包、完全背包)
- 最长公共子序列(LCS)
- 最长递增子序列(LIS)
- 矩阵链乘法
- 最短路径问题
- 编辑距离
贪心算法经典问题
- 活动选择问题
- 霍夫曼编码
- 最小生成树(Prim/Kruskal)
- Dijkstra算法
- 分数背包问题
分治算法经典问题
- 归并排序
- 快速排序
- Strassen矩阵乘法
- 最近点对问题
- 大整数乘法
以上是数据结构中常见的经典算法总结,每种算法都有其适用的场景和优缺点,在实际应用中需要根据具体问题选择合适的算法。