数据结构与算法:二分查找

栏目: 编程工具 · 发布时间: 7年前

内容简介:二分查找是搜索算法中的一种,用来搜索二分查找:是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要

数据结构与算法:二分查找

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

二分查找:是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要

查找的元素包含在列表中,二分查找返回其位置;否则返回 null

Javascript ES6实现

/** 
 * 函数binarySearch接受一个有序数组和一个元素。 如果指定的元素包含在数组中, 这个
 函数将返回其位置。 你将跟踪要在其中查找的数组部分—— 开始时为整个数组。
*/
const binarySearch = (list, item) => {
  // 数组要查找的范围
  // low、high用于跟踪要在其中查找的列表部分
  let low = 0  
  let high = list.length - 1

  while(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))

运行时间:

数据结构与算法:二分查找

二分查找的运行时间为对数时间(或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)快,当需要搜索的元素越多时,前者比后者快得越多

参考


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Git

Pro Git

Scott Chacon / Apress / 2009-8-27 / USD 34.99

Git is the version control system developed by Linus Torvalds for Linux kernel development. It took the open source world by storm since its inception in 2005, and is used by small development shops a......一起来看看 《Pro Git》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换