理解C ++算法二进制搜索背后的工作的问题

时间:2014-02-09 10:24:14

标签: c++ arrays algorithm binary-search

我正在查看algorithms列表并决定查看find方法

查找方法

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}

似乎查找的运行时间为Big O(n),因为它遍历容器中的每个元素以查找值。

我的想法立刻想到了Binary Search,我去看看它。

二进制搜索

template <class ForwardIterator, class T>
  bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
  first = std::lower_bound(first,last,val);
  return (first!=last && !(val<*first));
}

知道它利用了另一个函数:lower bound,我继续研究下限,返回一个迭代器,指向范围[first,last]中的第一个元素,它不比val小。

这是我的分析

假设一个数组数据结构

[1,4,7,10,12]

如果我们使用二进制搜索来搜索6,first将等于指向7的迭代器

*first的值为1,val的值为6 !(val<*first)将是真的

first!=last == true&amp;&amp; !(val<*first) == true ,即使数组

中不存在6,二进制搜索函数也会返回true
  

我知道我的推理存在缺陷,有人可以向我解释在哪里   我出错了吗?

1 个答案:

答案 0 :(得分:3)

  

*first的价值为1

有你的问题。 first是值为7的元素的迭代器,因此*first为7.这使!(val<*first)成为!(6<7) false