二分查找是搜索算法中的一种,用来搜索有序数组

二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要
查找的元素包含在列表中,二分查找返回其位置;否则返回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 题目目录 1.2 二分查找 1.3 递归二分查找 1.4 循环二分查找 1.5 二叉查找(排序)树 1.6 二叉搜索树的代码实现 2.搜索插入位置 2.1 题目描述 2 ...

  2. 数据结构与算法 | 二分查找

    假如我们在图书馆中整理书记,书按照序号有序排序,序号不连续,当我们需要从书堆中找到特定序号的书时,如果一本一本查找的话,我们可能需要查找N次.但如果我们先找到中间的书,将书分成两堆,与待查书对比,待查 ...

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

    目录 前言 一.二分查找是什么? 二.代码示例 三.算法时间复杂度 总结 前言 二分查找是一种高效的查找算法,二分查找又称为折半查找,其输入是一个有序(升序或降序)的元素列表.本文通过具体的例子来说明 ...

  4. 数据结构与算法——二分查找与二叉查找树汇总整理

    目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...

  5. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  6. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  7. 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)

    查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...

  8. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  9. Java数据结构与算法 线性查找和二分查找

    查找 查找(searching)是在一组数据项中找到指定的目标元素(target element)或者判定组内不存在目标的过程.要查找的数据项组有事成为查找池(search pool). 在此讨论两种 ...

  10. 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现

    文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...

最新文章

  1. MS SQL SERVER 中几个函数的用法
  2. BZOJ2342[Shoi2011]双倍回文——回文自动机
  3. Orac and LCM #641(div2) c题--求质因数次小指数
  4. aes-128算法加密_加密算法问题-人工智能中的一种约束满意问题
  5. zstd安装_PHP: 安装 - Manual
  6. redis依赖_请勿过度依赖 Redis 的过期监听
  7. Qt Package Project 打包发布程序
  8. XCode出现Could not locate device support files的解决办法
  9. sprintf函数的用法
  10. 2020-12-19 nn.CrossEntropyLoss()
  11. RTC领域首个AI算法大赛 AI in RTC 2019 创新挑战圆满落幕
  12. 瑞萨e2studio(1)----瑞萨芯片之搭建FSP环境
  13. Go Web 编程 PDF
  14. Java isEmpty()方法
  15. 端到端、序列到序列、pipeline理解
  16. 5年没发paper,读博想放弃?科大博导万字自述:曾连收13封拒稿信
  17. 喵星球上的点名(后缀自动机+dfs序+莫队)
  18. 操作系统对线程的调度问题;CFS
  19. SolidWorks stp文件转成实体
  20. 另一半人马座,孟庭苇

热门文章

  1. 阿里、腾讯基本薪资曝光,资深算法工程师24万美元,高级研究员26万美元
  2. 浅谈微服务的来龙去脉
  3. WebStorm Git 分支操作
  4. Android 仿微信朋友圈添加图片
  5. 2018.3.23 13周5次课
  6. .NET 自定义Json序列化时间格式
  7. Servlet3.0 Test
  8. java中String的常用方法
  9. 【转】将 Linux 应用程序移植到 64 位系统上
  10. 调优 DB2 UDB v8.1 及其数据库的最佳实践-IBM developerWorks