首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化的二进制搜索

优化的二进制搜索
EN

Stack Overflow用户
提问于 2012-10-10 13:42:39
回答 1查看 741关注 0票数 0

我见过很多二进制查找的例子,很多方法如何优化它,所以昨天我的讲师写了代码(在这个代码中,让我们假设第一个索引从1开始,最后一个是N,所以N是数组的长度,考虑它在伪code.code中是这样的:

代码语言:javascript
复制
L:=1;
R:=N;
while( L<R)
{
m:=div(R+L,2);
 if A[m]> x
{
 L:=m+1;

}
else
{
 R:=m;

}
}

这里我们假设数组是A,所以讲师说我们不会浪费时间来比较元素是否每次都在数组中间部分,还有一个好处是,如果元素不在数组中,index表示它将位于何处,所以它是最优的,对吗?我的意思是,我见过John Bentley的许多种二进制搜索,例如(编程珍珠)等等,这段代码真的是最优的吗?在我的例子中,它是用pascal编写的,但语言不依赖。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-10 13:50:03

这真的取决于你是否找到了元素。如果您不这样做,这将保存一些比较。如果您可以在前两个跃点中找到元素,那么您就省去了后面所有比较和算术的工作。如果数组中的所有值都是不同的,显然不太可能在早期命中正确的索引-但如果数组中包含相同值的大片区域,这将改变数学。

这种方法还意味着您不能像使用其他方法那样缩小范围-这是:

代码语言:javascript
复制
R:=m;

通常是

代码语言:javascript
复制
R:=m-1;

..。尽管这几乎不会产生显着的差异。

重要的一点是,这不会改变算法的整体复杂度-它仍然是O(log )。

索引的另一个好处是,如果元素不在数组中,

会指出它应该位于的位置

无论你是否检查是否相等,这都是正确的。我见过的每一个二进制搜索实现都会给出这个信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12812656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档