【发布时间】:2017-06-09 05:01:49
【问题描述】:
我有两个版本的 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;
}
【问题讨论】:
-
两个版本似乎搜索相同数量的元素。第二个版本只是在循环中每次搜索两个元素。
-
是的,但循环将运行一半。它会降低整体复杂性吗?还是仍将其视为 O(N) 函数?我只是想弄清楚它是如何工作的。谢谢@Galik
-
他们都是 O(n)。
n/2与n在复杂性分析中相同。在这种情况下,情况会加倍,因为n/2案例中的每个操作都比n案例中的操作复杂两倍。 -
secon 循环运行了一半的次数,但执行了两倍的测试。所以一半乘以二 = 1。两者完全一样。
-
阅读任何一本称职的算法书籍,你就会得到复杂性的准确定义。
标签: c++ algorithm search time-complexity asymptotic-complexity