学习笔记

学习书目:《算法图解》- Aditya Bhargava


二分查找法

算法是一组完成任务的指令,任何代码片段都可视为算法。二分查找是一种算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null。

下面,我们玩一个猜数字游戏。我随便想一个1~100的数字,而你的目标是以最少的次数猜到这个数字。

  • 简单查找

假设你从1开始依次往上猜,则每次猜测都只能排除一个数字,如果我想的数字是99,你得猜99次才能猜到!这是简单查找,更准确的说法是傻找

  • 二分查找法

假设你从50开始猜数字,下面是我们的对话:

#----第1轮----
你:猜50
我:小了
#----第2轮----
你:猜75
我:大了
#----第3轮----
你:猜63
我:大了
#----第4轮----
你:猜56
我:对啦!

我发现了,你每一次都猜余下数字的中间数字!比如,你猜50,我告诉你小了,你知道1 ~ 50都小了,所以就把1 ~ 50都排除,再选取56 ~ 100 的中间数字75,我又告诉你大了,你就把75~100排除,以此类推…

那么,你用的这种方法就是二分查找法。

一般而言,对于包含n个元素的列表,用二分查找法最多需要log2nlog_2 nlog2​n步,运行时间为对数时间;而简单查找法最多则需要n步,运行时间为线性时间。

  • python实现
import mathdef binary_search(my_list, item):low = 0high = len(my_list) - 1while low <= high:mid = math.floor((low + high)/2) guess_num = my_list[mid]if guess_num == item:return midif guess_num > item:high = mid - 1else:low = mid + 1return Nonemy_list = [2, 4, 6, 8, 10]print(binary_search(my_list, 8))

控制台输出:

3

大O表示法

大O表示法是一种特殊的表示法,指出了算法的速度有多快。现在,我们用简单查找法和二分法来猜数字,假设一共有10,100,10,000和1,000,000,000个数字,查找一个元素要耗费1毫秒:

元素个数 简单查找 二分查找 倍数
10毫秒 10毫秒 4毫秒 2.5
100 100毫秒 7毫秒 14.29
10000 10000毫秒 14毫秒 714.29
1000000000 1000000000毫秒 30毫秒 33333333.33

我们看到,随着元素数量的增加,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。因此,随着列表的增长,二分查找的速度比简单查找快得多。

因此,我们不能仅仅了解的算法运行时间,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地,大O表示法指出了算法有多快:

例如,假设列表包含n 个元素。简单查找需要检查每个元素,因此需要执行n 次操作,使用大O表示法,这个运行时间为O(n);二分查找法则只需要执行log2nlog_2 nlog2​n步,,使用大O表示法,这个运行时间为O(log2nlog_2 nlog2​n)。需要注意的是,大O表示法指的运行时间并不以秒为单位,算法运行时间是从其增速的角度度量的。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

  • 大O表示法指出了最糟情况下的运行时间

在从1~100猜数字游戏中,如果我设置被猜的数字为1,而你又用简单查找法从1开始猜数字,那岂不是1次就猜到了?那简单查找法的运行时间到底是O(n)还是O(1)呢?

简单查找法的运行时间总是O(n),如果1次就找到了数字,那么将是最好的情形,但大O表示法说的是最差的情形。因此,你可以说,在最糟糕的情况下,简单查找法的运行时间是O(n)。这是一个保证,你知道简单查找的运行时间不可能超过O(n)。 说明除最糟情况下的运行时间外,我们还应该考虑平均情况的运行时间,这个知识点我们以后再说。

  • 一些常见的大O运行时间

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

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

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

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

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


后记:还是想认认真真学学算法,一点点写吧.

小白的算法初识课堂(part1)--二分查找法相关推荐

  1. 经典算法之左边界二分查找法(俗称左边界二分搜索法)

    经典算法之左边界二分查找法(俗称左边界二分搜索法) 文章目录 经典算法之左边界二分查找法(俗称左边界二分搜索法) 前言 一.什么左边界二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的 ...

  2. 经典算法之右边界二分查找法(俗称基本右边界二分搜索法)

    经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 经典算法之右边界二分查找法(俗称基本右边界二分搜索法) 前言 一.什 ...

  3. 【算法学习笔记】二分查找法

    二分查找法 二分查找的本质就是分治法,小时候有过这么一种猜数字的游戏,你在心中想一个大于0小于100的数字,然后我来提问,你只用回答是或者不是,比如"你想的数字比50大吗" 你说不 ...

  4. 小白的算法初识课堂(part4)--快速排序

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 分而治之 在这里,我想通过2个例子介绍一种著名的递归式问题解决方法–分而治之(D&C) 分蛋糕 假如,我要分一块 ...

  5. 小白的算法初识课堂(part7)--狄克斯特拉算法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...

  6. 小白的算法初识课堂(part6)--广度优先搜索

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 图简介 图是啥 广度优先搜索 寻找最短路径 队列 实现图 实现算法 运行时间 图简介 今天是五一,假如我要从家 ...

  7. 小白的算法初识课堂(part5)--散列表

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 散列函数 防止重复 冲突 性能 填装因子 散列函数 散列函数是这样的一个函数,即无论你给它什么样的数据,它都还 ...

  8. 小白的算法初识课堂(part9)--SHA及Simhash算法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 安全散列算法(SHA) 在学SHA算法之前,我们先回顾一下前几个Blog所学的散列函数. 散列函数是这样的一个函数,即无 ...

  9. 小白的算法初识课堂(part8)--贪婪算法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 教室调度问题 集合覆盖问题 近似算法 代码实现 NP完全问题 教室调度问题 假如我是一个学校的校长,我们学校有 ...

最新文章

  1. mariadb转mysql_MariaDB/MySQL备份和恢复(二):数据导入、导出
  2. laravel 同数据表字段比较查询和状态不正规排序
  3. 真正的取真实IP地址及利弊
  4. word 文档操作类,可以读出word中书签 批量替换内容,直接调用
  5. mybatis mysql uuid_spring boot整合mybatis利用Mysql实现主键UUID的方法
  6. 寓情于景 —— 情与景的交融
  7. 华为m6升级鸿蒙,华为鸿蒙系统再传喜讯!14款华为旧旗舰喜提新系统:大幅度换血...
  8. mysql sys exec_mylab_sys_exec UDF调用mysql外部系统命令(For linux)
  9. R语言_决策树rpart中的cp值
  10. 基于开源框架urule的规则引擎
  11. Openstack1 云计算与虚拟化概念
  12. OpenStack之keystone(身份认证服务)
  13. ODC V3.2.0 新版本发布 | 着重用户体验,挑战权限管控业务场景
  14. 根据视频地址获取视频的第一帧画面做为封面 IllegalArgumentException
  15. python中if brthon环境安装包_python-模块系列
  16. 【Leetcode】最长递增子序列问题及应用
  17. PyQt5 QLabel标签
  18. 忆享科技聚焦|数字经济、视频云、AI数字人、全球5G用户……行业热点资讯一览
  19. USB Type-C Configuration Channel (CC)引脚功能介绍
  20. python一些常用函数

热门文章

  1. mysql order by if()或order by in()条件排序
  2. 引用一个项目作为library的操作步骤---开发中遇到的问题(二)
  3. sqlplus 中@ ? !号的作用
  4. error: src refspec master does not match any. 错误处理办法
  5. USACO SECTION 1.1.2 Transformations 爆搜
  6. 如何用ChemFinder制作子表单
  7. 客户端登录提示找不到表0
  8. Boost学习笔记-智能指针
  9. Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
  10. 智能DNS及其工作原理: CDN实现原理