二分查找(下):如何快速定位IP对应的省份地址?

针对12万条IP区间与归属地数据,通过二分查找的变体来优化查找效率。介绍四种变体:查找第一个等于给定值的元素、最后一个等于给定值的元素、第一个大于等于给定值的元素和最后一个小于等于给定值的元素。并提出利用这些变体来快速定位IP地址的归属地。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思考:

        假设我们有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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值