社区讨论

主定理狗都不学

学术版参与者 29已保存回复 37

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
37 条
当前快照
1 份
快照标识符
@lo83p02a
此快照首次捕获于
2023/10/27 12:15
2 年前
此快照最后确认于
2023/10/27 12:15
2 年前
查看原帖
略标题党。借用了前一个的标题。

解决递归式时间复杂度题目的老方法

验证仍然是带有一点不靠谱的,实际上可以采用更加靠谱和直接的办法:
暴力递归
以下是使用暴力递归法来解前一个的三个例子:
例 1
T(n)=4nT(n)+n=16n3/4T(n1/4)+4n+n==n(1+4++4log2log2n)=O(nlog2n)\begin{aligned}T(n)&=4\sqrt nT(\sqrt n)+n\\&=16n^{3/4}T(n^{1/4})+4n+n\\&=\cdots\\&=n(1+4+\cdots+4^{\log_2\log_2 n})\\&=O(n\log^2 n)\end{aligned}
众所周知,把 nn 开根到 11 为止的次数是 log2log2n\log_2\log_2 n
例 2
T(n)=T(n/2)+nlogn=T(n/4)+nlogn+(n/2)log(n/2)==nlogn+(n/2)log(n/2)+2nlogn\begin{aligned}T(n)&=T(n/2)+n\log n\\&=T(n/4)+n\log n+(n/2)\log(n/2)\\&=\cdots\\&=n\log n+(n/2)\log(n/2)+\cdots\\&\le 2n\log n\end{aligned}
log(n/2k)\log(n/2^k) 全部放成 logn\log n,然后等比数列求和。
例 3
T(n)=3T(n/2)+4T(n/4)+n\begin{aligned}T(n)&=3T(n/2)+4T(n/4)+n\end{aligned}
不妨设 n=2kn=2^{k},记 T(2k)=fkT(2^k)=f_k,那么 fk=3fk1+4fk2+2kf_k=3f_{k-1}+4f_{k-2}+2^k
gk=fk+2k+1/3g_k=f_k+2^{k+1}/3,那么 gk=3gk1+4gk2g_k=3g_{k-1}+4g_{k-2}
容易看出 gk=a4k+b(1)kg_k=a4^k+b(-1)^k(高中数学竞赛基础内容,瞪眼也能看出来)
所以 T(2k)=a4k+b(1)k2k+1/3=O(4k)T(2^k)=a4^k+b(-1)^k-2^{k+1}/3=O(4^k),所以 T(n)=O(n2)T(n)=O(n^2)

虽然其实是非常正常和直接的思路,但是好像很多人不会这种东西。
计算量不会很大的。

回复

37 条回复,欢迎继续交流。

正在加载回复...