[英]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)。
我不明白为什么会这样。
我的(愚蠢的)意见如下:
n
次,因此时间复杂度为O(n ^ 2)。 arr[i] < arr[j]
可能会影响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.