二进制搜索c ++与比较

时间:2013-06-11 16:01:01

标签: c++ binary-search

我想在排序的向量V上对c ++执行二进制搜索。 特别是,我对找到矢量条目的确切值不感兴趣。我想找到满足V [j-1]< = X<的条目的位置j。 V [j],其中X是输入值。

例如: 对于向量v = {1,4,7,12,17,55}和X = 8,函数应返回3.

我可以使用带有O(log(2))复杂度的STD函数binary_search吗?

怎么样?

非常感谢,

的Al。

3 个答案:

答案 0 :(得分:8)

标准函数是upper_bound和lower_bound。阅读这些

http://www.cplusplus.com/reference/algorithm/upper_bound/ http://www.cplusplus.com/reference/algorithm/lower_bound/

如果你稍微向下滚动这些页面,你会发现应该清楚说明的例子:)

答案 1 :(得分:4)

关于Bartosz联系的职能的说明:

  • upper_bound(begin, end, value)返回大于给定值的第一个元素。这是可插入的区间的 end (或一个接一个),并保留排序
  • lower_bound(begin, end, value)返回第一个元素不小于给定值。这是可插入区间的开头

所以在实践中:

std::vector<int> v = {1, 4, 7, 12, 17, 55};
int x = 8;
auto first = std::lower_bound(v.begin(), v.end(), x);
auto last = std::upper_bound(first, v.end(), x);

应该给first == last && *first == 12。这是因为可以插入[first,last)的半开间隔x为空。

请注意,这通常比您实际要求的更有用,因为

std::vector::insert(iterator, value)

给定迭代器之前插入,因此您始终可以在此处使用upper_bound的结果。

答案 2 :(得分:2)

根据您的要求,要使用的正确STL函数是upper_bound。语法:

upper_bound(V.begin(),V.end(),val)-V.begin()

将返回您寻找的基于0的索引。