开始学习算法。我了解如何从“常规循环”中找到theta符号,例如
T(n) = Tf(n) + g(n)
。但是我在这个循环中迷失了方向:问题1-2e:
T(n) = T(√n) + Θ(lg lg n)
我该选择哪种方法来找到theta?这个循环是什么?我真的不太理解循环内符号的含义。
T(n) = Tf(n) + g(n)
。但是我在这个循环中迷失了方向:问题1-2e:
T(n) = T(√n) + Θ(lg lg n)
我该选择哪种方法来找到theta?这个循环是什么?我真的不太理解循环内符号的含义。
这是使用变量替换的好地方。我们从以下内容开始:
T(n) = T(√n) + Θ(log log n),
其中参数n按平方根因子衰减。当您看到像这样的东西时,一个常见的转换方法是通过设置S(m) = T(2m)来定义新的递归。如果我们在这里这样做,我们会得到以下结果:
S(m) = T(2m)
= T(√(2m)) + Θ(log log 2m)
= T(2m/2) + Θ(log m)
= S(m / 2) + Θ(log m).
换句话说,我们现在有了以下递归:
S(m) = S(m / 2) + Θ(log m).
由于我们不再有平方根项收缩事物,因此这个递归似乎更容易处理。特别地,这正好是主定理所处理的内容。具体而言,我们有a = 1,b = 2和d = 0。(为什么我们有d = 0?因为我们可以将Θ(log m)视为m0 Θ(log m))。然后,主定理告诉我们这个问题的解为:
S(m) = Θ((log m)2).
我们刚刚解决了递归S(m),但我们想要解决递归T(n)。我们如何将它们联系起来?嗯,由于S(m) = T(2m),我们可以 - 假设n是2的幂次方 - 将其重写为S(log n) = T(n)。然后,我们可以看到:
T(n) = S(log n)
= Θ((log log n)2),
这就是递归的解。
lnln(n)
而不是 O(lnln(n))
。这主要是为了缩短公式的长度,您可以完全使用大O符号。因此:
这意味着:
现在来转换这个大求和式,注意到lnln(n)
的求和可以转化为:
我们唯一的问题是找到n和k之间的某种联系,这可以很容易地从最新的T(...)项中推导出来。