Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

分治法分析

了解了归并排序的实现原理和循环不变式,我们将要讨论归并排序的运行时间。

分而治之的特点是递归式的,所以我们一般采用分段函数,在 基线条件(Base Case) 和 一般条件 分别进行讨论。首先我们将数据规模定为 ,按照之前的定义,运行时间为 。对于一个常量 时,可以直接求解,运行时间总为常数时间。此时,基线条件就是 。一般条件下,我们要将其分为多个子问题,假设分成 个子问题,每个子问题的规模为原问题的 ,那么消耗的时间则为 。这个时候再加上合并()和分解问题()所需要的时间,就得到了递归式:

假定归并排序的输入规模 的幂次,此时分解总产生两个规模均为 的子问题,当(基线条件: )时,有:

  • 分解(Divide): 分解过程仅仅计算数组的中间项,需要常数时间,即
  • 解决(Conquer): 我们递归地求解两个规模均为 的子问题,将贡献 的运行时间。
  • 合并(Combine): 我们证过在一个具有 个元素的子数组上过程MERGE(即辅助函数)需要 的时间,所以

对于归并排序又恰知 ,即有递归式: 后面我们会学一个“主定理”,用它可得 1

: 等渐进符号底数通常可以忽略,如

为了直观地理解上递归式的解为什么是,我们并不需要主定理。把上递归式重写为: 其中常量代表求解规模为 的问题所需的时间(等价于),以及在分解步骤与合并步骤处理每个数组元素所需的时间。

该章节仍在编写,在 Github仓库 上提交PR以为本书 贡献内容


  1. 这里省略了底数,即此处的等价于。除非另有明确说明,这是算法分析中的默认约定(而非数学中的)。许多高效算法通常将问题一分为二,计算机科学中许多操作基于二进制,故非常有效。