banner
NEWS LETTER

第二章:分治法 (Divide and Conquer)

Scroll down

一、 核心范式

1. 三步曲

  • 分解 (Divide):将原问题分解为若干个规模较小、相互独立、形式相同的子问题。
  • 解决 (Conquer):若子问题规模足够小则直接求解,否则递归求解
  • 合并 (Combine):将子问题的解合并为原问题的解。

2. 通用复杂度模型(主定理 版)


* :子问题个数
* :规模缩小倍数
* 合并步骤的时间复杂度指数(即非递归部分为


二、 基础经典算法(主定理直接应用)

  • 逻辑:在有序数组中,每次比较后排除一半元素。
  • 方程
  • 参数
  • 分析 (),属情况2
  • 结论

2. 大整数乘法 (Large Integer Multiplication)

  • 朴素分治
  • 优化分治:利用代数变换将乘法次数降至3次
    • 方程
    • 参数
    • 分析 (),属情况1
    • 结论

3. Strassen 矩阵乘法

  • 朴素分治
  • Strassen 优化:通过线性组合将乘法次数降至7次
    • 方程
    • 参数
    • 分析 (),属情况1
    • 结论

4. 循环赛日程表 (Round Robin Schedule)

  • 核心逻辑
    • 左上角:递归求解的子问题
    • 右上角:左上角元素
    • 左下角:右上角的对角线镜像
    • 右下角:左上角的对角线镜像
  • 复杂度:时间 ,空间

三、 排序算法(重点对比)

1. 归并排序 (Merge Sort)

  • 逻辑:递归拆分 → 有序合并(线性扫描)
  • 方程
  • 分析,属情况2
  • 结论
  • 特点稳定排序,空间复杂度 (非就地)

2. 快速排序 (Quick Sort)

  • 逻辑:选择基准 → 划分分区 → 递归排序
  • 最好/平均情况
  • 最坏情况(如输入已有序)
  • 特点不稳定,平均性能快,就地排序(栈空间

四、 进阶难点(理论证明考点)

1. 线性时间选择:BFPRT 算法

  • 问题:在无序数组中找第 小的数
  • 对比
    • 随机快选:期望 ,最坏
    • BFPRT确定性

BFPRT 算法步骤(必背)

  1. 分组:每5个元素一组
  2. 组内排序:找出每组中位数
  3. MoM:递归找出“中位数的中位数”作为基准
  4. 划分:用基准进行划分

时间复杂度证明(核心)

  • 递归方程
    • :找 MoM 的代价
    • :处理最坏子问题的代价
  • 分析:系数和 ,形成收敛几何级数
  • 结论

2. 最接近点对 (Closest Pair of Points)

  • 问题:二维平面 个点,找距离最近的一对
  • 方程
  • 复杂度

合并步骤的优化证明(鸽巢原理)

  1. 窄带筛选:只考虑距离分割线水平距离 的点
  2. 排序:将窄带内点按 坐标排序(预排序优化)
  3. 6点定理
    • 对于任意点 ,只需检查其后6个点
    • 证明:在 矩形内,若超过6个点则必有两点距离 ,与 定义矛盾
    • 保证了合并步骤是 而非

五、 灵活应用(面试级题目)

1. 两个等长升序数组的中位数

  • 思路:比较两个数组的中位数
    • ,直接返回
    • ,则解在 Array1 右半部和 Array2 左半部
    • 每次丢弃一半,递归求解
  • 复杂度

2. 寻找缺失的整数(0~100)

  • 方法1:求和作差(
  • 方法2:异或运算(
  • 方法3:二分查找(如果有序,

3. 寻找出现奇数次的数

  • 思路:利用异或性质
  • 方法:所有元素异或一遍,结果即为所求
  • 复杂度

六、 分治法复习清单

1. 计算能力

  • 给定递归式(如 ),能快速用主定理算出复杂度

2. 理论证明(重点)

  • BFPRT:为什么是 ?(关键在于切分比例保证)
  • 最接近点对:为什么只需检查6个点?(鸽巢原理)

3. 代码逻辑

  • 归并排序的 Merge 过程
  • 快速排序的 Partition 过程

4. 算法对比

算法 时间复杂度 空间复杂度 特点
二分搜索 有序数组查找
大整数乘法 3次乘法优化
Strassen 7次乘法优化
归并排序 稳定、非就地
快速排序 平均 不稳定、就地
BFPRT 确定性选择
最近点对 鸽巢原理优化

本章要点:分治法通过“分而治之”将复杂问题分解,关键在于分解策略合并优化。重点掌握主定理应用、排序算法对比,以及BFPRT和最近点对的理论证明。

如果您喜欢我的文章,可以考虑打赏以支持我继续创作.

其他文章
目录导航 置顶
  1. 1. 一、 核心范式
    1. 1.1. 1. 三步曲
    2. 1.2. 2. 通用复杂度模型(主定理 版)
  2. 2. 二、 基础经典算法(主定理直接应用)
    1. 2.1. 1. 二分搜索 (Binary Search)
    2. 2.2. 2. 大整数乘法 (Large Integer Multiplication)
    3. 2.3. 3. Strassen 矩阵乘法
    4. 2.4. 4. 循环赛日程表 (Round Robin Schedule)
  3. 3. 三、 排序算法(重点对比)
    1. 3.1. 1. 归并排序 (Merge Sort)
    2. 3.2. 2. 快速排序 (Quick Sort)
  4. 4. 四、 进阶难点(理论证明考点)
    1. 4.1. 1. 线性时间选择:BFPRT 算法
    2. 4.2. 2. 最接近点对 (Closest Pair of Points)
  5. 5. 五、 灵活应用(面试级题目)
    1. 5.1. 1. 两个等长升序数组的中位数
    2. 5.2. 2. 寻找缺失的整数(0~100)
    3. 5.3. 3. 寻找出现奇数次的数
  6. 6. 六、 分治法复习清单
    1. 6.1. 1. 计算能力
    2. 6.2. 2. 理论证明(重点)
    3. 6.3. 3. 代码逻辑
    4. 6.4. 4. 算法对比
请输入关键词进行搜索