数据结构--折半查找法 详解
折半查找法,也称为二分查找法, 二分搜索, 是一种在有序数组中查找某一特定元素的搜索算法.搜索过程中从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束;如果某一特定元素大于或者小于中间元素, 则在数组大于或小雨元素的那一半中查找, 而且跟开始一样从中间元素开始比较. 若某1个步骤中数组为空, 则代表找不到. 这种搜索算法每一次比骄傲都使搜索范围缩小一半.
-- 摘自维基百科.
2. 折半查找法分析
从定义中可以看出折半查找法有几个特性.
2.1 先决条件: 要搜索的数据已经排好序
当然, 怎样将数据排序也是1个算法, 这里先不考究了, 但是要使用折半查找法, 这个条件是必需满足的
2.2 折半查找法适合海量数据查找
折半查找法每执行1次.就会抛弃一半的无用数据, 如果数据很少的话,其实比线性查找快不了多少, 但是数据量很大的话, 抛弃的一半无用数据就很客观了! 相对于线性查找中节省了这一半数据的遍历时间啊.
2.3 折半查找法算法复杂度
假如要查找数据的数量是n, 查找的次数为x,那么查找1次(x=1), 剩下的数据量就是 (n-1)/2 = n/2 -1/2了
当x=2 时 剩下的数据量就是 n/4 - 3/4
当x=3 时 剩下的数据量就是 n/8 - 7/8
所以剩下的数据量R = n/2^x - 1 + 1/2^x
当x很大时, R就~= n/2^x -1 了
那么什么时候才会肯定会找出要找的数据呢, 或者缺认该数据不存在呢.
就是当剩余的数据量R=0 时啊.
这时 n/2^x -1 =0 => 2^x = n => x= log2^n (底为2,幂为n的对数)
所以算法复杂度就是 O(log2^n)
比起线性查找的算法复杂度O(n) , 优胜很多了.(如果n很大的话)
3. 折半查找法的一个实现例子(c语言)
上面的bsget函数就用了折半查找法:
输出:
数据结构--折半查找法 详解相关推荐
- 数据结构——折半查找法
版权声明:本文为博主原创文章,转载请注本文链接. /************************ author's email:wardseptember@gmail.com date:2018. ...
- 二分查找(折半查找)详解
二分查找详解 1. 二分查找的引入 2. 二分的一些基本知识 1) 定义 2) 特点 3. 二分查找的边界问题 1) 常用模板 2)综合练习 4.二分的应用 1) Flyer 2) Distribut ...
- Python二分查找/折半查找算法详解--(面试常考)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 二分查找也称折 ...
- 数据结构-折半查找法的ASL计算
(1)通常用查找过程中对关键字的比较次数 作为衡量算法效率优劣的标准. (2)平均查找长度-ASL,相当于时间复杂度分析时的f(n)函数. (3)考研的一个考点. (4)ASL求解的关键就是建立折半查 ...
- 数据结构之折半插入排序图文详解及代码(C++实现)
问题: 对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]. 算法思想: 1.设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列. 2. ...
- 【数据结构】折半查找法
问题描述 使用折半查找法实现给定一个有序(非降序)数组A,可含有重复元素,求最大的i使得A[i]小于target,不存在则返回 -1 输入形式 第一行:非降序数组A 第二行:target 输出形式 位 ...
- 数据结构之折半查找法(Binary Search)
对于要查找的数据已经排序,此时仍然可以使用顺序查找法来进行查找,但是此时有更加简便的方法, 那就是"折半查找法(Binary Search)". 折半查找法的实现步骤如下: 假设数 ...
- 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
最新文章
- 解决:vs2013 错误	1	error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.
- 超级队长VR线下体验店落地上海,让娱乐突破想象
- git push代码到远程新分支
- 使用Visio 2000逆向工程将代码转换为UML图表
- 4.数据库(增删改查)备份及恢复
- redis info查看信息
- 在.NET中调用Oracle9i存储过程经验总结
- 提高Office2010等高版的启动速度文章链接收集-Office2010打开慢速度怎么办?
- 牛腩新闻发布系统—错误总结
- PPT(PowerPoint)更改默认等线字体
- 如何把html转为excel,怎么把网页转化为excel
- java菜鸟疑问1:为什么我的代码总出现cannot be resolved or is not a field这种问题
- 计算机变异指标可以,变异系数公式_在EXCEL中怎样计算样本标准差和变异系数
- 线程的先进先出,后进先出,以及优先级队列
- npm/package.json/package-lock.json文件
- PCF8591详解(蓝桥杯单片机模块(IIC总线))
- VGA原理详解与verilog实现RGB888彩条(二)
- ❤️❤️❤️Unity废柴看过来,手把手教你做植物大战僵尸(二)—— 序列帧动画
- C语言Dialogbox添加图片,dialogbox_传奇服务端CloseBigDialogBox是什么意思
- c语言计算年龄的编程,C语言编程实现---计算实际年龄
热门文章
- Django中HttpResponse和JsonResponse的区别和用法
- linux两个网段默认网关_Linux下配置多网卡多网关
- 汇编之浮点数处理(CrackMe003前置知识)
- 【Nginx】 server 配置记录
- 【Storage】localStorage 或 sessionStorage 首次加载,需要再次手动刷新页面的解决方案
- 2021暑假每日一题 【week9 完结】
- Linux修改文件/目录权限
- selenium2与python自动化4-css元素定位
- Volatile可见性
- typescript ajax,TypeScript的应用方式