求解T(n)=2T(n/2)+nlogn的运行次

Solving running time of T(n)=2T(n/2)+nlogn

我正在尝试以某种方式解决这个问题,我已经知道它的复杂性是 BigTheta(nloglogn),但是如果我执行以下操作,我不会得到相同的答案:

let m = logn
then n = 2^m
we get T(2^m) = 2T(2^(m-1))+(2^m)*m
multiply by 1/(2^m)
we get T(2^m)/2^m = 2T(2^(m-1))/2^m + m
= T(2^(m-1))/(2^(m-1)) + m

现在如果我让 S(m)=T(2^m)/2^m 我将有 S(m)=S(m-1)+m

现在我用回代法求解S(m)=S(m-1)+m

S(m) = S(m-1)+m=S(m-2)+(m-1)+m = S(m-3)+(m-2)+(m-1)+m = S(m-4)+(m-3)+(m-2)+(m-1)+m=... = S(m-k)+(m-k+1)+..+(m-3)+(m-2)+(m-1)+m = ... = S(1)+2+...+m = m(m-1)/2 = BigTheta(m^2)

插回 m=logn 我得到 BigTheta((logn)^2) 这是不一样的。

我的朋友,你遵循了正确的方法。不过有一点小错误。

S(m) = S(m-1) + m

这是正确的,我们得到 S(m) = BigTheta(m^2)

现在S(m) = T(2^m)/(2^m) = BigTheta(m^2)。这意味着 T(2^m) = T(n) = (2^m) * BigTheta(m^2).

放回我们得到的值T(n) = n*BigTheta(lognlogn) = BigTheta(n*lognlogn)

好的,所以这里的错误是在这一行:

Now if I let S(m)=T(2^m)/2^m I will have S(m)=S(m-1)+m.

事实上,如果你让S(m)=T(2^m)/2^m,那么你会得到S(m)=2S(m-1)+m,因为除以2^(m-1)

通过这次更正,我们有:

S(m) = 2S(m - 1) + m
     = 2S(2S(m - 2) + m) + m
     = 4S(m - 2) + (m − 1) + m
     = 4S(2S(m - 3) + (m - 2)) + (m − 1) + m
     = 8S(m - 3) + (m - 2) + (m - 1) + m

这给了我们一般形式:

S(m) = 2^m S(0) + m(m+1)/2

插回电源,我们有:

T(2^m) = 2^m T(0) + m(m+1) 2^(m-1)

然后我们可以重新插入 n:

T(n) = nT(1) + n/2 (logn)(1 + logn) = O(n(logn)^2)