主定理涉及这种形式的递归关系:
T(n) = a * T(n/b) + f(n)
T 是递归过程,a 是我们将输入划分为的子问题的数量n,n/b 每个子问题的大小,`f(n) 是划分输入的成本分成子问题和结果的组合。
如果n == 0 则n/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)、a 和b 的复杂性。这取决于f(n) 的复杂性如何使用采用logb(a)(以a 为底的日志)的形式来表达。 0 的对数未定义,b > 0。
归结为,询问主定理是否适用于某些特定输入是没有意义的。此外,无论如何,主定理仍然成立,它只是指出,根据f(n),您可以对T 的复杂性提出一些主张。这取决于a 和b,所以如果没有这些信息,询问是没有意义的。如果您的f(n) 在基本情况之外也有 O(n^3)(n > 0),那么您可以根据 3 与a 和b 的关系来提出关于 T 的声明。例如,如果 3 < logb(a) 你可以确定 T 是 ϴ(n^(logb(a))。
假设你算法中的a是2^n,那么主定理就不能再用来说明T的复杂性了。
编辑
在你的问题编辑之后,你的递归过程的形式变成了这样:
T(n) = 2 * T(n/2) + f(n)
所以a == 2 和b == 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),这应该是正确的。