繁体   English   中英

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

[英]Why is the time complexity of this code O(N)?

我认为下面代码的时间复杂度是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. 由于有两个循环运行n次,因此时间复杂度为O(n ^ 2)。 arr[i] < arr[j]可能会影响while循环,但这并不重要。
  2. 时间复杂度为O(n * logn),因为while循环可能运行少于n次,因为在循环期间arr[j]可以小于arr[i] 结果, while循环将运行log(n)次。

您能否解释为什么我的答案是错误的,以及为什么正确的时间复杂度是O(n)?

for(i = 0; i < n; ++i)

循环n次。

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

总共循环最多n次。 请注意, j仅在i的整个循环中递增,因此它是一个内部循环并不能使其具有更高的阶数,因为在整个循环中它仍然只能从0变为n

所以它是O(2n) = O(n)

通常,要了解类似内容的流程,请尝试添加打印语句以了解流程,并在每个点上打印“ i”和“ j”。

在这种特定情况下,您知道外部for循环被触发了多少次,但尝试查看j可以增加多少次。 即使它在for循环中,其总迭代次数也可能是独立的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM