纠正我的次优二分搜索
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) >> 1
看在上帝的份上,为什么?
@LuchianGrigore 混淆。这似乎是一件事情。
@JamesKanze 我只是喜欢位移 ok :( 对我来说这不是混淆,但为了可读性我会改变它。
你要实现std::upper_bound()
吗?
你的代码很复杂。看这里:geekviewpoint.com/java/search/binary_search_iterative。另外,您说您没有注意到输出中的错误:当您寻找的元素不在向量中时,返回的值是多少?因为您不应该为不存在的值返回有效索引。
【参考方案1】:
在二分搜索中,您基本上有一个三向分支:
>
、<
和 =
。没有没有办法用 C++ 编写这个
两个比较运算符,但我希望任何像样的编译器
将它们优化为单个机器指令
比较,然后是结果的两个条件分支。
【讨论】:
以上是关于纠正我的次优二分搜索的主要内容,如果未能解决你的问题,请参考以下文章