如何找到具有内循环的算法的最坏情况时间复杂度?

时间:2017-09-06 18:10:11

标签: algorithm time-complexity

假设我有一个包含两个for循环的代码:

int sum = 0;
for (int i = 1; i < N; i *= 2)
   for(int j = 0; j < i; j++)
      sum++;

我如何找到此代码的最坏情况时间复杂度?我已经看过很多关于找时间复杂度的教程,我理解它们。但是这个似乎与教程中的那些有点不同。

2 个答案:

答案 0 :(得分:3)

让我们做简单的数学运算。 每次迭代中i的值为1,2,4,8... (log N + 1) terms。在每次迭代中,内循环都会i次。添加i

的值

T(N)= 1 + 2 + ... +(log N + 1)个术语,即a = 1r = 2以及n = (log N + 1)

的GP

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)