【问题标题】:Algorithm Recursive Formula Calculation算法递归公式计算
【发布时间】:2014-05-08 06:53:39
【问题描述】:

我有以下递归:

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

我需要知道确切的方程式,我知道 Master theorem 帮不了我。

请告诉我一般如何处理此类递归。我需要复杂性并了解如何解决此类问题。

提前致谢。

【问题讨论】:

  • 为什么你认为主定理对你没有帮助?你的确切问题是什么?一般来说,主定理是确定大多数(不是全部)递归调用的渐近运行时间的正确方法。
  • 你看到你的方程是T(n) = T(n) + O(n logn),这很奇怪吗?
  • @pkacprzak 根本不是这样。
  • @pkacprzak T(2*n / 3) + T(n / 3) != T(n)
  • @MatthewHerbst 主定理要求 2n/3 和 n/3 相同。您可以将 n/3 转换为 2n/3 以获得上限,就像 AbcAeffchen 所做的那样。

标签: algorithm complexity-theory recurrence


【解决方案1】:

主定理的推广是Akra-Bazzi method

假设你的 O(n log n) 真的是 Θ(n log n),我们有 g(x)=x log x, ai=1 for i=1 and i= 2、b1=2/3 和 b2=1/3。那么 b1p+b2p=1 当 p=1,g(u)/up+1=(log u)/u 有积分 (log²u)/2,T(x) 是 Θ(x log²x)。

【讨论】:

    【解决方案2】:

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

    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( n<sup>1.7095</sup> )。由于我们有,所以我们有O 而不是Θ

    2。方式:
    您可以“计算”调用树中的节点,在您的情况下它是二叉树。这棵树的最大深度为log<sub>3/2</sub>(n),因此它的节点少于2<sup>O(log n)</sup> = O(n)。每个节点都有一个O(n log n),所以你总共得到O(n) ⋅ O(n log n) = O(n² log n)

    当然,这是非常不准确的。如果我们将树分成两部分,我们可以做得更好:

    1. 1/2 ⋅ log n 深度以上的上部:O(2<sup>1/2 ⋅ log n</sup> ) = O( sqrt(n) ) 节点。 该节点的权重为O(n log n)
    2. 1/2 ⋅ log n 深度以下的下部:O(2<sup>log n</sup> - sqrt(n) ) = O(n) 节点。 该节点的权重为O(sqrt(n) log n)

    您总共获得:T(n) = O(sqrt(n)) ⋅ O(n log n) + O(n) ⋅ O(sqrt(n) log n) = O(n<sup>1.5</sup> log n)

    我希望这会有所帮助。

    编辑:O(n<sup>1.5</sup> log n) ⊂ O(n<sup>1.7095</sup>).

    编辑:您可以将O(n<sup>1.5</sup> log n) 写为O(n⋅sqrt(n)⋅log n)。正如@Teepeemm 所示,确切的复杂度是Θ(n log²(n)),它通过将因子sqrt(n) 替换为log(n) 来改进我展示的上限。

    【讨论】:

    • 用 T (2/3 n) + T (2/3 n) 替换 T (2/3 n) + T (n/3) 完全改变了结果。 T (n) = c * n * log^2 n 匹配递归公式就好了。
    • 当然,这两个结果都只是上限,但你可以在没有任何繁重理论的情况下得到它们,但要掌握定理
    猜你喜欢
    • 2018-12-12
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多