【问题标题】:How to solve this recurrence function with substition method?如何用替换方法解决这个递归函数?
【发布时间】:2023-09-03 23:52:01
【问题描述】:

我有一个非常奇怪的函数,看起来像这样:

T(n) = 2T(n/2) + n* log2(n)

我需要用替换的方法来解决这个问题,但我无法得出任何决定性的答案。

我需要解决方案步骤和大 O

【问题讨论】:

    标签: algorithm math big-o substitution recurrence


    【解决方案1】:

    面对log时,像n = 2^kk = log2(n))这样的改变往往是一条出路:

    n = 2^k
    

    所以我们有

    T(2^k) = 2 * T(2^(k - 1)) + k * 2^k
    

    让我们看看是什么意思:

    T(2^k) = 2 * T(2^(k - 1)) + k * 2^k =
           = 2 * (2 * T(2^(k - 2)) + (k - 1) * 2^(k - 1)) + k * 2^k =
           = 4 * T(2^(k - 2)) + (k - 1) * 2^k + k * 2^k =
           = 4 * (2 * T(2^(k - 3)) + (k - 2) * 2^(k - 2)) + (k - 1) * 2^k + k * 2^k = 
           = 8 * T(2^(k - 3)) + (k - 2) * 2^k + (k - 1) * 2^k + k * 2^k = 
             ...
           = 2^k * T(0) + 2^k + 2 * 2^k + ... + k * 2^k =
           = 2^k * T(0) + 2^k (1 + 2 + ... + k) =
           = 2^k * T(0) + 2^k * k * (k + 1) / 2 =
           = 2^k * (T(0) + k * (k + 1) / 2) 
    

    是时候返回nn = log2(k)

    T(n) = n * (T(0) + log2(n) * (log2(n) + 1) / 2)
    

    O(n)而言,我们有

    O(T(n)) = O(n * (T(0) + log2(n) * (log2(n) + 1) / 2)) =
            = O(n * (const + log2(n)^2 / 2 + log2(n) / 2) =
            = O(n * log2(n)^2 / 2) =
            = O(n * log2(n)^2) =
            = O(n * log(n)^2) 
    

    所以,答案是

    O(T(n)) = O(n * log(n)^2)
    

    注意,由于log2(n) == log(n, b) / log(2, b) 是任意基数b > 1,我们可以使用log(n) 而不是log2(n)

    【讨论】:

    • 这很棒。我也达到了这一点,但是由于我们使用的是替换方法,因此我们假设 n = 2^k 并且我相信我们需要证明 T(2^k+1) 才能获得完整的解决方案。
    • @ammar albakri:从技术上讲,你可以为T(n + 1) == T(2^(k + 1))重写所有这些公式,但你为什么要这样做呢?我们已经解决了一般情况,我们找到了T(n),如果有人对n + 1 感兴趣,他可以将n + 1 放入公式中