← 返回内容列表

分治思想:从归并排序到最近点对

分享本文
分治思想:从归并排序到最近点对

分治不只会排序。最近点对、Strassen 矩阵乘法、FFT 都是"分解—解决—合并"的同一套骨架。本文用一张图说明分治为什么是算法设计的通用范式。

分治三步走:分解 → 解决 → 合并① 分解 Divide把大问题拆成相同的小问题② 解决 Conquer小到可直接解就递归到底③ 合并 Merge把子解拼回原问题答案归并排序拆成两半 / 递归排 / 合并两有序段快速排序选基准 / 分区 / 拼回最近点对按 x 中线分 / 递归 / 跨中线校验

图:分治的通用骨架——几乎所有 Θ(n log n) 算法都长这样

分治的通用骨架只有三步:分解(Divide)把大问题拆成相同的小问题;解决(Conquer)小到能直接解就递归到底;合并(Merge)把子解拼回原答案。几乎所有 Θ(nlogn)\Theta(n\log n) 算法都长这样。

三个经典例子

归并排序:拆成两半 → 递归排 → 合并两有序段。
快速排序:选基准 → 分区 → 拼回。
最近点对:按 x 中线分平面 → 递归求左右最近对 → 跨中线只校验"窄带"内的点,合并代价降到 O(n)O(n)

参考代码:分治框架模板

def divide_and_conquer(problem):
    if base_case(problem):               # ② 解决
        return solve(problem)
    halves = split(problem)              # ① 分解
    subs = [divide_and_conquer(h) for h in halves]
    return merge(subs)                   # ③ 合并

def split(arr):
    mid = len(arr) // 2
    return arr[:mid], arr[mid:]

掌握这个骨架,你就拥有了一把"万能钥匙":遇到能天然拆分的问题,先想分治,再用主定理估复杂度。

关联推荐

评论 (0)

正文划词可点「问萝卜特」——自动发评论并由 AI 回复

加载评论中…

分治思想:从归并排序到最近点对 - 用可视化演示,真正搞懂 AI 与编程 | 必学必会