i := n;
WHILE i > 1
FOR j := i to n DO
X;
END
FOR j := 3*i to 3*n DO
X;
END
DEC(i); (* i decrement *)
END
对于这个伪代码,我必须计算函数f:N - > N,取决于n。我第一次做这样的事情,所以我甚至不知道我的方法是否正确。所以,在第一行我有1个恒定的时间。 while循环运行n-1次+ n次比较,n-1恒定时间减少。第一个for循环运行n-i + 1次。第二个for循环运行3n-3i + 1次。 所以(我认为)那就是公式:f(n)= 1 +((n-1)+ n +(n-1))*((n-i + 1)+(3n-3i + 1))那将是f(n)= 12n ^ 2 -12ni -2n + 8i -3
但现在我有n
和i
个变量?如何摆脱i
?
答案 0 :(得分:0)
我们假设"到n"意味着"最后一个值是n-1" (在时间复杂度方面并不重要 - 请参阅最终解释)。
让f(X)
=运行时间复杂度X
。
总时间是:
1 +
0 + 0 + // i=n
f(X) + 3*f(X) + // i=n-1
2*f(X) + 6*f(X) + // i=n-2
3*f(X) + 9*f(X) + // i=n-3
...
(n-2)*f(X) + 3*(n-2)*f(X) // i=2
------------------------------
1 + 4*f(X) + 8*f(X) + 12*f(X) + ... + 4*(n-2)*f(X)
此总和等于:
1 + 4*f(X)*(1+2+3+...+n-2) = 1 + 4*f(X)*(n-2)*(n-1)/2
但常数不会影响该功能的趋势=>结果是:
O(2*f(X)*(n-2)(n-1)) = O(f(X)*(n^2))
如果O(n^2)
只是一个简单的操作(X
),则 O(1)
。
P.S。:
如果您不确定常数不会影响最终结果,请尝试计算:
1 + 4*f(X)*(n-2)*(n-1)/2
lim ---------------------------
n->infinite f(X)*n^2
并且您将获得有限数字(这意味着分子和分母是相似的)。