为什么while循环不会给总时间复杂度贡献O(n)?

时间:2017-08-10 02:03:03

标签: algorithm time-complexity big-o

我从Interview Bit

我遇到了这个问题

问题

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

问题

while循环执行的比较总数约为n(可能小于或等于n,具体取决于arr)。循环运行n次。难道时间复杂度不应该是O(n ^ 2)吗?

4 个答案:

答案 0 :(得分:4)

while循环中的一个条件是while j < n。意味着最坏的情况,代码只会循环while循环n次,无论外for循环执行多少循环(j从零开始,只会增加,永远不会重置为零或减少)。由于for循环也循环n次,因此big-OO(n+n) => O(n)

注意:您可以安全地忽略其他条件arr[i] < arr[j],因为我们只考虑最坏情况下的运行时。

答案 1 :(得分:2)

此代码看起来有意设计为具有误导性。 while循环仅从0n运行一次,并且不会为外for循环的每次迭代重置。

答案 2 :(得分:2)

您需要计算最内层循环中的语句执行的总次数。

嵌套while循环对复杂性没有贡献,因为它只经过0n-1之间的值,即使这些值的步骤可能分布在不同的外循环的迭代。

循环的最里面的“有效负载”,即arr[i] < arr[j]j++,最多会执行n次,因为递增j是一条“单行道” “:它的值永远不会重置为零,所以一旦j到达n,循环的主体就不再执行了。

答案 3 :(得分:0)

实际上内部循环不依赖于“i”,因此如果“i”从0变为n-1,它将运行最多n次。

如果在循环'j'初始化为0之前,复杂度将为O(n ^ 2),然后在最坏情况下为每个'i'而循环将执行1 + 2 + 3 + ......当数组元素按降序排列时,.n-2 + n-1次= O(n ^ 2)。