| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> algorithm - 二分查找 -> 正文阅读 |
|
[数据结构与算法]algorithm - 二分查找 |
简介? ? ? ?当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二分查找又叫二分搜索或折半查找。 ? ? ? ?它对要查找的序列有两个要求:一是该序列必须是有序的(即该序列中的所有元素都是按照大小关系排好序的,升序和降序都可以,本文假设是升序排列的);二是该序列必须是顺序存储的。 算法原理二分查找算法的原理如下:
二分查找之所以快速,是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。因此可能包含目标元素的有效范围就收缩得很快,而不像顺序查找那样,每次仅能排除一个元素。 下面来看一张二分查找与顺序查找的效率对比图: ? 算法复杂度(1)时间复杂度 ? ? ? ?在最好的情况下只需要进行1次比较就能找到目标元素。 ? ? ? ?以序列[5, 10, 22, 29, 43, 57, 58, 61, 73, 77, 81]为例,可以构建成如图所示的二叉树: (2)空间复杂度 ? ? ? ?在下面的实现中,二分查找对于存储空间的要求是只需要能存储left、right、mid、target、index、数组地址(参数nums)这6个局部变量就行了,因此它对存储空间的要求是常数数量,不随着元素多少而变化。所以它的空间复杂度为O(1)。 局限性(1)二分查找依赖数组结构 ? ? ? ?二分查找需要利用下标随机访问元素,如果我们想使用链表等其他数据结构则无法实现二分查找。 (2)二分查找针对的是有序数据 ? ? ? ?二分查找需要的数据必须是有序的。如果数据没有序,我们需要先排序,排序的时间复杂度最低是 O(nlogn)。所以,如果我们针对的是一组静态的数据,没有频繁地插入、删除,我们可以进行一次排序,多次二分查找。这样排序的成本可被均摊,二分查找的边际成本就会比较低。 ? ? ? ?但是,如果我们的数据集合有频繁的插入和删除操作,要想用二分查找,要么每次插入、删除操作之后保证数据仍然有序,要么在每次二分查找之前都先进行排序。针对这种动态数据集合,无论哪种方法,维护有序的成本都是很高的。 ? ? ? ?所以,二分查找只能用在插入、删除操作不频繁,一次排序多次查找的场景中。针对动态变化的数据集合,二分查找将不再适用 (3)数据量太小不适合二分查找 ? ? ? ?如果要处理的数据量很小,完全没有必要用二分查找,顺序遍历就足够了。比如我们在一个大小为 10 的数组中查找一个元素,不管用二分查找还是顺序遍历,查找速度都差不多,只有数据量比较大的时候,二分查找的优势才会比较明显。 (4)数据量太大不适合二分查找 ? ? ? ?二分查找底层依赖的是数组,数组需要的是一段连续的存储空间,所以我们的数据比较大时,比如1GB,这时候可能不太适合使用二分查找,因为我们的内存都是离散的,可能电脑没有这么多的内存。 算法实现常见的二分查找算法共有三种形态: ? ? ? ?②寻找序列中目标值第一次出现位置的索引 ? ? ? ?③寻找序列中目标值最后一次出现位置的索引 下面就使用go语言为例,对其分别进行实现:
参考博文 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:29:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |