数据结构与算法——二分查找

简介: 二分查找是一种使用十分普遍的查找算法,其基本的思路也非常的简单,在一个有序的数据集合中,我们想要查找某个数据,直接取最中间的那个数据,将它和要找的数据进行比较,如果较大,则在更大的那个数值区间继续取中间值查找,反之亦然。例如我们要在一个有序的集合里[1,3,5,6,7,8,10],查找5这个值,那么二分查找的过程就如下图所示,经过三次查找操作就能够找到。

1. 二分查找的思想


二分查找是一种使用十分普遍的查找算法,其基本的思路也非常的简单,在一个有序的数据集合中,我们想要查找某个数据,直接取最中间的那个数据,将它和要找的数据进行比较,如果较大,则在更大的那个数值区间继续取中间值查找,反之亦然。

例如我们要在一个有序的集合里[1,3,5,6,7,8,10],查找5这个值,那么二分查找的过程就如下图所示,经过三次查找操作就能够找到。

{H_[F3Y}GJTK__N`_V0_~LU.png


2. 二分查找的实现


相信你已经能够理解二分查找的思路了,接下来看看它的代码实现。其实根据思路不难看出,二分查找有点分治的思想,所以代码可以用递归实现,也可以用循环实现。


二分查找的递归实现:

public class BinarySearch {
    public static int binarySearchByRecursion(int[] data, int value) {
        return binarySearchInternally(data, 0, data.length - 1, value);
    }
    private static int binarySearchInternally(int[] data, int low, int high, int value) {
        while (low <= high){
            //计算中间值
            int mid = low + ((high - low) >> 1);
            if (data[mid] == value) return mid;
            else if (data[mid] < value) return binarySearchInternally(data, mid + 1, high, value);
            else return binarySearchInternally(data, low, mid - 1, value);
        }
        return -1;
    }
}

二分查找循环实现:

public static int binarySearchByCircle(int[] data, int value) {
        int low = 0;
        int high = data.length - 1;
        while (low <= high){
            //计算中间值
            int mid = low + ((high - low) >> 1);
            if (data[mid] == value) return mid;
            else if (data[mid] < value) low = mid + 1;
            else high = mid - 1;
        }
        return -1;
    }


3. 二分查找的局限性


二分查找是一种很高效的算法,时间复杂度为 O(logn),要是使用上的话,非常的方便。但是,二分查找对数据的要求也十分严苛。

首先,二分查找只适用于顺序表结构,说简单点,就是数组。因为可以利用数组下标访问的特性,快速取出数据进行比较。其他的数据结构例如链表,如果使用二分查找的话,不能进行下标访问,每次比较都必须遍历链表寻找中间节点,时间复杂度就很高了。

其次,二分查找针对的是有序数组,如果数据未排序,则必须进行排序才能够使用,前面说到了,排序的时间复杂度一般为 O(nlogn)。所以,二分查找较适用于一次排序,多次查找的数据。如果数据的插入和删除操作过于频繁,那么维护有序的成本就很高。

最后,二分查找适用于数据量较大的场景,假如我们要在几十或者几百个数据中进行查找,那直接遍历查找即可。面对大量的数据,二分查找方能体现其优势。

目录
打赏
0
0
0
0
2
分享
相关文章
|
2月前
|
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
二分查找的基本思想是:每次比较中间元素与目标元素的大小,如果中间元素等于目标元素,则查找成功;顺序表是线性表的一种存储方式,它用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素在物理存储位置上也相邻。第1次比较:查找范围R[0...10],比较元素R[5]:25。第1次比较:查找范围R[0...10],比较元素R[5]:25。第2次比较:查找范围R[0..4],比较元素R[2]:10。第3次比较:查找范围R[3...4],比较元素R[3]:15。,其中是顺序表中元素的个数。
146 68
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
|
9天前
|
算法系列之搜素算法-二分查找
二分查找是一种在`有序`数组中查找特定元素的算法。它的基本思想是通过将数组分成两半,逐步缩小查找范围,直到找到目标元素或确定目标元素不存在。
25 9
算法系列之搜素算法-二分查找
【算法】——二分查找合集
二分查找基础模版和进阶模版,查找元素位置,搜索插入位置,x的平方根,山脉数组的峰顶索引,寻找峰值,点名
|
7月前
|
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
C#二分查找算法
C#二分查找算法
【C语言】二分查找算法
【C语言】二分查找算法
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
55 0
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
8月前
|
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
72 0
【算法】二分查找(整数二分和浮点数二分)

热门文章

最新文章

  • 1
    局域网屏幕监控系统中的Python数据结构与算法实现
    138
  • 2
    2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
    52
  • 3
    2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    50
  • 4
    2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    53
  • 5
    2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    63
  • 6
    2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    42
  • 7
    2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    77
  • 8
    2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    40
  • 9
    2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    49
  • 10
    2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    49