Find() 函数的复杂度是多少
What is the Complexity of Find() Function
我有两个版本的 find 函数,这两个版本都在数组中搜索一个整数值,return 它的位置(如果存在)。在最坏的情况下,函数 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;
}
首先,第一个版本在最坏的情况下执行 n 次迭代,并且在每次迭代中执行固定数量的操作。第二个版本在最坏的情况下执行 n / 2 次迭代,并且在每次迭代中,也执行恒定数量的操作,但常数更大。因此,没有理由认为第一个是 O(n) 而第二个是 O(n / 2).
无论如何,O(n) = O(n / 2)。由definition of O,O(n)表示有常数c1这样对于每个 n > n1,
f(n) < c1 n.
同理,O(n / 2)表示存在常数c2 这样对于每个 n > n2,
f(n) < c2 n / 2 = (c2 / 2) n.
因为对于任何 n > max(n1, n2) 不等式c1 = c2 / 2 成立,这两者中的每一个都暗示着另一个。
我有两个版本的 find 函数,这两个版本都在数组中搜索一个整数值,return 它的位置(如果存在)。在最坏的情况下,函数 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;
}
首先,第一个版本在最坏的情况下执行 n 次迭代,并且在每次迭代中执行固定数量的操作。第二个版本在最坏的情况下执行 n / 2 次迭代,并且在每次迭代中,也执行恒定数量的操作,但常数更大。因此,没有理由认为第一个是 O(n) 而第二个是 O(n / 2).
无论如何,O(n) = O(n / 2)。由definition of O,O(n)表示有常数c1这样对于每个 n > n1,
f(n) < c1 n.
同理,O(n / 2)表示存在常数c2 这样对于每个 n > n2,
f(n) < c2 n / 2 = (c2 / 2) n.
因为对于任何 n > max(n1, n2) 不等式c1 = c2 / 2 成立,这两者中的每一个都暗示着另一个。