【问题标题】:Significance of Equal To in Binary Search二分查找中等于的意义
【发布时间】:2015-09-30 02:47:07
【问题描述】:

我正在用 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 是可以插入元素的位置,以便列表仍然保持排序?这在使用等于或不使用等于时有效吗?

【问题讨论】:

  • 为什么要投反对票,这是个好问题,我展示了我尝试过的内容。
  • while(l&lt;r) 在您的实现中不起作用,因为最后一个向量元素不在搜索范围内。

标签: c++ search binary-search


【解决方案1】:

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

r = a.size()-1;

所以正确的用法是while(l&lt;=r)

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

万一元素没找到,l保证是位置 可以在其中插入元素以使列表仍然保留 排序?

你没有对你的向量进行排序,为了正确的二进制搜索,在调用二进制搜索之前应该对向量进行排序。

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

并且标头提供了std::binary_search,因此您可以按如下方式重新发明轮子:

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

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

这在使用等于或不使用等于时是否有效?

我在答案的第一部分解释了它。

【讨论】:

  • 非常感谢。那么,在这种情况下,list[r] 将被排除在搜索之外吗?请参阅问题2。谢谢。
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 2019-03-19
  • 2012-07-06
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
相关资源
最近更新 更多