数据结构与算法:二分查找
二分查找是搜索算法中的一种,用来搜索有序数组
二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要
查找的元素包含在列表中,二分查找返回其位置;否则返回null
。
Javascript ES6实现
非递归的
/** * 函数binarySearch接受一个有序数组和一个元素。 如果指定的元素包含在数组中, 这个函数将返回其位置。 你将跟踪要在其中查找的数组部分—— 开始时为整个数组。
*/
const binarySearch = (list, item) => {// 数组要查找的范围// low、high用于跟踪要在其中查找的列表部分let low = 0 let high = list.length - 1while(low <= high) { // 只要范围没有缩小到只包含一个元素const mid = Math.floor((low + high) / 2)const guess = list[mid] // 找到中间的元素if(guess === item) { // 找到元素return mid}if(guess > item) { // 猜测的数大了high = mid - 1} else { // 猜测的数小了low = mid + 1}}return null
}const myList = [1, 3, 5, 7, 9]console.log(binarySearch(myList, 3))
console.log(binarySearch(myList, -1))
递归的
const binarySearch = (list, item, low, hight) => {let arrLength = list.lengthwhile (low <= high) {let mid = Math.floor((low + high) / 2)let guess = list[mid]if( guess === item ) {return mid} else if (guess > item) {high = mid - 1list = list.slice(0, mid)return binarySearch(list, item, low, high)} else {low = mid + 1list = list.slice(low, arrLength)return binarySearch(list, item, low, high)}}return null
}const createArr = (n) => Array.from({length: n}, (v, k) => k + 1)const myList = createArr(100)
let low = 0
let high = myList.length - 1console.log(binarySearch(myList, 3, low, high))
console.log(binarySearch(myList, -1, low, high))
Python实现
运行时间(时间复杂度)
二分查找的运行时间为对数时间(或log时间)。
如果列表包含100个元素,最多要猜7次;如果列表包含40亿个数字,最多
需猜32次。
即: 2的7次方 = 100
简单查找时间是 y= ax 的线性方方程
所以很容易得出结论
随着元素数量的增加(x增加),二分查找需要的时间(y)并不多, 而简单查找需要的时间(y)却很多。
因此,随着列表的增长,二分查找的速度比简单查找快得多。
为检查长度为n的列表,二分查找需要执行log n次操作。使用大O表示法,
这个运行时间怎么表示呢?O(log n)。一般而言,简单算法的大O表示法像下面这样
大O符号
大O符号中指定的算法的增长顺序
以下是一些最常用的 大O标记法
列表以及它们与不同大小输入数据的性能比较。
- O(log n),也叫对数时间,这样的算法包括二分查找
- O(n),也叫线性时间,这样的算法包括简单查找。
- O(n * log n),这样的算法包括
快速排序
——一种速度较快的排序算法。 - ,这样的算法包括
选择排序
——一种速度较慢的排序算法 - O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法
小结
- 算法的速度指的并非时间,而是操作数的增速。
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
- 算法的运行时间用大O表示法表示。
- O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多
旅行商问题--复杂度O(n!)的算法
简单的讲如果旅行者要去5个城市,先后顺序确定有5*4*3*2*1 = 120种排序。(这种排序想想高中时候学到过的排序知识)
推而广之,涉及n个城市时,需要执行n!(n的阶乘)次操作才能计算出结果。因此运行时间
为O(n!),即阶乘时间。除非涉及的城市数很少,否则需要执行非常多的操作。如果涉及的城市
数超过100,根本就不能在合理的时间内计算出结果——等你计算出结果,太阳都没了。
这种算法很糟糕!,可别无选择。这是计算机科学领域待解的问题之一。对于这个问题,目前还没有找到更快的算法,有些很聪明的人认为这个问题根本就没有更巧妙的算法。
面对这个问题,我们能做的只是去找出近似答案。
最后需要指出的一点是,高水平的读者可研究一下二叉树
关于二叉树,戳这里: 数据结构与算法:二叉树算法
参考
算法图解
JavaScript 算法与数据结构
https://github.com/egonSchiel...
【算法】时间复杂度
【算法】空间复杂度
InterviewMap 时间复杂度
数据结构与算法:二分查找相关推荐
- 数据结构与算法——二分查找与二叉排序树
文章目录 1.预备知识 1.1 题目目录 1.2 二分查找 1.3 递归二分查找 1.4 循环二分查找 1.5 二叉查找(排序)树 1.6 二叉搜索树的代码实现 2.搜索插入位置 2.1 题目描述 2 ...
- 数据结构与算法 | 二分查找
假如我们在图书馆中整理书记,书按照序号有序排序,序号不连续,当我们需要从书堆中找到特定序号的书时,如果一本一本查找的话,我们可能需要查找N次.但如果我们先找到中间的书,将书分成两堆,与待查书对比,待查 ...
- 数据结构与算法——二分查找
目录 前言 一.二分查找是什么? 二.代码示例 三.算法时间复杂度 总结 前言 二分查找是一种高效的查找算法,二分查找又称为折半查找,其输入是一个有序(升序或降序)的元素列表.本文通过具体的例子来说明 ...
- 数据结构与算法——二分查找与二叉查找树汇总整理
目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...
- java 二分查找_计算机入门必备算法——二分查找法
1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...
- 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)
数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...
- 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)
查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...
- Java数据结构与算法——线性查找 二分查找 插值查找
1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...
- Java数据结构与算法 线性查找和二分查找
查找 查找(searching)是在一组数据项中找到指定的目标元素(target element)或者判定组内不存在目标的过程.要查找的数据项组有事成为查找池(search pool). 在此讨论两种 ...
- 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现
文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...
最新文章
- MS SQL SERVER 中几个函数的用法
- BZOJ2342[Shoi2011]双倍回文——回文自动机
- Orac and LCM #641(div2) c题--求质因数次小指数
- aes-128算法加密_加密算法问题-人工智能中的一种约束满意问题
- zstd安装_PHP: 安装 - Manual
- redis依赖_请勿过度依赖 Redis 的过期监听
- Qt Package Project 打包发布程序
- XCode出现Could not locate device support files的解决办法
- sprintf函数的用法
- 2020-12-19 nn.CrossEntropyLoss()
- RTC领域首个AI算法大赛 AI in RTC 2019 创新挑战圆满落幕
- 瑞萨e2studio(1)----瑞萨芯片之搭建FSP环境
- Go Web 编程 PDF
- Java isEmpty()方法
- 端到端、序列到序列、pipeline理解
- 5年没发paper,读博想放弃?科大博导万字自述:曾连收13封拒稿信
- 喵星球上的点名(后缀自动机+dfs序+莫队)
- 操作系统对线程的调度问题;CFS
- SolidWorks stp文件转成实体
- 另一半人马座,孟庭苇