思考:
假设我们有12万条IP区间与归属地的对应关系,如何快速定位出一个IP地址的归属地呢?
二分查找的变形:
本次的分析要处理的数据是从小到大排序的。
变体一:查找第一个值等于给定值的元素
有序数据集合中存在重复的数据,我们希望找到第一个值等于给定值的数据,上一节的二分查找代码就不再适用了。
比如下面这个有序数组,其中a[5],a[6],a[7]的值都是8,是重复的数据。我们希望查找第一个值等于8的元素,也就是下标为5的元素。如果用上一节的代码实现,首先将8与区间中间值a[4]做比较,8大于6,于是在下标5到9之间继续查找。下标5和9的中间位置是下标为7,a[7]刚好为8,所以代码就返回了a[7]=8。但是这并不是我们想要查找的第一个等于8的元素。所以上一节讲的二分查找代码无法解决现在的问题。
稍稍改造代码,可以解决变体一:
public int bsearch(int[] a, in