Skip to content

分类1

算法分类总览

算法是解决问题的系统化方法,根据问题的性质、解法的特点或应用场景,算法可以被分为以下几类。


1. 按设计思想分类

1.1 贪心算法 (Greedy Algorithm)

核心思想:局部最优解推导全局最优解。
应用场景:求解最小/最大值、选择问题等。
特点:快速,简单,但不能保证全局最优解。

典型问题

  • 最小生成树 (Prim/Kruskal)。
  • 区间调度问题。
  • 哈夫曼编码。

例子

  • 找零问题:用最少的硬币满足总额。

1.2 动态规划 (Dynamic Programming, DP)

核心思想:通过分解子问题并记录中间结果,避免重复计算。
应用场景:具有重叠子问题和最优子结构的问题。
特点:时间复杂度较高,适合复杂问题的精确解。

典型问题

  • 背包问题。
  • 最长公共子序列。
  • 编辑距离。

1.3 分治算法 (Divide and Conquer)

核心思想:将问题分解为更小的子问题,解决后合并结果。
应用场景:问题可以被递归分割并合并。
特点:利用递归解决问题。

典型问题

  • 快速排序。
  • 归并排序。
  • 二分搜索。
  • 最大子数组和问题 (Kadane's Algorithm)。

1.4 回溯算法 (Backtracking)

核心思想:穷举所有可能解,遇到不符合条件的分支立即回溯。
应用场景:解约束满足问题。
特点:暴力搜索,适合求解组合、排列问题。

典型问题

  • N 皇后问题。
  • 数独求解。
  • 全排列/子集问题。

1.5 分支界限法 (Branch and Bound)

核心思想:系统搜索问题空间,通过剪枝减少计算量。
应用场景:需要搜索但有优化目标的问题。
典型问题

  • 旅行商问题 (TSP)。
  • 0-1 背包问题。

1.6 图论算法

核心思想:解决图中的路径、连通性、最小生成树等问题。
典型问题

  • 最短路径:Dijkstra、Bellman-Ford、Floyd-Warshall。
  • 拓扑排序。
  • 最大流问题:Edmonds-Karp。

1.7 搜索算法

核心思想:在状态空间中寻找目标解。
分类

  1. 深度优先搜索 (DFS)
  2. 广度优先搜索 (BFS)
  3. 双向搜索:从起点和终点同时搜索。
  4. 启发式搜索 (A 算法)*。

2. 按操作方式分类

2.1 排序算法

核心思想:对元素重新排列,满足特定顺序。
分类

  • 交换排序:冒泡排序、快速排序。
  • 插入排序:直接插入排序、希尔排序。
  • 选择排序:简单选择排序、堆排序。
  • 归并排序:分治思想排序。
  • 桶排序/计数排序:线性排序。

2.2 搜索算法

核心思想:在数据集合中查找目标元素。
分类

  • 顺序搜索:线性查找。
  • 二分搜索:适用于有序数组。
  • 哈希查找:基于哈希表。

2.3 数学算法

核心思想:通过数学理论解决问题。
分类

  1. 数论算法:素数判定、最大公约数 (GCD)、快速幂。
  2. 组合数学:排列组合计算、Catalan 数。
  3. 概率与统计:随机数生成、蒙特卡罗方法。

3. 按数据结构分类

3.1 基于数组

  • 滑动窗口。
  • 双指针。
  • 前缀和、差分数组。

3.2 基于栈和队列

  • 单调栈/队列。
  • 滑动窗口最大值。
  • 括号匹配。

3.3 基于链表

  • 快慢指针 (环检测)。
  • 链表反转。

3.4 基于树和图

  • 树的遍历:前序、中序、后序、层序。
  • 最小生成树 (MST):Prim、Kruskal。
  • 二叉搜索树操作。

3.5 基于哈希

  • 哈希表。
  • LRU 缓存。

4. 按应用场景分类

4.1 字符串算法

典型问题

  • KMP、Rabin-Karp 字符串匹配。
  • 字符串压缩。
  • 最长回文子串。

4.2 图像处理算法

典型问题

  • 边缘检测:Sobel、Canny 算法。
  • 图像压缩:JPEG。

4.3 机器学习算法

典型问题

  • 线性回归、逻辑回归。
  • 支持向量机 (SVM)。
  • 神经网络与深度学习。

5. 按复杂度分类

5.1 线性时间复杂度 (O(n))

  • 单调栈。
  • 滑动窗口。

5.2 对数时间复杂度 (O(\log n))

  • 二分搜索。
  • 平衡树操作。

5.3 多项式时间复杂度 (O(n^k))

  • 动态规划。
  • 图的遍历。

5.4 指数时间复杂度 (O(2^n))

  • 子集枚举。
  • 回溯算法。

总结

  1. 学习算法时需要掌握其基本思想和典型应用场景。
  2. 根据问题特性选择适合的算法类型。
  3. 不同算法之间往往可以结合使用(如动态规划 + 贪心、分治 + 搜索)。