二分查找算法为什么要先排序
其实二分查找算法就和我们在一个英文字典中找一个单词一样,比如要找middle这个单词,先把字典翻到大概中间的位置,那么现在字典就被分成两个部分了,middle这个单词要么在第一个部分,要么在第二个部分,如果正好翻到p那一页,那么说明middle在前面的那个部分,再从前面那个部分找一个大概中间的位置,用不了多长时间就找到middle了。 我们查字典的这个方法就是二分查找算法,但是前提是字典是排好序的,如果字典是乱序的,那么就没法用 二分查找算法了。
仔细想来,插入算法也可以用类似二分查找算法的思路来操作,一般插入算法的前提肯定是已经排好序了,用二分插入算法效率很高。
从二分查找算法实现来看,它实际上是在降低候选数据规模的一种思路。
如果用最简单的一个一个查找,那么n个数据第一次查找的时候候选数据规模是n,第二次查找的时候候选数据规模是n-1。。。
每次数据规模减1.
如果二分查找的话,那么n个数据第一次 查找的时候候选数据规模是n,第二次查找的时候候选数据规模是n/2,第三次查找的时候数据规模是n/4。
可以看到二分查找算法降低数据规模的作用十分明显。
哈希算法也是一种查找算法,它的意思是先给候选数据建立索引,然后按照索引和候选数据一一对应的关系存起来,查找的时候是先把待查找数据用哈希函数算出索引值,然后就找到了候选数据了。处理问题的思路其实是一种把无序数据变得“有序”,
这个有序就是建立索引的过程,是一种预处理的思路,你让我查找数据,我先不找,先把数据摆弄摆弄,摆弄好了再找。我并不是很赞同书上说的哈希算法是一种空间换时间的算法,感觉没有说道点子上啊。
转载于:https://www.cnblogs.com/yfish/p/9946474.html
二分查找算法为什么要先排序相关推荐
- 二分查找算法的两种实现方式:非递归实现和递归实现
二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...
- LeetCode面试刷题技巧-二分查找算法代码思路解析
二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使用过二分查找的思想,不信的话,且听我慢慢为你道来. 不知道你有没有玩过这样一个游戏,猜数字.就是说一个人心里想了 ...
- Python 二分查找算法
如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76 ...
- java的数组查找算法_java数组、排序算法、查找算法详解
1.为什么定义数组要采用type[] arrayName;这种方式? 因为这种方式具有很好的可读性,使用这种方式很容易就可以理解这是定义一个变量,其中变量名是arrayName,变量的类型是type[ ...
- 二分查找算法及其变种
前言 二分查找算法也称为折半查找算法,是一种在查找算法中普遍使用的算法.其算法的基本思想是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功:若给定的值小于中间记录的 ...
- 顺序查找与二分查找算法
顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1.该算 ...
- 递归与分治——二分查找算法(折半查找算法)
二分搜索主要解决的问题是确定排序后的数组中是否包含目标元素val. 二分搜索通过持续跟踪数组中包含元素val的范围.分为两个过程,第一就是找到了,第二个就是没找到: 一开始,这个范围是整个数组,然后通 ...
- Python二分查找算法
二分查找算法 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,6 ...
- list 查找_五千字长文带你学习 二分查找算法
点击上方"与你一起学算法",选择"星标"公众号 重磅干货,第一时间送达 二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使 ...
最新文章
- sql server ssl安全错误_Nginx的这些安全设置,你都知道吗?
- 虚拟机架云服务器,云服务器 虚拟机架设
- 【AD用户配置系列三】文件夹重定向为用户登录与注销加速
- 【HDU - 1102】Constructing Roads (最小生成树裸题模板)
- python大一基础题_python基础练习题
- Android基础控件之Button的基本使用
- php进程名,DOS根据进程名或PID删除进程命令
- android 源码开发 关于编译等小知识点总结
- Oracle常用操作【自己的练习】
- linux命令行添加管理员用户,Linux基础命令---添加用户useradd
- js正则表达式校验手机号码和电话号码
- IDEA中下载mybatis插件mybatis plugins 离线版安装
- nginx反向代理进行统一鉴权
- 数字电视机顶盒ATSC制式详细介绍
- linux服务器使用WonderShaper进行带宽限制
- ipad可以安装python的编辑器_ipad配置python步骤
- STM32控制TFTLCD显示屏(理论)
- At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger
- windows快捷键失效 - 重启无效 - 插拔键盘解决
- HDU 4125 Moles 笛卡尔树 + kmp