jjzjj

算法分析专业工具——大O记法

花想云(西安第一深情) 2024-05-05 原文

 

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。  


写在前面

从之前的章节中我们了解到,影响算法性能的主要因素是其所需的步数。

然而,我们不能简单地把一个算法记为“22步算法”,把另一个算法记为“400步算法”,因为一个算法的步数并不是固定的。

以线性查找为例,它的步数等于数组的元素数量。如果数组有22个元素,线性查找就需要 22步;如果数组有 400个元素,线性查找就需要 400步。

量化线性查找效率的更准确的方式应该是:对于具有 N 个元素的数组,线性查找最多需要 N步

为了方便表达数据结构和算法的时间复杂度,计算机科学家从数学界借鉴了一种简洁又通用的方式,那就是大 O 记法。

掌握了大 O记法,就掌握了算法分析的专业工具。


1.大O:数步数

为了统一描述,大 O不关注算法所用的时间,只关注其所用的步数。

第 1章介绍过,数组不论多大,读取都只需 1步。用大 O记法来表示,就是:O(1)

O(1)意味着一种算法无论面对多大的数据量,其步数总是相同的。

就像无论数组有多大,读取元素都只要 1 步。这 1 步在旧机器上也许要花 20 分钟,而用现代的硬件却只要 1 纳秒。但这两种情况下,读取数组都是 1步。其他也属于 O(1)的操作还包括数组末尾的插入与删除。之前已证明,无论数组有多大,这两种操作都只需 1步,所以它们的效率都是O(1)。

下面研究一下大 O 记法如何描述线性查找的效率。回想一下,线性查找在数组上要逐个检查每个格子。在最坏情况下,线性查找所需的步数等于格子数。即如前所述:对于 N个元素的数组,线性查找需要花 N步。

用大 O记法来表示,即为:O(N)


2.常数时间与线性时间

从 O(N)可以看出,大 O 记法不只是用固定的数字(如 22、440)来表示算法的步数,而是基于要处理的数据量来描述算法所需的步数。

或者说,大 O 解答的是这样的问题:当数据增长时,步数如何变化

O(N)算法所需的步数等于数据量,意思是当数组增加一个元素时,O(N)算法就要增加 1步。而 O(1)算法无论面对多大的数组,其步数都不变

当数据增加一个单位时,算法也随之增加一步。也就是说,数据越多,算法所需的步数就越多。O(N)也被称为线性时间

相比之下,O(1)则为一条水平线,因为不管数据量是多少,算法的步数都恒定。所以,O(1)也被称为为常数时间

因为大 O主要关注的是数据量变动时算法的性能变化,所以,即使一个算法的恒定步数不是 1,它也可以被归类为 O(1)。

O(1)永远比O(N)更高效,原因在于,当元素数量无限增多时,O(N)总会在某一临界值超过O(1)


3.同一算法,不同场景

之前的章节我们提到,线性查找并不总是 O(N)的。当要找的元素在数组末尾,那确实是 O(N)。但如果它在数组开头,1步就能找到的话,那么技术上来说应该是 O(1)。所以概括来说,线性查找的最好情况是 O(1),最坏情况是 O(N)。

虽然大 O 可以用来表示给定算法的最好和最坏的情景,但若无特别说明,大 O 记法一般都是指最坏情况

这种悲观主义其实是很有用的:知道各种算法会差到什么程度,能使我们做好最坏打算,以选出最适合的算法。


4.第三种算法

上一章我们学到:在同一个有序数组里,二分查找比线性查找要快。

算法为何重要(二分查找)http://t.csdn.cn/YPs4s下面就来看看如何用大O记法描述二分查找。

二分查找的大 O记法是:O(log N)

简单分析一下,倘若要用二分查找在含有N个元素的有序数组中查找某个元素。

二分查找的基本思想是,每次我们都能排除掉一半的数据。

所以考虑最坏情况,就是数组里没有我们要查找的元素,那么我们每次排除一半的元素,多

少次才能全部排除(或者说只剩一个元素)呢?

答案是  

简单来说,O(log N)意味着该算法当数据量翻倍时,步数加 1

这里我们所提过的 3种时间复杂度,按照效率由高到低来排序的话,会是这样:

O(1)<O(log N)<O(N)

现在回到大 O记法。当我们说 O(log N)时,其实指的是 O(log 2 N),不过为了方便就省略了2而已。简单来说,O(log N)算法的步数等于二分数据直至元素剩余 1 个的次数。

下表是 O(N)和 O(log N)的效率对比。

每次数据量翻倍时,O(N)算法的步数也跟着翻倍,O(log N)算法却只需加 1。

总结

学会大 O记法,我们在比较算法时就有了一致的参考系。有了它,我们就可以在现实场景中测量各种数据结构和算法,写出更快的代码,更轻松地应对高负荷的环境。 

下一章会用一个实际的例子,让你看到大 O记法如何帮助我们显著地提高代码的性能。

有关算法分析专业工具——大O记法的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  6. ruby - 使用 Ruby 开发工具包将文件上传到 Amazon S3 - 2

    我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc

  7. ruby - 在 StockChart (highchart) 中以编程方式显示柱形图的工具提示 - 2

    我有一个Highstock图表(带有标记和阴影的线条),并且想以编程方式显示一个highstock工具提示,例如,当我选择某个表上的一行(包含图表数据)我想显示相应的highstock工具提示。这可能吗? 最佳答案 股票图表thissolution不起作用:在thisexample你必须更换这个:chart.tooltip.refresh(chart.series[0].data[i]);为此:chart.tooltip.refresh([chart.series[0].points[i]]);解决方案可用here.

  8. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  9. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  10. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

随机推荐