更多文章
更多精彩文章
算法
步骤
给予一个包含 n 个带值元素的数组 A 或是记录 A 0 ... A n −1 ,使得 A 0 ≤ ... ≤ A n −1 ,以及目标值 T ,还有下列用来搜索 T 在 A 中位置的子程序。
令 L 为0, R 为 n − 1。
如果 L > R ,则搜索以失败告终。
令 m (中间值元素)为“( L + R ) / 2”加上下高斯符号。
如果A m < T ,令 L 为 m + 1并回到步骤二。
如果A m > T ,令 R 为 m - 1并回到步骤二。
当A m = T ,搜索结束;回传值 m 。
这个迭代步骤会持续通过两个变量追踪搜索的边界。有些实际应用会在算法的最后放入相等比较,让比较循环更快,但平均而言会多一层迭代 。
大致匹配
以上程序只适用于完全 匹配,也就是查找一个目标值的位置。不过,因为有序数组的顺序性,将二分搜索算法扩展到能适用大致匹配并不是很重要。举例来说,二分搜索算法可以用来计算一个赋值的排名(或称秩,比它更小的元素的数量)、前趋(下一个最小元素)、后继(下一个最大元素)以及最近邻。搜索两个值之间的元素数目的范围查询(英语:Range query (data structures))可以借由两个排名查询(又称秩查询)来运行 。
排名查询可以使用调整版的二分搜索来运行。借由在成功的搜索回传 m ,以及在失败的搜索回传 L ,就会取而代之地回传了比起目标值小的元素数目 。
前趋和后继查询可以借由排名查询来运行。一旦知道目标值的排名,其前趋就会是那个位于其排名位置的元素(因为它是小于目标值的最大元素)。其后继是(数组中的)下一个元素,或是(非数组中的)前趋的下一个元素 。目标值的最近邻可能是前趋或后继,取决于何者较为接近。
范围查询也是直接了当的。一旦知道两个值的排名,不小于第一个值且小于第二个值的元素数量就会是两者排名的差。这个值可以根据范围的端点是否算在范围内,或是数组是否包含其端点的对应键来增加或减少1 。
复杂度分析
应用
除直接在一个数组中查找元素外,可用在插入排序中。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
{{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}