问题
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)吗?
答案 0 :(得分:4)
while
循环中的一个条件是while j < n
。意味着最坏的情况,代码只会循环while
循环n
次,无论外for
循环执行多少循环(j
从零开始,只会增加,永远不会重置为零或减少)。由于for
循环也循环n
次,因此big-O
为O(n+n) => O(n)
注意:您可以安全地忽略其他条件arr[i] < arr[j]
,因为我们只考虑最坏情况下的运行时。
答案 1 :(得分:2)
此代码看起来有意设计为具有误导性。 while
循环仅从0
到n
运行一次,并且不会为外for
循环的每次迭代重置。
答案 2 :(得分:2)
您需要计算最内层循环中的语句执行的总次数。
嵌套while
循环对复杂性没有贡献,因为它只经过0
到n-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)。