如果基本情况不是在恒定运行时而是在多项式运行时运行,主定理是不是适用?

Posted

技术标签:

【中文标题】如果基本情况不是在恒定运行时而是在多项式运行时运行,主定理是不是适用?【英文标题】:Will master theorem be applicable if the base case is not running in constant runtime but in polynomial runtime?如果基本情况不是在恒定运行时而是在多项式运行时运行,主定理是否适用? 【发布时间】:2017-09-16 16:40:55 【问题描述】:

这是我的递归函数:

function abc(n):
    if n == 0 
    return xyz(n)

    for i = 1 to n 
        print(xyz(n))

return abc(n/2) + abc(n/2)

并且 xyz() 是 ϴ(n^3)。 Master定理在这里有效吗?如果,是,我将如何写?

【问题讨论】:

什么是 Theta(零立方)?? @MBo 这是 Theta(n 立方)。函数 xyz 的下限。 当n=0时,xyz(0)=Theta(0),不是吗? 也许你可以写出更多的递归函数,并说出你认为递归关系对于它的运行时是什么?目前很难知道你在问什么,因为这个问题似乎是基于“xyz(0) 在多项式时间内运行”的误解。 @PaulHankin - 我已经更新了它。你能讨论一下在上述情况下会发生什么吗? .谢谢! 【参考方案1】:

主定理涉及这种形式的递归关系:

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

T 是递归过程,a 是我们将输入划分为的子问题的数量nn/b 每个子问题的大小,`f(n) 是划分输入的成本分成子问题和结果的组合。

如果n == 0n/b 变为0,a 也是如此。这给我们留下了:

T(0) = 0 + f(0)

由于不再有递归,它基本上归结为f(0)。在您的假设情况下,这具有复杂性 ϴ(n^3)。

由于f(n) 是将n 划分为a 子问题和结果组合的成本,f(0) 通常的成本为 0 或常数。如果函数 f(n) 的复杂度为 ϴ(n^3),那么实际上对于 n == 0 这仍然导致输入大小的成本为 0。

主定理提供关于T(n) 的渐近界的信息,具体取决于f(n)ab 的复杂性。这取决于f(n) 的复杂性如何使用采用logb(a)(以a 为底的日志)的形式来表达。 0 的对数未定义,b > 0。

归结为,询问主定理是否适用于某些特定输入是没有意义的。此外,无论如何,主定理仍然成立,它只是指出,根据f(n),您可以对T 的复杂性提出一些主张。这取决于ab,所以如果没有这些信息,询问是没有意义的。如果您的f(n) 在基本情况之外也有 O(n^3)(n > 0),那么您可以根据 3 与ab 的关系来提出关于 T 的声明。例如,如果 3 < logb(a) 你可以确定 T 是 ϴ(n^(logb(a))。

假设你算法中的a2^n,那么主定理就不能再用来说明T的复杂性了。

编辑

在你的问题编辑之后,你的递归过程的形式变成了这样:

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

所以a == 2b == 2 是您案例中的参数,因为您将输入分成两个子问题,每个子问题的输入是执行递归的输入的一半。两个递归调用的组合是恒定的(一个简单的加法abc(n/2) + abc(n/2))并且问题的划分也很简单,但是在您的情况下,这部分可以模拟一个用于将输入划分为子问题的 ϴ(n^4) 算法:

for i = 1 to n 
    print(xyz(n))

请注意,它是 ϴ(n^4),因为您声明 xyz(n) 是 ϴ(n^3),并且您在循环中重复了 n 次。所以你的f(n) = ϴ(n^4)

主定理不能真正说明这一点。但是,如果f(n) = Ω(n^4)(请注意此处的欧米茄),那么4 > log2(2)(在您的情况下为 b = 2 和 a = 2 的 logb(a))。为了说明 T 的复杂性,现在必须满足另一个条件,正则性条件。它指出a * f(n/b) <= k * f(n) 对于某些 k

这给了我们2 * f(n/2) <= k * f(n)。这对于 k T = ϴ(f(n)),所以T = ϴ(n^4)

意味着如果您的 f(n)(带有 xyz 调用的循环)可以被证明是 Ω(n^4)(再次注意 omega 而不是 theta),则最后一部分是正确的。由于 omega 是下限,并且您的 f(n) = ϴ(n^4),这应该是正确的。

【讨论】:

我已经更新了我的问题,根据您的解释,整体复杂性不取决于基本情况,而是取决于 f(n)。这意味着主定理将在更新的问题中成立,我的运行时间将是ϴ(n^4)。并且递归方程将是 T(n) = 2*T(n/2) + n^4 。这是正确的吗? @talos1904 编辑了我的答案以从您的额外信息中推断。但是,在没有像我一样长时间脱离算法理论的人证实之前,不要把这些当成真理。 如果f(n) = ϴ(n^4)则表示f(n) = O(n^4)f(n) = Ω(n^4),这意味着上面的解释在f(n) = ϴ(n^4)时应该是正确的。对吗? 确实,f(n) = Ω(n^4) 源自f(n) = ϴ(n^4),再加上正则条件让我们声明T(n) = ϴ(n^4)。重要的部分是了解ab 参数,以及它们与函数f(n) 的复杂性之间的关系,该函数包含子问题的划分和结果的组合。至于基本情况,它不需要额外的递归,因此它会在可以“直接”获得结果的输入大小的某个阈值处切断。因此,即使您可以结束递归,例如 n = 3 而不是 n = 0,这仍然是 xyz 的硬上限。 是的!现在一切都说得通了。谢谢!!

以上是关于如果基本情况不是在恒定运行时而是在多项式运行时运行,主定理是不是适用?的主要内容,如果未能解决你的问题,请参考以下文章

在运行时将环境变量传递给 Vue 应用程序

运行时错误但项目编译正常 - 导入/使用缺失

windows的窗口最小化是在后台运行?

Gradle:在部署期间而不是在安装期间运行集成测试

如何判断表达式是在编译时还是运行时评估的?

sizeof 是在编译时还是运行时评估?