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

140 阅读1分钟

二分的变体操作

变体1:查找第一个值等于给定值的元素

| ``` 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; }

| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

\
变体2:查找最后一个值等于给定元素

| ```
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; }
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

变体3:查找一个大于给定值的元素

| ```
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; } 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

变体4:查找最后一个等于给定值的元素\


| ```
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; }
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

# 总结

-   有序快速查询

    -   二分查找 空间复杂度低2
    -   散列查找 空间复杂度高
    -   二叉树 空间复杂度高