循环运行的次数是否常数被认为是大 - 哦(1)?

时间:2016-09-16 15:28:46

标签: algorithm loops big-o

从一个流行的定义来看,一个循环或递归运行一定次数也被认为是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";
}

功能1:

for(int i = 0; i < len(array); i+=2){
    if(key == array[i])
         cout<<"Element found";
}

功能2:

for(int i =0;i < len(array) ; i++){
    if(key == array[i])
        cout<<"Element found";
}

但是当我们比较上面的两个例子时,它们都会变成O(n),或者第一个函数是定义为O(1)。循环运行常数次数意味着什么? < / p>

2 个答案:

答案 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)”是一种误导性的定义