二进制搜索范围

Binary Search for a range

本文关键字:范围 搜索 二进制      更新时间:2023-10-16

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

我给它编码:

#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都在范围内。

尝试这个

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";
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";

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

您需要在右侧范围中包含mid,或者如果是arr[mid] == value,则返回mid

我也看到重复的值(如果可能的话(是一个问题——当递归找到最左边的位置时,你需要找到第一个重复的值,当递归找到最近的位置时你需要找到最后一个重复值,所以一个没有标志的函数是不起作用的。举例说明问题:

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

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

程序的逻辑似乎是错误的,如果你想找到arr中在[left,right]范围内的元素数量,请尝试以下操作:

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

如果你坚持使用二进制搜索,试试这个:

static int search(int value,int low,int high) 
{
    if (high <= low)
        return low;
    int mid = (low + high) / 2;
    if (arr[mid] == value)
        return mid;
    int idx;
    if (arr[mid] > value) 
        idx = search(value,low,mid-1);
    else 
        idx = search(value,mid+1,high); 
    if (value == arr[idx]) {
        return idx;
    }
    else {
        if(value > arr[idx])
            return mid +1;
        else
            return mid;
    }
}