【问题标题】:Master Theorem & Recurrences主定理和递归
【发布时间】:2017-10-20 17:00:54
【问题描述】:

我想知道如何解决这段代码的主定理:

unsigned long fac (unsigned long n ) {
    if (n == 1 )
        return 1;
    else
        return fact(n-1)*n;
}

所以基于我只有 1 次称自己为 a=1 的事实。除了该函数调用之外,没有其他任何东西,所以 O(n) = 1 也是如此。现在我正在为我的b挣扎。通常的一般公式是:

T(n) = a*T(n/2) + f(n)

在这种情况下,我不划分主要问题。新问题只需要解决 n-1 个问题。 b 现在是什么?因为我的重复是:

T(n) = 1*T(n-1) + O(1)

既然我不知道确切的 b,我现在如何使用主定理?

【问题讨论】:

    标签: math recursion computer-science recurrence master-theorem


    【解决方案1】:

    你可以通过改变变量来“作弊”。

    T(n) = S(2^n)。然后复发说

    S(2^n) = S(2^n/2) + O(1)
    

    我们重写

    S(m) = S(m/2) + O(1).
    

    根据 a=1, b=2 的 Master 定理,解是对数的

    S(m) = O(log m),
    

    意思是

    T(n) = S(2^n) = O(log 2^n) = O(n).
    

    反正递归更容易直接解决,用

    T(n) = T(n-1) + O(1) = T(n-2) + O(1) + O(1) = ... = T(0) + O(1) + O(1) + ... O(1) = O(n).
    

    【讨论】:

    • 这很聪明!出于好奇,在执行此技巧时,您是否不需要比主定理通常提供的对数基数更精确,因为常数因子会转化为多项式指数的差异?
    • @templatetypedef:我隐含地表示底数是 2,但这并不重要,因为 O 表示法有一个隐藏因素。在任何情况下,行为都是线性的。
    【解决方案2】:

    主定理不适用于这种特定的递归关系,但这没关系 - 它不应该适用于任何地方。您最常看到主定理出现在分而治之的循环中,您将输入拆分为输入原始大小的恒定分数的块,在这种特殊情况下,情况并非如此。

    要解决这种递归,您需要使用另一种方法,例如迭代方法或以不同的方式查看递归树的形状。

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      相关资源
      最近更新 更多