在二分查找中,为啥不先检查要查找的元素是不是小于或大于数组的最小或最大索引?

Posted

技术标签:

【中文标题】在二分查找中,为啥不先检查要查找的元素是不是小于或大于数组的最小或最大索引?【英文标题】:In Binary Search, why the element to be searched is not first checked if it is lesser than or greater than minimum or maximum index of array?在二分查找中,为什么不先检查要查找的元素是否小于或大于数组的最小或最大索引? 【发布时间】:2020-06-08 14:51:43 【问题描述】:

在进行二分搜索时,我们将数组上的搜索范围逐步分成两半,并寻找所需的元素。如果该元素不存在于已排序的数组中,则只有在与数组的最后一个剩余元素进行比较后才能得到结果。为什么不只使用一个简单的语句,例如:

def binarySearch(array,element):
        maxIndex=len(array)-1

       if(array[maxIndex]<element):
                return -1
       if(array[0]>element):
                return -1

基本上,为什么不先比较排序数组的最小值和最大值,以检查数组中是否存在元素。

即使这样,它甚至可能不存在于数组中,但如果元素大于或小于数组的任何元素,我们仍然可以节省大量搜索。

【问题讨论】:

如果已知找到您要查找的元素的概率非常低,这可能是有意义的。 @500 虽然是真的,但这对性能有多大影响,特别是考虑到我们可能并不总是知道数组中的任何一个元素。不难想出来,所以一定有特定的原因,这不在二分搜索的标准实现中 【参考方案1】:

在二分搜索中,比较次数约为 1+log2n,假设算法每次迭代只执行一次比较(因此没有相等性检查),最后进行一次比较以查看是否唯一剩下的候选值是匹配项。

如果搜索到的值确实超出了数据集的外部限制,那么您的建议会将比较次数减少到 1 次或 2 次(取决于异常值在哪一侧——假设概率是均匀分布的)。缺点是您现在 增加 与 2 相比 这些限制内的值的比较次数。所以结果可能是平均你实际上失去的比你得到的多。这取决于获得在限制范围内的搜索值(不一定是匹配)的概率。

让我们称 P 为获得一个 超出 边界值的概率。如果该概率很高,那么平均比较次数将低于标准算法。但如果概率不够高,那么平均比较次数会高于标准算法。

如果您知道所涉及的概率和二叉树的大小,那么您可以根据一个简单的算术公式来决定这两种算法中哪一种是最好的:

标准算法:1 + log2n 个预期比较 您的建议:*1.5*P + (1-P)(3 + log2n) 个预期比较。请注意包含 2 个额外比较的 3。

因此,只需插入 nP 的实际值,您就可以检查哪种算法平均执行的比较次数更少。

【讨论】:

对于 n=1,000,000 & P=0.5;标准算法进行 21 次比较;提出的算法需要 12 次比较 确实,50% 是一个很高的百分比。所以那绝对值得。 通过进一步计算:对于 n=1000,提议的算法在 P>17% 时变得更快; n=100 万,P>9%; n=10 亿,P>6%; n=1 万亿,P>4% 是的。这一切都取决于实际情况。如果最终出现在树中的值与查找值具有相同的概率分布,则 P 会小得多。

以上是关于在二分查找中,为啥不先检查要查找的元素是不是小于或大于数组的最小或最大索引?的主要内容,如果未能解决你的问题,请参考以下文章

二分查找(折半查找)

二分查找

二分查找

二分查找算法速记

Scratch二分查找算法

python 二分法查找