一个简单for循环的时间复杂度

  今天看到有这样一个循环

int count = 0;
for (int i = N; i > 0; i /= 2) {
    for (int j = 0; j < i; j++) {
        count += 1;
    }
}

  有人认为这个循环的时间复杂度应该是O(nlogn),但这是错的。

  他认为,外层循环的时间复杂度是O(nlogn),内层循环的时间复杂度是n,所以整个循环的复杂度是O(nlogn),他错误所在就是认为内部循环是循环全部数据,但实际上是内部循环的次数在外部循环执行后会减半。

  但正确的答案是O(n),让我们来算一下。外部循环从N开始,每次减半,这意味着第一轮是N,第二轮是N/2,第三轮是N/4,以此类推。所以我们有N + N/2 + N/4 + N/8…总共是2N个操作,由此可得复杂度是o(N)。

原文地址:https://www.cnblogs.com/MrZhaoyx/p/13038678.html