【问题标题】:Big O Notation analysis using recursion tree使用递归树的大 O 表示法分析
【发布时间】:2015-06-14 10:08:57
【问题描述】:
一个问题来自:http://qpleple.com/divide-and-conquer/
算法比较
您是 Facebook 的产品经理,您团队中的三位工程师提出了这三种算法来检测 n=10 亿 Facebook 帐户列表中的虚假 Facebook 帐户。
Rakesh 解决问题的方法是将问题分成五个大小为一半的子问题,递归地解决每个子问题,然后在线性时间内组合解决方案。
Chris 通过递归求解两个大小为 n-1 的子问题,然后在恒定时间内组合解决方案来解决大小为 n 的问题。
Matus 解决大小为 n 的问题,方法是将它们分成 9 个大小为 n/3 的子问题,递归地解决每个子问题,然后在 O(n²) 时间组合解决方案
所以通过使用主定理,我发现:
- Rakesh 算法的运行时间为
O(n<sup>log₂(5)</sup>)
- Matus 算法的运行时间为
O(n<sup>2log(n)</sup>)
绘制递归树并使用:
Rasket 的算法有:
#levels = log₂(n)
#of 节点 k = 5
k
k 级每个节点的开销 = n/2
k但是无论我怎么努力,我都无法得到等于O(n<sup>log₂(5)</sup>)的总和,Matus的算法也是如此。
另外,有没有办法用主定理解决克里斯算法的运行时间?
【问题讨论】:
标签:
recursion
big-o
complexity-theory
recurrence
divide-and-conquer
【解决方案1】:
申请
#levels = log₂(n)
#of 节点 k = 5
k
k 级每个节点的开销 = n/2
k致
你得到(使用geometric formula)
T(n) = Σ
k=0,...,log₂(n) 5
k ⋅ n/2
k
= n ⋅ Σ
k=0,...,log₂(n) (5/2)
k
= n ⋅ (1 - (5/2)
log₂(n)+1) / (1 - 5/2)
= (n - n ⋅ (5/2) ⋅ 5
log2(n) / 2
log2(n)) / (1 - 5/2)
= (n - n ⋅ (5/2) ⋅ 5
log₂(n) / n) / (1 - 5/2)
= (n - (5/2) ⋅ 5
log₂(n)) / (1 - 5/2)
= ((5/2) ⋅ 5
log₂(n) - n) / (5/2 - 1)
= ((5/2) ⋅ 5
log₂(n) - n) / (3/2)
= (5/3) ⋅ 5
log2(n) - (2/3) ⋅ n ∈ Θ(5
log2(n))
现在你只需要显示5<sup>log₂(n)</sup> = n<sup>log₂(5)</sup>,大约一行就可以完成。
我为 Chris 得到的递归方程是
T(n) = 2⋅T(n-1) + O(1)
这不能通过使用主定理来解决,但是您可以将其扩展为一个总和并解决它:
T(n) = 2⋅T(n-1) + Θ(1)
= 2⋅(2⋅T(n-2)+ Θ(1)) + Θ(1)
= 2²⋅T(n-2) + 2⋅Θ(1) + Θ(1)
...
= 2
n⋅T(1) + 2
n-1⋅Θ(1) + ... + 2⋅Θ(1) + Θ(1)
= 2
n+1⋅Θ(1) - 1 ∈ Θ(2
n)
这适用于T(1) ∈ Θ(1)。