算法递归公式计算

时间:2014-05-08 06:53:39

标签: algorithm complexity-theory recurrence

我有以下递归:

T(n) = T(2*n / 3) + T(n / 3) + O(n log n)

我需要知道确切的等式,我知道Master定理不会帮助我。

请告诉我如何进行此类递归。我需要复杂性并理解如何解决这些问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用简化来获得上限。

<强> 1。方式:

T(n) = T(2/3 ⋅ n) + T(1/3 ⋅ n) + O(n log n)
     ≤ T(2/3 ⋅ n) + T(2/3 ⋅ n) + O(n log n)
     = 2 T(2/3 ⋅ n) + O(n log n)

现在你可以使用主定理。这应该给你O( n1.7095 )。由于我们有,我们确实有O而不是Θ

<强> 2。方式:
你可以计算&#39;调用树中的节点,在您的情况下是二叉树。此树具有最大深度log3/2(n),因此它具有少于2O(log n) = O(n)个节点。每个节点都有一个O(n log n),因此总共得到O(n) ⋅ O(n log n) = O(n² log n)

当然,这非常难以理解。如果我们将树分成两部分,我们可以做得更好:

  1. 1/2 ⋅ log nO(21/2 ⋅ log n ) = O( sqrt(n) )个节点深度以上的上半部分。 此节点的权重为O(n log n)
  2. 低于1/2 ⋅ log nO(2log n - sqrt(n) ) = O(n)个节点深度的部分。 此节点的权重为O(sqrt(n) log n)
  3. 总得到:T(n) = O(sqrt(n)) ⋅ O(n log n) + O(n) ⋅ O(sqrt(n) log n) = O(n1.5 log n)

    我希望这会有所帮助。

    编辑:O(n1.5 log n) ⊂ O(n1.7095)

    编辑:您可以将O(n1.5 log n)写为O(n⋅sqrt(n)⋅log n)。正如@Teepeemm所示,确切的复杂性为Θ(n log²(n)),通过将因子sqrt(n)替换为log(n)来改善我所显示的上限。

答案 1 :(得分:1)

主定理的推广是Akra-Bazzi method

假设你的O(n log n)实际上是Θ(n log n),我们有g(x)= x log x,a i = 1 i = 1且i = 2,b 1 = 2/3,b 2 = 1/3。然后b 1 p + b 2 p = 1当p = 1,g(u)/ u < sup> p + 1 =(log u)/ u有积分(log²u)/ 2,T(x)是Θ(xlog²x)。