二进制搜索范围
Binary Search for a range
我正在制作二进制搜索程序,以查找某个范围内左值和右值之间的元素数量。
我给它编码:
#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;
}
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 有根的二进制搜索树.保留与其父级的链接
- 错误:未在此范围内声明'reverse'
- 变量未在此范围内声明 数组线性搜索
- C 中的快速范围搜索实现
- 如何在范围树中搜索
- 使用cctype库搜索函数,以查找某个范围内的数字字符数
- 是什么让这个二叉搜索更接近最大范围
- 二叉搜索以查找数字所在的范围
- 模板类C++符号范围搜索顺序不同
- 范围搜索的数据结构(重新访问)
- 使用std::equalrange来搜索某些范围内的向量
- 在字符串范围列表中搜索字符串
- 在搜索字符串时,Vector下标超出了范围
- 从范围的末尾开始搜索
- c ++二进制搜索排序的日期->我需要一个范围(CCA)
- 如何使用CGAL对三维点集进行范围搜索
- 在c++中搜索排序向量中的范围[x,y][使用lower_bound()和upper_bound()]
- 二进制搜索范围