二分查找

基本概念

  • 二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回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. Http状态码解释

    参考:urllib与urllib2的学习总结(python2.7.X) # Table mapping response codes to messages; entries have the # f ...

  2. 验证调用HttpServletResponse.getWriter().close()方法是否真的会关闭http连接

    起因 线上项目突然遭到大量的非法参数攻击,由于历史问题,之前的代码从未对请求参数进行校验. 导致大量请求落到了数据访问层,给应用服务器和数据库都带来了很大压力. 针对这个问题,只能对请求真正到Cont ...

  3. 细说java平台日志组件

    1. java.util.logging JDK自带日志组件,使用方式简单,不需要依赖第三方日志组件.支持将日志打印到控制台,文件,甚至可以将日志通过网络打印到指定主机.相对于第三方独立日志框架来说, ...

  4. HDB3编码器

    一.HDB3 码介绍 三阶高密度双极性码(英语:High Density Bipolar of Order 3 code,简称:HDB3码)是一种适用于基带传输的编码方式.它是一种 AMI 码的改进型 ...

  5. Hadoop2.7.3+Hbase-1.2.6完全分布式安装部署

    因为学习,在网上找了很多hbase搭建的文章,感觉这篇很好,点此 搭建好后,jps查看了后台进程,发现在slave上面没有HRegionServer进程 便查看了 slave上关于HRegionSer ...

  6. PHPcms 缓存的读取和设置

    https://blog.csdn.net/huobobo124/article/details/76912632 1.PHPcms设置了保存和读取缓存的方法,其实现方法存储在PHPcms/lib/f ...

  7. Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week1, Assignment(Gradient Checking)

    声明:所有内容来自coursera,作为个人学习笔记记录在这里. Gradient Checking Welcome to the final assignment for this week! In ...

  8. 简单SQL语句

    一.基础 模式定义了数据如何存储.存储什么样的数据以及数据如何分解等信息,数据库和表都有模式. 主键的值不允许修改,也不允许复用(不能使用已经删除的主键值赋给新数据行的主键). SQL 语句不区分大小 ...

  9. ThinkPHP5基础学习(慕课版)

    一.thinkphp 5.0 的安装及配置 二.URL和路由 三.请求和相应 四.视图和模板 五.数据库的操作 六.模型的操作

  10. 【转】Python字符串格式化

    Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中. 在 Python 中,字符串格式化使用与 C 中 sp ...