二分查找中等于的意义

Significance of Equal To in Binary Search

本文关键字:二分查找      更新时间:2023-10-16

我正在c++中实现二进制搜索。下面是我的代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int bs(vector<int> a, int val)
{
    int l =0, r = a.size()-1;
    while(l<=r) // Significance of ==
    {
        int mid = l + (r-l)/2;
        if(a[mid]==val) return mid;
        if(a[mid]>val)
        {
            r = mid-1; continue;
        }
        else
        {
            l = mid + 1 ;
        }
    }
   return l; // Deliberately returning this
}
int main()
{
  vector<int> a = {1,3};
  cout << bs(a,1) <<endl;
  return 0;
}

问题1

在一些实现中,我看到人们使用
while(l<r)

而有些则使用

while(l<=r)

偏好一种方式之间有概念上的区别吗?如果我不使用== ?

,任何可能的错误来源

问题2

如果没有找到元素,是否保证l是该元素可以插入的位置,从而使列表仍然保持排序?

这取决于您如何计算变量r

r = a.size()-1;

正确的用法是while(l<=r)

如果你计算r为r = a.size();,正确的用法是while(l<r)

如果没有找到元素,则保证l为位置可以在其中插入元素,使列表仍然保留排序?

你没有对vector进行排序,为了正确的二叉查找,vector应该在调用二叉查找之前进行排序。

std::sort(std::begin(a),std::end(a));

和header提供了一个std::binary_search,所以你可以像下面这样使用它:

   std::binary_search(std::begin(a),std::end(a),val);

二分查找应该返回向量中索引的值,如果它找到。但是不能保证它会提供下一个插入位置。

当使用equal to时是否有效?

我在回答的第一部分已经解释过了。