如果基本情况不是在常量运行时运行但是在多项式运行时,主定理是否适用?

时间:2017-04-20 07:26:08

标签: algorithm time-complexity divide-and-conquer master-theorem

这是我的递归函数:

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定理在这里是否有效?如果,是的,我将如何写它?

1 个答案:

答案 0 :(得分:3)

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

  

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

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

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

  

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的基数b的日志)表示。 0的对数未定义,b> 0

归结起来,询问主定理是否适用于某些特定输入是没有意义的。此外,无论如何,主定理仍然存在,它只是声明,根据f(n),您可以对T的复杂性做出一些声明。这取决于ab,因此如果没有这些信息,则无需提问。如果您的f(n)在基本情况之外也有O(n ^ 3)(n> 0),那么您可以根据3与a和{{1 }}。例如,如果b你确定T是Θ(n ^(logb(a))。

假设算法中的3 < logb(a)a,那么主定理就不再用于说明T的复杂性了。

修改

编辑完问题后,递归过程的形式就变成了这样:

  

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

所以2^na == 2是你的情况下的参数,因为你将输入分成两个子问题,每个子问题得到的输入是递归的输入的一半。两个递归调用的组合是常量(一个简单的加法b == 2),问题的划分也是微不足道的,但是在你的情况下这个部分可以模拟一个Θ(n ^ 4)算法,用于将输入分成子问题:

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

注意它是Θ(n ^ 4),因为你说for i = 1 to n print(xyz(n)) 是Θ(n ^ 3)并且你在循环中重复n次。那么你的xyz(n)

主定理无法真正说明这一点。但是,如果f(n) = ϴ(n^4)(请注意这里的欧米茄),那么f(n) = Ω(n^4)(logb(a),其中b = 2,a = 2)。为了说明T的复杂性,现在必须要有另一个条件,规律性条件。它指出4 > log2(2)对于某些k <{1}}必须为真。 1和足够大的n。

这样就给了我们a * f(n/b) <= k * f(n)。对于k <0,这是正确的。 1/8。最后,我们要说明2 * f(n/2) <= k * f(n) T = ϴ(f(n))

如果你的f(n)(带有xyz调用的循环)可以被证明是Ω(n ^ 4)(再次注意omega而不是theta),则意味着最终部分为真。由于欧米茄是下限,而你的f(n)=Θ(n ^ 4),这应该是真的。