跳过并跳转到主要内容

分治

分治法是一种算法设计思想,其核心在于将复杂的大问题分解为若干结构相同且相互独立的微型子问题,通过递归求解各子问题后再将其解合并,从而高效得出原问题的解。

算法设计1分钟阅读
分治算法(Divide and Conquer)原理示意图
分治算法(Divide and Conquer)原理示意图

分治法(Divide and Conquer) 是计算机科学中最经典且高效的算法设计思想之一。它的核心思想可以总结为八个字:分而治之,逐个击破

简而言之,分治法就是将一个复杂的、规模庞大的问题,划分为若干个结构相同但规模较小的子问题;通过递归地解决这些子问题,最后将子问题的解合并,从而得到原问题的解。

无论使用分治法解决什么问题,通常都遵循以下三个步骤:

  1. 分解(Divide): 将原问题分解为若干个规模较小、相互独立且与原问题形式相同的子问题。
  2. 解决(Conquer): 递归地求解各个子问题。当子问题规模足够小(达到基线条件 / Base Case)时,直接得出答案。
  3. 合并(Combine): 将各个子问题的解逐步合并,构造出原问题的解。

许多耳熟能详的算法和数据结构操作本质上都是分治思想的应用:

  • 归并排序(Merge Sort): 将待排序数组从中间一分为二,递归排序左右两半,最后将两个有序子数组合并为一个有序数组。
  • 快速排序(Quick Sort): 选择一个基准元素(Pivot),将数组分为“小于基准”和“大于基准”两部分,再递归对两部分排序。
  • 二分查找(Binary Search): 每次将搜索区间减半,直到找到目标值(此问题中只需解决一个子问题,不需要合并步骤)。
  • 汉诺塔问题(Hanoi Tower):nn 个盘子从 A 挪到 C,分解为:先将 n1n-1 个盘子从 A 挪到 B,再将最大的 1 个盘子挪到 C,最后将 n1n-1 个盘子从 B 挪到 C。
  • Strassen 矩阵乘法: 将大矩阵拆分为小块矩阵,通过减少乘法次数将复杂度从 O(n3)O(n^3) 降低到大约 O(n2.81)O(n^{2.81})

一个问题能否用分治法高效解决,取决于它是否具备以下特征:

  • 可分解性: 原问题可以缩小到一定程度并容易解决。
  • 同质性: 分解出的子问题与原问题结构相同(即具备递归特征)。
  • 独立性: 各子问题之间互不重叠(如果子问题高度重叠,通常应使用动态规划)。
  • 可合并性: 子问题的解能够合并为原问题的解。

优点 缺点 / 挑战
简化复杂问题: 将大难题拆解为易处理的微型问题 递归开销: 频繁的递归调用会占用系统栈空间
便于并行计算: 各子问题相互独立,可天然在多核CPU/分布式节点上并行处理 合并复杂度: 若合并步骤设计不当,可能导致整体效率低下

© 2026 五五开 · 一方通行,只管向前。

旅途由 Astro 驱动 · 主题 Chirping Astro