为什么这段代码的时间复杂度为O(N)?

时间:2017-10-01 10:51:06

标签: c++ c algorithm time-complexity complexity-theory

我认为下面代码的时间复杂度是O(n ^ 2)或O(n * logn)。

int j = 0;

for(i = 0; i < n; ++i) {
    while(j < n && arr[i] < arr[j]) {
        j++;
    }
}

但是,答案页面显示为O(n) 我不明白为什么会这样 我(愚蠢)的意见如下:

  1. 时间复杂度为O(n ^ 2),因为有两个循环运行n次。 arr[i] < arr[j]可能会影响while循环,但这无关紧要。
  2. 时间复杂度为O(n * logn),因为while循环的运行时间可能少于n次,因为arr[j]在循环期间可能小于arr[i]。因此,while循环将运行log(n)次。
  3. 你能解释为什么我的答案错了,为什么正确的时间复杂度是O(n)?

2 个答案:

答案 0 :(得分:3)

SUM

循环for(i = 0; i < n; ++i) 次。

n

总共累计<{1}}次 。请注意,while(j < n && arr[i] < arr[j]) { j++; } 仅在n的整个循环中递增,因此它是一个内循环并不会使其更高阶,因为它仍然只能来自j } i为整套循环。

所以0 = n

答案 1 :(得分:0)

一般来说,要了解这样的流程,请尝试添加print语句以了解流程,打印&#39; i&#39;和&#39; j&#39;在每一点上。

在这种特定情况下,您知道触发外部for循环的次数,但尝试查看可以递增的总次数j。即使它位于for循环内,它的总迭代次数也可能是独立的。