面试官问我如何在 20 万 IP 地址中快速定位某一归属地?二分查找

82 阅读1分钟

二分查找虽然性能比较优秀,但应用场景也比较有限。底层必须依赖数组,并且还要求数据是有序的。对于较小规模的数据查找,我们直接使用顺序遍历就可以了,二分查找的优势并不明显。二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。
时间复杂度是 O(logn),分治思想
你需要着重掌握它的三个容易出错的地方:循环退出条件、mid 的取值,low 和 high 的更新

image.png

查找第一个值等于给定值的元素

const search = (arr, target) => {
  // 没有数组数据,直接return -1
  if (arr.lenght == 0) return -1;
  // 声明两个指针分别指向头和尾(low,high)
  let low = 0
  let high = arr.length - 1
  while (low <= high) {
    // 取中间值
    const mid = Math.floor((low + high) / 2)
    if (arr[mid] == target) {
      if (mid == 0 || target !== arr[mid - 1]) {
        return mid;
      } else {
        high = mid - 1
      }
    } else if (target < arr[mid]) { high = mid - 1 } else {
      low = mid + 1
    }
    return -1;
  }
  console.log(search([2,8,8,5,6,5],8))



查找重复数据的最后一个元素

const search = (arr, target) => {
  // 没有数组数据,直接return -1
  if (arr.lenght == 0) return -1;
  // 声明两个指针分别指向头和尾(low,high)
  let low = 0
  let high = arr.length - 1
  while (low <= high) {
    // 取中间值
    const mid = Math.floor((low + high) / 2)
    if (arr[mid] == target) {
      if (mid == arr.length - 1 || target !== arr[mid + 1]) {
        return mid;
      } else {
        low = mid + 1
      }
    } else if (target < arr[mid]) { high = mid - 1 } else {
      low = mid + 1
    }
    return -1;
  }
  console.log(search([2,8,8,5,6,5],8))

查找第一个小于等于指定的元素

image.png

查找第一个大于等于指定的元素

image.png