Optimization 优化二进制搜索 我已经看到了许多二进制搜索的例子,很多方法是如何优化它的,所以昨天我的讲师写代码(在这个代码中让我们假设第一个索引从1开始,最后一个是n,这样n是数组的长度,用伪代码来考虑。代码是这样的: L:=1; R:=N; while( L<R) { m:=div(R+L,2); if A[m]> x { L:=m+1; } else { R:=m; } } L:=1; R:=N; while(lx { L:=m+1; } 其他的 { R:=m; } }

Optimization 优化二进制搜索 我已经看到了许多二进制搜索的例子,很多方法是如何优化它的,所以昨天我的讲师写代码(在这个代码中让我们假设第一个索引从1开始,最后一个是n,这样n是数组的长度,用伪代码来考虑。代码是这样的: L:=1; R:=N; while( L<R) { m:=div(R+L,2); if A[m]> x { L:=m+1; } else { R:=m; } } L:=1; R:=N; while(lx { L:=m+1; } 其他的 { R:=m; } },optimization,binary-search,Optimization,Binary Search,这里我们假设数组是一个,所以讲师说我们不会浪费时间来比较元素是否每次都位于数组的中间部分,还有一个好处是,如果元素不在数组中,索引会显示它将位于何处,所以它是最优的,对吗?我的意思是,我从John Bentley那里看到过很多种二进制搜索(编程珍珠)以此类推,这段代码真的是最优的吗?在我的例子中,它是用pascal编写的,但语言并不重要。这取决于您是否找到元素。如果您没有找到,这将保存一些比较。如果您能在前几跳中找到元素,那么您就保存了所有后续比较和算术的工作。如果数组中的所有值都是不同的,那么

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

这取决于您是否找到元素。如果您没有找到,这将保存一些比较。如果您能在前几跳中找到元素,那么您就保存了所有后续比较和算术的工作。如果数组中的所有值都是不同的,那么很明显,您很可能很早就找到了正确的索引-但是如果您的数组中有很大一部分包含相同的值,那么这就改变了数学计算

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

R:=m;
通常是

R:=m-1;
…尽管这几乎不会产生重大影响

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

另一个好处是,若元素不在数组中,索引会显示它的位置


不管你检查是否相等,这都是事实。我见过的每一个二进制搜索实现都会提供这些信息。

所以这意味着它是最优的,我可以在现实世界的编程中使用它,对吗?@AleksiBeriashvili:它比这更微妙。在某些情况下,它的性能会比其他方法更好,在某些情况下,它的性能会更好更糟糕的是,大多数平台都内置了二进制搜索——你根本不需要自己开发。