【问题标题】: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 = 5k k 级每个节点的开销 = n/2k

但是无论我怎么努力,我都无法得到等于O(n<sup>log₂(5)</sup>)的总和,Matus的算法也是如此。

另外,有没有办法用主定理解决克里斯算法的运行时间?

【问题讨论】:

    标签: recursion big-o complexity-theory recurrence divide-and-conquer


    【解决方案1】:

    申请

    #levels = log₂(n) #of 节点 k = 5k k 级每个节点的开销 = n/2k

    你得到(使用geometric formula

    T(n) = Σk=0,...,log₂(n) 5k ⋅ n/2k = n ⋅ Σk=0,...,log₂(n) (5/2)k = n ⋅ (1 - (5/2)log₂(n)+1) / (1 - 5/2) = (n - n ⋅ (5/2) ⋅ 5log2(n) / 2log2(n)) / (1 - 5/2) = (n - n ⋅ (5/2) ⋅ 5log₂(n) / n) / (1 - 5/2) = (n - (5/2) ⋅ 5log₂(n)) / (1 - 5/2) = ((5/2) ⋅ 5log₂(n) - n) / (5/2 - 1) = ((5/2) ⋅ 5log₂(n) - n) / (3/2) = (5/3) ⋅ 5log2(n) - (2/3) ⋅ n ∈ Θ(5log2(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) ... = 2n⋅T(1) + 2n-1⋅Θ(1) + ... + 2⋅Θ(1) + Θ(1) = 2n+1⋅Θ(1) - 1 ∈ Θ(2n)

    这适用于T(1) ∈ Θ(1)

    【讨论】: