进行二进制搜索时,我们将对数组的搜索范围逐步划分为一半,并寻找所需元素。如果排序数组中不存在该元素,则仅在将数组的最后一个剩余元素与之进行比较后才能得到结果。为什么不使用简单的语句,如:
def binarySearch(array,element):
maxIndex=len(array)-1
if(array[maxIndex]<element):
return -1
if(array[0]>element):
return -1
基本上,为什么不先与已排序数组的最小值和最大值进行比较,以检查数组中元素的存在。
它甚至可能甚至不存在于数组中,但是如果元素大于或小于数组的任何元素,我们仍然节省了大量搜索。
答案 0 :(得分:1)
在二元搜索中,比较的次数约为1 + log 2 n,假设一种算法每次迭代仅执行一次比较(因此不进行相等性检查),最后进行一次比较以查看是否唯一剩余的候选值是匹配项。
如果搜索的值确实超出了数据集的外部限制,那么您的建议将比较次数减少到1或2(取决于离群值在哪一边-假设概率是均匀分布的)。不利的一面是,您现在增加 2个比较值,以使 处于这些限制内。因此,事实证明,在平均上,您实际上损失的多于所获得的。这取决于获得搜索值在限制范围内(不一定是匹配项)的可能性。
让我们将 P 称为获得边界范围外的值的概率。如果该概率很高,则平均比较次数将低于标准算法。但是,如果概率不够高,则平均比较次数将高于标准算法。
如果您既知道所涉及的概率,又知道二叉树的大小,则可以根据简单的算术公式确定两种算法中哪一种最好:
因此只需插入您的 n 和 P 的实际值,就可以检查哪种算法平均只会执行较少的比较。