我有两个版本的find函数,它们都搜索数组中的整数值并返回其位置(如果存在)。在最坏的情况下,函数find1()
将搜索最多 N 元素另一方面find2()
函数将在最坏的情况下搜索 N / 2 元素。这是否意味着find2()
函数复杂度降低为 O(N / 2)?
我假设数组arr
包含非重复值。
功能:find1()
int find1(int value){
for (int i = 0; i < N; i++){
if (arr[i] == value){
return i;
}
}
return -1;
}
功能:find2()
int find2(int value){
for (int i = 0, j = N - 1; i <= j; i++, j--){
if (arr[i] == value){
return i;
}
if (arr[j] == value){
return j;
}
}
return -1;
}
答案 0 :(得分:3)
首先,第一个版本在最坏的情况下执行 n 迭代,并且在每次迭代中执行恒定数量的操作。第二个版本在最坏的情况下执行 n / 2 迭代,并且在每次迭代中,也执行恒定数量的操作,但是更大的常量。因此,没有理由认为第一个是 O(n),第二个是 O(n / 2)。
在任何情况下, O(n)= O(n / 2)。通过definition of O, O(n)意味着有一个常量 c 1 ,这样每个 n&gt; ; n 1 ,
f(n)&lt; c 1 n 。
类似地, O(n / 2)表示存在常量 c 2 ,因此对于每个 n&gt; n 2 ,
f(n)&lt; c 2 n / 2 =(c 2 / 2)n 。
因为任何 n&gt; max(n 1 ,n 2 )不等式适用于 c 1 = c 2 / 2 ,这两者中的每一个都暗示另一个。