从一个流行的定义来看,一个循环或递归运行一定次数也被认为是O(1)。
例如,以下循环是O(1)
// Here c is a constant
for (int i = 1; i <= c; i++) {
// some O(1) expressions
}
时间如果循环变量以恒定量递增/递减,则循环的复杂性被视为O(n)。
例如,以下函数具有O(n)时间复杂度。
// Here c is a positive integer constant
for (int i = 1; i <= n; i += c) {
// some O(1) expressions
}
我对下面的例子感到有些困惑,这里让c = 5,根据O(1)定义,下面的代码变成了 - O(1)
for(int i = 0; i < 5 ; i++){
cout<<"Hello<<endl";
}
for(int i = 0; i < len(array); i+=2){
if(key == array[i])
cout<<"Element found";
}
for(int i =0;i < len(array) ; i++){
if(key == array[i])
cout<<"Element found";
}
但是当我们比较上面的两个例子时,它们都会变成O(n),或者第一个函数是定义为O(1)。循环运行常数次数意味着什么? < / p>
答案 0 :(得分:4)
假设len(array)
是b
,我们正在谈论[*],你的两个函数都是O(n)
。
函数2将执行if
n次(对于数组的每个元素一次),显然O(n)
。
另一方面,函数1将执行if
n/2
次(对于数组中的每个其他元素执行一次),导致运行时间为O(n*1/2)
,并且常数因子(在这种情况下为1/2
)通常在O表示法中省略,您将再次以O(n)
结束。
[*]为了完整起见,如果您的阵列具有固定大小,即。 len(array)
是常数,而且两个函数都是O(1)
。
答案 1 :(得分:1)
“循环运行一定次数”意味着循环运行的次数由上面的常数限制,即一个与程序输入无关的给定数字。
在函数1和2中都是(除非数组的长度是固定的,或者你可以证明它们永远不会比特定的常量更大,独立于输入)if
将执行一定的时间依赖于关于输入的大小,所以时间复杂度不能是O(1)。
“如果循环变量按常数增加/减少,则循环的时间复杂度被视为O(n)”是一种误导性的定义