【问题标题】:Master theorem solution for the case d=log_b(a)d=log_b(a) 情况的主定理解
【发布时间】:2021-09-20 22:14:35
【问题描述】:

来自Dasgupta's Algorithms:如果分治算法的运行时间用递归T(n)=aT(n/b)+O(n^d)来描述,那么它的解是:

  1. T(n)=O(n^d) 如果d>log_b(a)
  2. T(n)=O(n^log_b(a)) 如果d<log_b(a)
  3. T(n)=O(n^d*log_2(n)) 如果d=log_b(a)

每个子问题的大小在下一次递归调用中减小ba 是分支因子,O((n/b^k)^d) 是每个子问题在k 级别上划分和组合子问题的时间。

案例 1 和 2 很简单——它们取自在对递归树的每一级所做的工作求和时形成的几何级数,即 a^k*O((n\b^k)^d)=O(n^d)*(a/b^d)^k

在案例 3 中,log_2(n) 来自哪里?当d=log_b(a)时,比值a/b^d等于1,因此系列之和是n^d*log_b(a),而不是n^d*log_2(n)

【问题讨论】:

    标签: algorithm recursion time-complexity recurrence divide-and-conquer


    【解决方案1】:

    作为一个更简单的例子,首先注意 O(log n)、O(log137 n) 和 O(log16 n) 的含义相同。其原因是,通过对数基公式的变化,对于任何固定常数 m,我们有

    log_m n = log n / log m = (1 / log m) · log n = O(log n)。

    主定理假设 a、b 和 d 是常数。从对数基公式的变化,我们得到了

    从这个意义上说,O(nd logb n) = O(nd log n),因为 b 是一个常数在这里。

    作为注释,看到写成 O(nd log2 n) 的东西是不寻常的,因为这里的日志库无关紧要,只是有贡献到(已经隐藏的)常数因子。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多