Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用二进制搜索在排序数组中搜索键的前置项_Arrays_Algorithm_Binary Search - Fatal编程技术网

Arrays 使用二进制搜索在排序数组中搜索键的前置项

Arrays 使用二进制搜索在排序数组中搜索键的前置项,arrays,algorithm,binary-search,Arrays,Algorithm,Binary Search,对于排序的int数组,BS算法返回键的前一个 例如,给定数组{3,5,7,9,11},BS(15)=11,BS(9)=7。当数组中不存在前置时,可以定义算法的行为(例如BS(3))。我认为这个解决方案是二进制搜索算法的一个变种,但我无法得到正确的解决方案。这是我到目前为止得到的,它是不正确的: int BinarySearch5(vector<int> &data, int left, int right, int key) { // if pred does not e

对于排序的int数组,BS算法返回键的前一个

例如,给定数组{3,5,7,9,11},BS(15)=11,BS(9)=7。当数组中不存在前置时,可以定义算法的行为(例如BS(3))。我认为这个解决方案是二进制搜索算法的一个变种,但我无法得到正确的解决方案。这是我到目前为止得到的,它是不正确的:

int BinarySearch5(vector<int> &data, int left, int right, int key) {
  // if pred does not exist in the array, then return the smallest element in the array
  if (left >= right) {
    return left;
  } 
  int mid = left + (right - left) / 2;
  if (data[mid] >= key) {  // search left
    return BinarySearch5(data, left, mid - 1, key);
  } else {  // data[mid] < key, search right but including mid
    return BinarySearch5(data, mid, right, key);
  }
}
int-BinarySearch5(向量和数据、int-left、int-right、int-key){
//如果数组中不存在pred,则返回数组中最小的元素
如果(左>=右){
左转;
} 
int mid=左+(右-左)/2;
如果(数据[mid]>=key){//向左搜索
返回BinarySearch5(数据,左,中-1,键);
}else{//data[mid]<键,右键搜索,但包括mid
返回BinarySearch5(数据、中间、右侧、键);
}
}

如果键值大于向量中的最大值,则代码将出现分段错误。如果为向量
{3,5,7,9,11}
指定了键20,
BS(0,4)
将调用
BS(2,4)
,然后
BS(3,4)
,然后再次调用
BS(3,4)
。所以一旦
data[mid]>key
我们就知道
mid
是一个可能的答案。但是,如果有一个元素小于
data[mid]
,并且位于
mid
的右侧,则该元素的位置应该是答案

避免该问题的一种可能方法如下:将
mid
存储为答案。如果
BS(mid+1,r)
给出一个值
ind
,使得
data[ind]>key
,我们返回
ind
,而不是
mid
。否则返回
mid


int-BinarySearch5(向量和数据、int-left、int-right、int-key){
如果(左>=右){
左转;
}
int mid=左+(右-左)/2;
if(数据[mid]>=键){
返回BinarySearch5(数据,左,中-1,键);
}否则{
int t=BinarySearch5(data,mid+1,right,key);//查看此处的更改
返回数据[t]
int BinarySearch5(vector<int> &data, int left, int right, int key) {
  if (left >= right) {
    return left;
  }

  int mid = left + (right - left) / 2;
  if (data[mid] >= key) {
    return BinarySearch5(data, left, mid - 1, key);
  } else {
    int t = BinarySearch5(data, mid+1, right, key); // See the change here
    return data[t]<key? t:mid;
  }
}