二进制搜索的“中点”位置应始终为1/2吗?

时间:2019-05-22 19:35:26

标签: binary-search

在本机二进制搜索中,我们选择1/2作为中点,以减少线性搜索和可能的答案中的“工作量”的一半。但是,如果check_mid(mid)函数的时间复杂度不固定,1/2还是搜索的合理点吗?

例如,在查找第一个错误版本的问题中。假设check_mid(mid)的时间复杂度为O(mid),数组的长度为N。当我们将中点设置为1/2时,线性搜索左侧部分的时间复杂度将为1/8 * N ^ 2,右边部分将是3/8 * N ^ 2。那么,在“工作量”方面,划分是不公平的,在这种情况下(1 / sqrt(2)或2/3),大于1/2的因子会更好吗?

简而言之,我的困惑是我们摆脱了一半的可能案件,或者这些案件占据了“工作量”的一半?假设“工作量” -T表示线性检查所有可能的情况。如果在每次递归中都将T的一半切掉,则最差的时间复杂度将是log2(T)。但是,如果我们排除了一半的可能情况,那么当check_mid(mid)函数不固定时,最差的时间复杂度就不会是log2(T)。

Is there a more efficient search factor than midpoint for binary search?

这个问题是相似的,但是它的答案没有考虑check_mid(mid)的时间复杂性。

1 个答案:

答案 0 :(得分:0)

如果您事先了解一些发行方面的知识,也许您可​​以找到更好的解决方法,否则1/2认为随机选择[1,3,8,11,23..]的最佳方法。 [对于所有搜索]。
在大多数情况下,二进制搜索应用于未知序列。

对于已知分布:exponential-grow [1 3 9 27 81 ...]很明显,非常低的值将接近开始值(或1/3),因此1/3对于lower values2/3来说可能很好higher values。但是即使在这里,经过几次迭代也几乎没有做出任何假设,即“可能”是一半(因此,再次将枢轴更改为1/2会得到更好的时间)。此处的解决方案基于“有机会猜测正确的一半[项目较少的那一半]”,并根据已知分布进行了几次迭代。