Skip to content

分治法

Divide and conquer

把问题分成较小同类子问题,递归求解后合并结果的算法设计范式。

条目类型
原则

形式陈述

分治算法把规模为 n 的实例分成若干严格更小的子实例,递归求解并合并结果。正确性通常由递归结构或强归纳证明;运行时间常满足

T(n)=iT(ni)+g(n).

渐近记号和主定理是分析某些递推式的工具,不是理解分治策略形式陈述所必需的前置。

直觉

分治的核心不是“使用递归”本身,而是把实例拆成规模严格下降、结构相同且覆盖原问题的子问题,独立求解后再组合答案。真正决定效果的是三件事:子问题是否大致平衡、是否大量重叠、合并是否便宜;只要其中一项失控,递归写法未必带来效率。与动态规划相比,经典分治通常不复用重叠子问题。

分解树、子问题与结果合并
例子与边界

归并排序把数组均分、递归排序两半,再线性合并,递归式 T(n)=2T(n/2)+Θ(n)Θ(nlogn)。二分搜索只递归一个子问题,T(n)=T(n/2)+O(1)O(logn)

快速排序的子问题大小依赖枢轴,若枢轴总取到极端值,会形成 T(n)=T(n1)+Θ(n) 的二次退化,说明“递归减小”不等于“平衡分治”,不能机械套用平衡分割递推。若子问题高度重叠,如朴素 Fibonacci 递归,记忆化比重复分治更合适。

推论与应用

分治用于排序、几何、FFT 与选择;平面最近点对展示了“递归解两侧 + packing 证明线性合并”的几何版本。折半搜索把指数候选分成两半并在中间匹配,将典型 2n 枚举改成约 2n/2 的时间—空间权衡;它仍是 exact exponential 算法,不因“折半”变成多项式。

同一递归图像还能服务不同模型。对数方法动态化把静态结构按二进制块合并,以重建换取摊还更新;缓存无关模型通过递归布局在未知 B,M 下控制块传输;并行算法模型把相互独立的子问题同时执行,并分别分析工作与深度。设计时仍需证明分解覆盖、合并正确与递归终止,递归关系主定理和递归树只在已声明的成本模型内求解;动态规划则在子问题重叠时进一步共享状态。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022, Parts I–VI。
  • Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005, Chs. 1–13。
关系图谱12 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:使用

类型化关系