簡體   English   中英

二進制搜索范圍

[英]Binary Search for a range

我正在制作二進制搜索程序,以查找范圍內Left和Right值之間的元素數。

我編碼:

#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且array為[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]可以==值。 在您的示例中,left == 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM