二进制搜索范围

时间:2014-03-13 06:33:42

标签: c++ algorithm binary-search

我正在制作二元搜索程序,以查找范围内左右值之间的元素数。

我编码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> arr(20);
int search(int value,int low,int high) 
{
  if (high <= low)
      return low;
  int mid = (low + high) / 2;

  if (arr[mid] > value)
      return search(value,low,mid-1);
  else
      return search(value,mid+1,high);
}


int main(){
int n;
cin>>n;
//ENTER SORTED ARRAY
for(int i=0;i<n;i++){
    cin>>arr[i];
}


int left;
cin>>left;
//RIGHT IS GREATER OR EQUAL TO LEFT
int right;
cin>>right;
cout<<search(right,0,n-1)-search(left,0,n-1)+1<<"\n";

}

它给出了某些范围的正确答案 但是对于一些人来说,如果N = 6并且数组为[1 3 5 8 10 13]并且将范围设为[5,9]则给出错误,那么它给出1作为答案,但它应该是2作为5和8都在范围内。

5 个答案:

答案 0 :(得分:2)

试试这个

int search(int value,int low,int high) 
{
if (high <= low)
  return low;
int mid = (low + high) / 2;
if(arr[mid]==value){      // add this line it would be work for you
    return mid;
}
if (arr[mid] > value)
  return search(value,low,mid-1);
else
  return search(value,mid+1,high);
}

并在main()中进行修正

cout<<search(right,0,n-1)-search(left,0,n-1)<<"\n";

答案 1 :(得分:1)

int search(int value,int low,int high) 
{
    if (high <= low + 1)
       return low;
    int mid = (low + high) / 2;

    if (arr[mid] > value)
       return search(value,low,mid);
    else
       return search(value,mid,high);
}

在你的主要功能中

cout<<search(right+1,0,n-1)-search(left,0,n-1)<<"\n";

答案 2 :(得分:0)

一个问题是,当arr[mid] == value时,你只需忽略它并递归到右边。

您需要在正确的范围内加入mid,或在mid时返回arr[mid] == value

我也看到重复的值(如果这些是可能的)是一个问题 - 当递归找到最左边的位置时,你需要找到第一个重复的值,当递归找到最右边的位置时,你需要找到最后一个重复的值,所以没有标志的单个函数指示我们正在做的那个不起作用。为了说明问题:

如果范围为[5,5]且输入为[1,2,5,5,5,6,8],则查找5位置的相同递归调用将始终返回相同5的位置,其中 - 你需要为左边的范围返回索引2,为右边的索引4,以获得3作为输出。

答案 3 :(得分:0)

没有检查arr[mid]可以是==值。在你的例子中,左= = 5的第一次迭代给出了中间==(0 +(6-1))/ 2 = 5/2 = 2而arr [2]正好是5.我们应该停止,但你的代码去了分支search(5, 3, 5);

答案 4 :(得分:0)

你的程序的逻辑似乎是错误的,如果你想找到[{1}}中[左,右]范围内的元素数量,试试这个:

arr

如果您坚持使用二进制搜索,请尝试以下操作:

 int i;
 int count = 0;
 for(i = 0; i < n; i++) {
     if (arr[i] >= left && arr[i] <= right)
         count++;
 }