我有这个算法:
S(n)
if n=1 then return(0)
else
S(n/3)
x <- 0
while x<= 3n^3 do
x <- x+3
S(n/3)
2 * T(n/3) + n^3
是否为递归关系?
执行时间是T(n) = O(n^3)
吗?
答案 0 :(得分:2)
重复表达式是正确的。算法的时间复杂度为O(n^3)
。
重复发生在T(1)
停止。
为n = 27
运行示例有助于推导出一般表达式:
T(n) = 2*T(n/3)+n^3 =
= 2*(2*T(n/9)+(n/3)^3)+n^3 =
= 2*(2*(2*T(n/27)+(n/9)^3)+(n/3)^3)+n^3 =
= ... =
= 2*(2*2*T(n/27)+2*(n/9)^3+(n/3)^3)+n^3 =
= 2*2*2*T(n/27)+2*2*(n/9)^3+2*(n/3)^3+n^3
从这个例子中我们可以看到一般表达式由:
给出
相当于:
反过来,可以解决以下封闭形式:
此表达式中的主导词是(1/25)*27n^3
(2^(log_3(n))
是O(n)
,您可以将其视为2^(log(n)*(1/log(3)))
;删除常量1/log(3)
会{ {1}})因此,重复是2^log(n) = n
。
答案 1 :(得分:1)
2 * T(n/3) + n^3
是的,我认为这是正确的复发关系。
时间复杂度:
while x<= 3n^3 do
x <- x+3
时间复杂度为O(n ^ 3)。此外,在每个步骤,该函数调用自己两次与1/3 n。所以系列应该是
n, n/3, n/9, ...
添加每个深度后的总复杂度
n^3 + 2/27 * (n^3) + 4/243 * (n^3)...
本系列以k*n^3
为界,其中k
为常量。
证明:如果它被视为具有1/2因子的GP,那么总和 变成2 * n ^ 3。现在我们可以看到,每一步,因素都是 不断减少,不到一半。因此上限小于2 * n ^ 3.
所以在我看来,复杂性= O(n ^ 3)。