二分查找

基本概念

  • 二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null。
  • 使用二分查找时,每次都排除一半的数字
  • 对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。
  • 示例:

    如果列表包含8个数字,你最多需要检查8个数字。

    而使用二分查找时,最多需要检查log n个元素。如果列表包含8个元素,你最多需要检查3个元素,因为log 8 = 3( 23 = 8)。

  注意:仅当列表是有序的时候,二分查找才管用

  • 数组:将一系列元素存储在一系列相邻的桶(bucket),即数组。数组从0开始编号:位置依次分别为#0,#1….

python算法

def binary_search(l,item):
low=0
high=len(l)-1
while low<=high:
mid=(low+high)//2
guess=l[mid]
if guess==item:
return mid
if guess>item:
high=mid-1
else:
low=mid+1
return None my_list=[1,3,5,7,9]
print(binary_search(my_list,3))
print(binary_search(my_list,-3)) 运行结果:
1
None

  

运行时间

  • 一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。
  • 最多需要猜测的次数与列表长度相同,这被称为线性时间(linear time)。
  • 二分查找的运行时间为对数时间(或log时间)
  • 示例:

    列表包含100个数字,简单查找最多需要猜100次。二分查找最多需要7次

    O(n):线性时间

    O(log n):对数时间

大O表示法

大O表示法是一种特殊的表示法,指出了算法的速度有多快

算法的运行时间以不同的速度增加

  • 二分查找和简单查找的运行时间的增速不同
  • 示例:

元素个数

简单查找

二分法查找

100个元素

100ms

7ms

10000个元素

10s

14ms

1000000000个元素

11day

32ms

  随着元素数量的增加,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。

  因此,随着列表的增长,二分查找的速度比简单查找快得多。

  • 大O表示法用处:仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。
  • 大O表示法是为了能够比较操作数,它指出了算法运行时间的增速。

    如:假设列表包含n个元素,

      简单查找:需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。无单位。

      二分查找:需要执行log n次操作。使用大O表示法,这个运行时间为O(log n)

  • 大O表示法格式:O(n),n为操作数
  • 大 O 表示法指出了最糟情况下的运行时间

常见的大O运行时间

  • 5种大O运行时间

     O(log n),也叫对数时间,这样的算法包括二分查找。

     O(n),也叫线性时间,这样的算法包括简单查找。

     O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。

     O(n2),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。

     O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法

  PS:

  • 算法的速度指的并非时间,而是操作数的增速。
  • 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
  • 算法的运行时间用大O表示法表示。
  • O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。

阶乘时间

阶乘时间:需要执行n!(n的阶乘)次操作才能计算出结果,运行时间为O(n!)

小结

  • 二分查找的速度比简单查找快得多。
  • O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
  • 算法运行时间并不以秒为单位。
  • 算法运行时间是从其增速的角度度量的。
  • 算法运行时间用大O表示法表示。

【算法】二分查找法&大O表示法的更多相关文章

  1. 二分查找法&大O表示法

    二分查找法的输入是一个有序的元素列表,如果要查找的元素包含在列表中,二分查找返回其位置,否则返回null Python代码(来源于<算法图解>一书): def binary_search( ...

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

    1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...

  3. 白话算法:时间复杂度和大O表示法

    转自:https://www.jianshu.com/p/59d09b9cee58 每一个优秀的开发者脑中都有时间概念.他们想给用户更多的时间让用户做他们想做的事情.他们通过最小化时间复杂度来实现这一 ...

  4. 算法时间复杂度、空间复杂度(大O表示法)

    什么是算法? 计算机是人的大脑的延伸,它的存在主要是为了帮助我们解决问题. 而算法在计算机领域中就是为了解决问题而指定的一系列简单的指令集合.不同的算法需要不同的资源,例如:执行时间或消耗内存. 如果 ...

  5. 南理第八届校赛同步赛-F sequence//贪心算法&二分查找优化

    题目大意:求一个序列中不严格单调递增的子序列的最小数目(子序列之间没有交叉). 这题证明贪心法可行的时候,可以发现和求最长递减子序列的长度是同一个方法,只是思考的角度不同,具体证明并不是很清楚,这里就 ...

  6. #C++初学记录(贪心算法#二分查找)

    D - Aggressive cows 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 < ...

  7. Java算法 -- 二分查找

    折半查找,要求待查找的序列有序.每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程.直到 ...

  8. 莫队算法/二分查找 FZU 2072 Count

    题目传送门 题意:问区间内x的出现的次数分析:莫队算法:用一个cnt记录x的次数就可以了.还有二分查找的方法 代码: #include <cstdio> #include <algo ...

  9. 查找算法----二分查找与hash查找

    二分查找 有序列表对于我们的实现搜索是很有用的.在顺序查找中,当我们与第一个元素进行比较时,如果第一个元素不是我们要查找的,则最多还有 n-1 个元素需要进行比较. 二分查找则是从中间元素开始,而不是 ...

随机推荐

  1. zookeeper的安装与使用

    zookeeper的安装与使用: Zookeeper简介 1.可以作为集群的管理工具使用. 2.可以集中管理配置文件. Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式 ...

  2. vue filter过滤器简单应用

    vue中过滤器,用于一些常见的文本格式化,用 | 来操作. 过滤器可以用在两个地方: 1.在{{}}双花括号中插入值 2.v-bind表达式中使用 <!-- 在双花括号中 --> {{ m ...

  3. vue中axios 配置请求拦截功能 及请求方式如何封装

    main.js 中: import axios from '................/axios' axios.js 中: //axios.js import Vue from 'vue' i ...

  4. springboot(十八):解决跨域问题

    在controller上添加@CrossOrigin注解,如下: @RestController @RequestMapping("course") @CrossOrigin pu ...

  5. SQLite 数据库介绍和基本用法

    Ø  简介 SQLite 是一款轻量级的关系型数据库,同时也是一种嵌入式数据库,与 Oracle.MySQL.SQL Server 等数据库不同,它可以内嵌在程序中,是程序中的一个组成部分.所以,经常 ...

  6. docker之搭建私有镜像仓库和公有仓库

    一.搭建私有仓库 1.docker pull registry #下载registry镜像并启动 2. docker run -d -v /opt/registry:/var/lib/registry ...

  7. nginx静态资源反向代理

    server { listen 80; server_name music.didi365.com; index index.php index.html index.htm; root /alida ...

  8. 新浪某站CRLF Injection导致的安全问题

    CRLF攻击的一篇科普:新浪某站CRLF Injection导致的安全问题(转) 转:https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injectio ...

  9. nth-of-type(n)

    :nth-of-type(n) 选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素. p:nth-of-type(2) { background:#ff0000; } 规定属于其父元素的第二个 ...

  10. 三层结构与MVC

    实验室学弟突然又谈到了三层结构与MVC的话题,想想还是有必要整理一下这些个基本概念,且也纠正自己之前对二者的概念混淆,乃至将其错误思想指导于开发中. 关键词:三层结构(三层架构).MVC框架(思想). ...