纠正我的次优二分搜索

Posted

技术标签:

【中文标题】纠正我的次优二分搜索【英文标题】:Correcting my sub-optimal binary search 【发布时间】:2013-01-28 16:32:28 【问题描述】:

我的二分搜索是为了在std::vector 中找到有序插入的位置。但是,在我看来,它执行了一个(或多个?)太多的比较来找到那个位置。特别是最后的三元。我设计错了吗?需要说明的是,我没有注意到输出中有任何错误。

template<typename T>
size_t find(std::vector<T> data, T value) //returns position value should be inserted at

 size_t start = 0;
 size_t end = data.size();

 if (!end) return 0;

 size_t diff;

 while (diff = (end - start) / 2)
 
  size_t mid = diff + start;

  if (data[mid].value <= value)
  
   start = mid;
  
  else
  
   end = mid;
  
 

 return data[start].value <= value ? end : start;

【问题讨论】:

(end - start) &gt;&gt; 1 看在上帝的份上,为什么? @LuchianGrigore 混淆。这似乎是一件事情。 @JamesKanze 我只是喜欢位移 ok :( 对我来说这不是混淆,但为了可读性我会改变它。 你要实现std::upper_bound()吗? 你的代码很复杂。看这里:geekviewpoint.com/java/search/binary_search_iterative。另外,您说您没有注意到输出中的错误:当您寻找的元素不在向量中时,返回的值是多少?因为您不应该为不存在的值返回有效索引。 【参考方案1】:

在二分搜索中,您基本上有一个三向分支: &gt;&lt;=。没有没有办法用 C++ 编写这个 两个比较运算符,但我希望任何像样的编译器 将它们优化为单个机器指令 比较,然后是结果的两个条件分支。

【讨论】:

以上是关于纠正我的次优二分搜索的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的线性搜索比我在 Python3 中的二分搜索运行得更快?

对向量使用二分搜索。

二分搜索与线性搜索奇怪的时间

试图进行二分搜索工作但是

二分搜索算法

精确二分搜索与非精确二分搜索