这是我的递归函数:
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定理在这里是否有效?如果,是的,我将如何写它?
答案 0 :(得分:3)
主定理涉及这种形式的递归关系:
T(n)= a * T(n / b)+ f(n)
T
是递归过程,a
我们将输入n
,n/b
分成每个子问题的大小和`f(n)的子问题的数量将输入划分为子问题的成本以及结果的组合。
如果n == 0
则n/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)
,a
和b
的复杂程度。这取决于f(n)
的复杂性如何使用logb(a)
(使用a的基数b的日志)表示。 0的对数未定义,b> 0
归结起来,询问主定理是否适用于某些特定输入是没有意义的。此外,无论如何,主定理仍然存在,它只是声明,根据f(n)
,您可以对T
的复杂性做出一些声明。这取决于a
和b
,因此如果没有这些信息,则无需提问。如果您的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^n
和a == 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),这应该是真的。