【问题标题】:How to solve T(n) = 2*T(n/2) + n*log(n) using recursive tree?如何使用递归树求解 T(n) = 2*T(n/2) + n*log(n)?
【发布时间】:2020-09-03 18:11:12
【问题描述】:

我有一个重复关系,如下所示:

T(n) = 2T(n/2) + nlog(n)

我正在使用递归树方法来解决这个问题。最后,我想出了以下等式:

n(log(n/2^0) + log(n/2^1) + log(n/2^2) + ....+ log(n/2^(log n)))*

在求解这个方程时,我得到的时间复杂度为 n(log n)^2 但是通过使用 ma​​ster's theorem 我得到了时间复杂度为 n(log(log n)) 请帮我找出我的错误。

【问题讨论】:

    标签: algorithm time-complexity recurrence logarithm master-theorem


    【解决方案1】:

    让我们来看看你在这里的方程式:

    n(log(n/20) + log(n/21) + log(n/22) + ... + log(n/2log n))

    现在,让我们使用对数的性质将 log(n / 2k) 重写为 log n - log 2k。这给了我们

    n((log n - log 20) + (log n - log 21) + (log n - log 22) + ... + log n - (log 2log n))

    对数的另一个属性告诉我们 log 2k = k log 2。此处未指定对数基数,因此为简单起见,我将假设它们是基数为 2 的对数.这意味着 log 2k = k。这意味着我们有这个表达式:

    n((log n - 0) + (log n - 1) + (log n - 2) + ... + (log n - log n))

    = n(log n + (log n - 1) + (log n - 2) + ... + 2 + 1 + 0)。

    您可能会将此内部和识别为高斯和:0 + 1 + 2 + 3 + ... + k = k(k+1) / 2。这意味着这个和简化为

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

    = Θ(n log2 n).

    这与主定理所说的相符。这是个好消息!

    【讨论】:

      【解决方案2】:

      你错了。你也会 git n log^2(n) = n * log(n) * log(n) (在 seocnd 的情况下)。查看更多详情here(案例 2a)。

      我们知道a = b = 2 表示c_crit = 1。因此作为f(n) = n log(n) = Theta(n log(n)),它的意思是k = 1 > -1。

      【讨论】:

        【解决方案3】:

        Master Theorem 不适用于此循环,因为合并成本(循环中的 n * Log(n))必须是 n 的幂。

        但是,如果您将 n * Log(n) 设为 n2 的上限,则可以应用主定理。在这种情况下,它将产生 n2 Log(n) 的复杂度。

        此外,由于我们对合并成本采取了更宽松的限制,因此这种复杂性也更宽松。您的 n * Log2(n) 的复杂性可能更正确/更严格。

        【讨论】:

        • 主定理的一个版本允许在表达式的加法部分使用对数项,您可以在此处应用它。但是,根据 OP 正在学习的主定理的版本,该工具可能在此处不可用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        • 2013-09-19
        • 2012-10-17
        • 1970-01-01
        相关资源
        最近更新 更多