包含嵌套循环的代码的时间复杂度
Time-complexity of code containing nested loops
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
对于此伪代码,我必须根据 n 计算函数 f: N -> N。我是第一次做这样的事情,所以我什至不知道我的方法是否正确。所以,在第一行我有一个常数时间。 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
?
假设"to n"表示"the last value is 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))
如果 X
只是一个简单的操作 (O(1)
),则为 O(n^2)
。
P.S.:
如果您不确定常数是否影响最终结果,请尝试计算:
1 + 4*f(X)*(n-2)*(n-1)/2
lim ---------------------------
n->infinite f(X)*n^2
你会得到一个有限数(也就是说分子和分母是相似的)。
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
对于此伪代码,我必须根据 n 计算函数 f: N -> N。我是第一次做这样的事情,所以我什至不知道我的方法是否正确。所以,在第一行我有一个常数时间。 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
?
假设"to n"表示"the last value is 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))
如果 X
只是一个简单的操作 (O(1)
),则为 O(n^2)
。
P.S.:
如果您不确定常数是否影响最终结果,请尝试计算:
1 + 4*f(X)*(n-2)*(n-1)/2
lim ---------------------------
n->infinite f(X)*n^2
你会得到一个有限数(也就是说分子和分母是相似的)。