首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求解T(n)=2T(n/2)+nlogn的运行时间

求解T(n)=2T(n/2)+nlogn的运行时间
EN

Stack Overflow用户
提问于 2018-01-01 13:39:39
回答 2查看 7K关注 0票数 0

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)是不一样的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-01 14:16:10

你采取了正确的方法,我的朋友。不过有个小小的错误。

代码语言:javascript
复制
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)值放回

票数 1
EN

Stack Overflow用户

发布于 2018-01-01 14:25:01

好的,这里的错误在这一行中:

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

事实上,如果您让S(m)=T(2^m)/2^m,那么您将有S(m)=2S(m-1)+m,因为由2^(m-1)的除法。

经过这一更正,我们有:

代码语言:javascript
复制
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

这给了我们一般的形式:

代码语言:javascript
复制
S(m) = 2^m S(0) + m(m+1)/2

插回电源后,我们就有了:

代码语言:javascript
复制
T(2^m) = 2^m T(0) + m(m+1) 2^(m-1)

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

代码语言:javascript
复制
T(n) = nT(1) + n/2 (logn)(1 + logn) = O(n(logn)^2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48050136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档