如何使用递归求解 T(n) = 5T(n/2) + O(nlogn)

How to solve T(n) = 5T(n/2) + O(nlogn) using recursion

所以这可能很愚蠢,但我坚持使用这种递归 T(n) = 5T(n/2) + O(nlogn)。我从 Master Theorem 知道它应该是 ,但我真的到不了那里。

到目前为止我达到了

我只是想知道我的方向是否正确

您绝对是在正确的轨道上!让我们看看是否可以简化该求和。

首先,请注意您可以从求和中提取 log n 项,因为它独立于求和。这给了我们

(n log n) (sum from k = 0 to lg n (5/2)k)

那个和是一个几何级数的和,所以它解为

((5/2)log n + 1 - 1) / (5/2 - 1)

= O((5/2)lg n)

在这里,我们可以使用(可爱的)恒等式 alogb c = clogb a 重写

O((5/2)lg n) = O(nlg 5/2)

= O(nlg 5 - 1)

将其代入我们的原始公式可以得到

n log n · O(nlg 5 - 1) = O(nlg 5 log n).

嗯,这不太奏效。不过,我们真的非常接近在这里工作的东西!一个很好的问题是 为什么 这不起作用,为此,我们必须首先回到您如何获得原始求和的问题。

让我们尝试使用递归方法展开递归T(n) 的一些项。第一次扩展给我们

T(n) = 5T(n / 2) + n log n.

下一个是有趣的地方:

T(n) = 5T(n / 2) + n log n

= 5(5T(n / 4) + (n / 2) log (n / 2)) + n log n

= 25T(n / 4) + (5/2) log (n / 2) + n log n

然后我们得到

T(n) = 25T(n / 4) + (5/2) log (n/2) + n log n

= 25(5T(n / 8) + (n / 4) log (n / 4)) + (5/2) log (n/2) + n log n

= 125T(n / 8) + (25/4)n log (n / 4) + (5/2) log (n/2) + n log n

这里的一般模式似乎是以下总和:

T(n) = sum from i = 0 to lg n (5/2)kn lg(n/2k)

= n sum from i = 0 to lg n (5/2)k lg(n/2k)

请注意,这不是您的原始总和!特别要注意的是,对数项不是 log n,而是一个增长速度比它慢得多的函数。事实上,随着 k 变大,对数项变得非常非常小。事实上,如果您考虑一下,我们唯一一次真正支付全部 lg n 成本是在 k = 0 时。

这里有一个可爱的小技巧,我们可以使用它来使这个总和更容易处理。 log 函数增长得非常非常慢,非常慢,事实上,我们可以说 log n = o(nε) 对于任何 ε > 0。那么如果我们尝试通过将 lg (n / 2k) 替换为 (n / 2k)ε[= 来上限求和90=] 对于一些非常小但正的 ε?那么,我们会得到

T(n) = n sum from i = 0 to lg n (5/2)k lg(n/2k)

= O(n sum from i = 0 to lg n (5/2)k (n / 2k)ε)

= O(n sum from i = 0 to lg n (5/2)k nε (1 / 2ε)k)

= O(n1+ε sum from i = 0 to lg n (5 / 21+ε))

这可能看起来像是某种魔法,但这种技术——用非常小的多项式代替原木——是一个很好的方法,可以放在你的后兜里。它往往会出现在很多情况下!

我们这里的表达方式可能看起来比我们开始时的表达方式差很多,但它会变得更好。假设我们选择的 ε 足够小——比如,5 / 21+ε 大于 1。然后,内部求和再次是几何级数的总和,因此我们将其简化为

((5/21+ε)lg n + 1 - 1) / (5/21+ε - 1)

= O((5/21+ε)lg n)

= O(nlg (5/21+ε)) (using our trick from before)

= O(nlg 5 - 1 - ε)

这很好,因为那时我们的整体运行时间是

T(n) = O(n1+ε nlg 5 - 1 - ε)

= O(nlg 5),

你已经有了上限!

总结一下:

  • 可以使用几何级数和的公式以及 alogb c = clogb a.

  • 但是,这不会给你一个严格的上限,因为你的原始总和与你从递归方法得到的结果略有不同。

  • 通过使用递归方法重复分析,您会得到更严格的总和,但更难求值。

  • 我们可以通过使用 log n = o(nε) 对于任何 ε > 0 的事实来简化求和,并用它来重新调整求和以使其更易于操作。

  • 有了这种简化,我们基本上使用与以前相同的技术重新进行分析 - 几何级数的总和,交换指数和对数中的项 - 以得出结果。

希望对您有所帮助!