16 | 二分查找(下):如何快速定位IP对应的省份地址?
生活随笔
收集整理的這篇文章主要介紹了
16 | 二分查找(下):如何快速定位IP对应的省份地址?
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問(wèn)題:假設(shè)我們有 12 萬(wàn)條這樣的 IP 區(qū)間與歸屬地的對(duì)應(yīng)關(guān)系,如何快速定位出一個(gè) IP 地址的歸屬地呢?
二分查找的變形問(wèn)題:
變體一:查找第一個(gè)值等于給定值的元素
public int bsearch(int[] a, int n, int value) {int low = 0;int high = n - 1;while (low <= high) {int mid = low + ((high - low) >> 1);if (a[mid] > value) {high = mid - 1;} else if (a[mid] < value) {low = mid + 1;} else {if ((mid == 0) || (a[mid - 1] != value)) return mid;else high = mid - 1;}}return -1; }變體二:查找最后一個(gè)值等于給定值的元素
public int bsearch(int[] a, int n, int value) {int low = 0;int high = n - 1;while (low <= high) {int mid = low + ((high - low) >> 1);if (a[mid] > value) {high = mid - 1;} else if (a[mid] < value) {low = mid + 1;} else {if ((mid == n - 1) || (a[mid + 1] != value)) return mid;else low = mid + 1;}}return -1; }變體三:查找第一個(gè)大于等于給定值的元素
public int bsearch(int[] a, int n, int value) {int low = 0;int high = n - 1;while (low <= high) {int mid = low + ((high - low) >> 1);if (a[mid] >= value) {if ((mid == 0) || (a[mid - 1] < value)) return mid;else high = mid - 1;} else {low = mid + 1;}}return -1; }變體四:查找最后一個(gè)小于等于給定值的元素
public int bsearch7(int[] a, int n, int value) {int low = 0;int high = n - 1;while (low <= high) {int mid = low + ((high - low) >> 1);if (a[mid] > value) {high = mid - 1;} else {if ((mid == n - 1) || (a[mid + 1] > value)) return mid;else low = mid + 1;}}return -1; }解答開(kāi)篇
如果ip區(qū)間和歸屬地的對(duì)應(yīng)關(guān)系不經(jīng)常更新,那么我們可以預(yù)先處理這12萬(wàn)的數(shù),讓其按照ip從小到大進(jìn)行排序。將ip地址轉(zhuǎn)化為32位整形數(shù)即可。那么該問(wèn)題就轉(zhuǎn)化為找到最后一個(gè)小于等于某個(gè)給定值的元素類(lèi)型。
- 查詢(xún)某個(gè)ip,先通過(guò)二分查找找到起始ip小于等于這個(gè)ip的ip區(qū)間,然后檢查ip是否在這個(gè)ip區(qū)間內(nèi),如果在就返回對(duì)應(yīng)的歸屬地顯示;如果不在,就返回未查找到。
總結(jié)
以上是生活随笔為你收集整理的16 | 二分查找(下):如何快速定位IP对应的省份地址?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 得力D991CN Plus计算器评测(全
- 下一篇: 中级通信工程师证书有什么用