想要分析递归线性搜索的复杂性(使用分而治之的技术)。是log(n)还是n?如果不是log(n)那么实际的复杂性是什么以及如何?
int linear_search(int *a,int l,int h,int key){
if(h == l){
if(key == a[l])
return l;
else
return -1;
}
int mid =(l+h)/2;
int i = linear_search(a,l,mid,key);
if(i == -1)
i = linear_search(a,mid+1,h,key);
return i;
}
答案 0 :(得分:2)
是的,是O(n)。但是这个算法没有意义。您所要做的就是遍历数组并查找是否找到了该算法正在执行的元素,但它不必要地复杂。
答案 1 :(得分:0)
是的,它搜索数组中的所有值直到找到它们,其时间复杂度为omega(n)。并且它看起来是在lg(n)中,但由于你的if(h == l)它搜索你的数组的所有值
答案 2 :(得分:0)
是的,这是O(n)。递归方法所做的只是一个循环,所以你最好使用一个真正的循环:
int linear_search(int *a,int l,int h,int key){
for (int i = l; i <= h; i++) {
if (a[i] == key) return i;
}
return -1;
}
如果你想使用递归来避免循环,有一种更糟糕的方法,有时会在显示递归的(坏)示例中找到:
int linear_search(int *a,int l,int h,int key){
if (l > h) {
return -1;
} else if (a[l] == key) {
return l;
} else {
return linear_search(a, l + 1, h, key);
}
}
它仍然是O(n),但它更糟糕,因为如果数组太大,它将填充堆栈。分而治之的方法至少不会比整数中的位数嵌套更深。