d=log_b(a) 情况的主定理解
Posted
技术标签:
【中文标题】d=log_b(a) 情况的主定理解【英文标题】:Master theorem solution for the case d=log_b(a) 【发布时间】:2021-09-20 22:14:35 【问题描述】:来自Dasgupta's Algorithms:如果分治算法的运行时间用递归T(n)=aT(n/b)+O(n^d)
来描述,那么它的解是:
T(n)=O(n^d)
如果d>log_b(a)
T(n)=O(n^log_b(a))
如果d<log_b(a)
T(n)=O(n^d*log_2(n))
如果d=log_b(a)
每个子问题的大小在下一次递归调用中减小b
,a
是分支因子,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)
【问题讨论】:
【参考方案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) 的东西是不寻常的,因为这里的日志库无关紧要,只是有贡献到(已经隐藏的)常数因子。
【讨论】:
以上是关于d=log_b(a) 情况的主定理解的主要内容,如果未能解决你的问题,请参考以下文章