int j = 0;
for(int i = 0; i < n; ++i) {
while(j < n && arr[i] < arr[j]) {
j++;
}
}
这是一个用于查找数组中最小元素(第一次出现)的索引的代码。我说最坏的情况是O(n2)最好的情况是O(n)。
问题1:在最坏的情况下,我的内部while循环并不总是运行n次,在最多的情况下,它将相对于外部for循环运行1或2次,所以我假设内部循环运行(nc)次,其中c是一些常量,外部循环运行n次。我正确地认为复杂性是n *(nc)是O(n2)?
在最好的情况下,最小元素在第一个索引处,我的内部循环不会在任何时间运行,因此时间复杂度为O(n)。
问题2:我如何得出平均情况?
答案 0 :(得分:2)
您从j = 0
开始,永不递减j
。 while
循环的每次迭代都会将j
增加1,while
循环的条件为j < n
,因此语句j++
最多可以运行n
1}}次,即最坏情况O(n)。
答案 1 :(得分:1)
我们可以在找到Big O符号(why?)时忽略常量。
为了找到数组中最小元素的索引而编写的程序,当数组元素按递增顺序进行n次迭代,当数组元素按递减顺序进行2次n次迭代。但我们可以简单地得出结论,该算法在所有三种情况下都具有整体O(n)复杂度。