假设我有一个包含两个for循环的代码:
int sum = 0;
for (int i = 1; i < N; i *= 2)
for(int j = 0; j < i; j++)
sum++;
我如何找到此代码的最坏情况时间复杂度?我已经看过很多关于找时间复杂度的教程,我理解它们。但是这个似乎与教程中的那些有点不同。
答案 0 :(得分:3)
让我们做简单的数学运算。
每次迭代中i
的值为1,2,4,8... (log N + 1) terms
。在每次迭代中,内循环都会i
次。添加i
T(N)= 1 + 2 + ... +(log N + 1)个术语,即a = 1
和r = 2
以及n = (log N + 1)
T(N)= a [(r n -1)/(r-1)]
= 1 [(2 (logN + 1) -1)/(2-1)]
= 2N - 1
= O(N)
因此在所有情况下复杂度都是O(N)。
答案 1 :(得分:1)
首先考虑N=2^k+1
对于某个整数k
的更简单的情况。在这种情况下,外部循环具有k
次迭代,并且操作的总数为
T(N) = 1 + 2 + 4 + ... + 2^k = 2^(k+1) - 1 = 2N - 3.
因此最坏情况的复杂性至少为O(2N - 3) = O(N)
。
现在假设某些2^k + 1 < N <= 2^(k+1)
为k
。然后
T(N) = 1 + 2 + 4 + ... + 2^k = 2^(k+1) - 1 < 2N = O(N)
因此T(N) = O(N)
。