二元搜索中等于的意义

时间:2015-07-11 10:34:03

标签: c++ search binary-search

我正在用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

如果找不到元素,是否可以保证元素可以插入的位置,以便列表仍然保持排序?使用等于或不等于?

时这是否有效

1 个答案:

答案 0 :(得分:0)

这取决于您如何计算变量r。 在你的情况下

r = a.size()-1;

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

如果您将r计算为r = a.size();正确用量为while(l<r)

  

如果找不到元素,则保证为该位置   其中可以插入元素,以便列表仍然存在   排序?

您没有对矢量进行排序,为了进行正确的二分查找,应在调用二进制搜索之前对矢量进行排序。

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

标头提供std::binary_search,所以改为重新发明轮子你可以按如下方式使用它:

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

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

  

使用等于或不等于?

时这是否有效

我在答案的第一部分对此进行了解释。