优化二进制搜索

时间:2012-10-10 05:42:39

标签: optimization binary-search

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

L:=1;
R:=N;
while( L<R)
{
m:=div(R+L,2);
 if A[m]> x
{
 L:=m+1;

}
else
{
 R:=m;

}
}

这里我们假设数组是A,所以讲师说我们不是浪费时间来比较元素是否每次都在数组的中间部分,也有利的是如果元素不在数组中,索引说它会在哪里位于,所以它是最佳的,他是对的吗?我的意思是我已经看过John Bentley的许多二分搜索(例如编程珍珠)等等,这个代码真的是最优的吗?它是用pascal编写的。 ,但语言并不依赖。

1 个答案:

答案 0 :(得分:1)

这取决于你是否找到了这个元素。如果不这样做,这将节省一些比较。如果您可以在前几个跃点中找到该元素,那么您已经保存了所有以后的比较和算术的工作。如果数组中的所有值都是不同的,那么你很可能在早期点击正确的索引 - 但是如果你有大量包含相同值的数组,则会改变数学。

这种方法也意味着你不能像你原来那样缩小相当的范围 - 这个:

R:=m;

通常是

R:=m-1;

......虽然这种情况很少会产生重大影响。

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

  

同样有益的是,如果元素不在数组中,索引会说明它的位置

无论你是否检查平等,都是如此。我见过的每个二进制搜索实现都会提供这些信息。