美文网首页
二分查找上

二分查找上

作者: TomGui | 来源:发表于2019-10-07 10:03 被阅读0次

概念

二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

查找速度

O(logn)

二分查找的非递归实现和递归实现

最简单的情况就是有序数组中不存在重复元素,我们在其中用二分查找值等于给定值的数据。我用 Java 代码实现了一个最简单的二分查找算法。

非递归实现


public int bsearch(int[] a, int n, int value) {
  int low = 0;
  int high = n - 1;

  while (low <= high) {
    int mid = (low + high) / 2;
    if (a[mid] == value) {
      return mid;
    } else if (a[mid] < value) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }

  return -1;
}

容易出错的三个地方

1.循环退出条件

注意是low<=high,而不是low<high。

2.mid的取值

实际上,mid=(low+high)/2 这种写法是有问题的。因为如果 low 和 high 比较大的话,两者之和就有可能会溢出。改进的方法是将 mid 的计算方式写成 low+(high-low)/2。更进一步,如果要将性能优化到极致的话,我们可以将这里的除以 2 操作转化成位运算 low+((high-low)>>1)。因为相比除法运算来说,计算机处理位运算要快得多。

3.low 和 high 的更新

low=mid+1,high=mid-1。注意这里的 +1 和 -1,如果直接写成 low=mid 或者 high=mid,就可能会发生死循环。比如,当 high=3,low=3 时,如果 a[3] 不等于 value,就会导致一直循环不退出。

递归实现


// 二分查找的递归实现
public int bsearch(int[] a, int n, int val) {
  return bsearchInternally(a, 0, n - 1, val);
}

private int bsearchInternally(int[] a, int low, int high, int value) {
  if (low > high) return -1;

  int mid =  low + ((high - low) >> 1);
  if (a[mid] == value) {
    return mid;
  } else if (a[mid] < value) {
    return bsearchInternally(a, mid+1, high, value);
  } else {
    return bsearchInternally(a, low, mid-1, value);
  }
}

二分查找应用场景的局限性

  • 二分查找依赖的是顺序表结构,简单点说就是数组。
  • 二分查找针对的是有序数据。
  • 数据量太小不适合二分查找。
  • 数据量太大也不适合二分查找。
  • 二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。

相关文章

  • 二分查找上

    概念 二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间...

  • 二分查和快速排序

    一、二分查 二、快速排序

  • First Bad Version

    ===================== 解題思路 ===================== 二分法檢查 如果...

  • 堆/二分搜索树/图

    最大堆 heap sort 二分搜索 binary sort 二分搜索树 并查集union find 基于size...

  • 二分查找上下界

    普通的二分查找如下。要求给的数组有序。算法题里出现有序的情况时,用二分查找能将数组内查找的时间复杂度从O(N)降到...

  • 2018-05-05 二分查找

    二分查找 二分查找的思想其实是为了减少搜索范围,每次缩减一半,这样就可以快速找到对象。 1.二分查找的对象 二分查...

  • [AlgoGo]二分查找

    二分查找算法用在有序的数据集合中查找目标数据,时间复杂度为O(logn),但限制条件较多。 二分查找的限制 二分查...

  • 《算法图解》书摘-算法介绍/选择排序

    欢迎访问我的博客:http://wangnan.tech 第一章 算法介绍 二分查找Python代码 小结 二分查...

  • 二分查找代码框架

    1.基本的二分查找 2.寻找左侧边界的二分查找 3.寻找右侧边界的二分查找 4.说明 这是一个Java实现的二分查...

  • 从零开始学数据结构和算法 (五) 分治法 (二分查找、快速排序、

    图解 二分查找 概念 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查...

网友评论

      本文标题:二分查找上

      本文链接:https://www.haomeiwen.com/subject/pfzppctx.html