Algorithm 递归线性搜索(使用分治技术)的复杂性是什么?

Algorithm 递归线性搜索(使用分治技术)的复杂性是什么?,algorithm,complexity-theory,time-complexity,divide-and-conquer,Algorithm,Complexity Theory,Time Complexity,Divide And Conquer,想要分析递归线性搜索的复杂性(使用分治技术)。它是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

想要分析递归线性搜索的复杂性(使用分治技术)。它是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; 
}

是的,它是O(n)。但是这个算法没有意义。你所要做的就是遍历数组,找出是否找到了元素,这就是这个算法所做的,但它不必要地复杂。

是的,它搜索数组中的所有值,直到找到它们,它的时间复杂度是ω(n)。它看起来是在lg(n)中,但由于if(h==l),它搜索数组的所有值

是的,它是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;
}
它仍然是O(n),但更糟糕的是,如果数组太大,它将填充堆栈。分而治之的方法至少不会比整数中的位数嵌套得更深。

在我看来是
O(n)
。。。但我懒得详细解释。
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);
  }
}