算法分析——大O标记法

article/2025/8/22 10:48:08

目录

一. 运行时间

二. 大O 表示法

2.1 示例

三. 总结

五. 扩展 


一. 运行时间

        每次介绍算法时,我们都将讨论其运行时间。一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。

        可是,如果代码都还没有运行,我怎么能预知代码运行所花的时间呢?

        由于受运行环境和输入规模的影响,代码的绝对执行时间是无法预估的。但我们却可以预估代码的基本操作执行次数。

        诸如二分查找。使用它可节省多少时间呢?简单查找逐个地检查数字,如果列表包含100个数字,最多需要猜100次。如果列表包含40亿个数字,最多需要猜40亿次。换言之,最多需要猜测的次数与列表长度相同,这被称为线性时间(linear time)。

        二分查找则不同。如果列表包含100个元素,最多要猜7次;如果列表包含40亿个数字,最多需猜32次。厉害吧?二分查找的运行时间为对数时间(或log时间)。下表总结了我们发现的情况。


二. 大O 表示法

        大O表示法是一种特殊的表示法,指出了算法的速度有多快。谁会在乎运算速度呢?实际上,你经常要使用别人编写的算法,在这种情况下,知道这些算法的速度大有裨益。本节将介绍大O表示法是什么,并使用它列出一些最常见的算法运行时间

        为了解决时间分析的难题,有了渐进时间复杂度(asymptotic time complexity)的概念,其官方定义如下:

        算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示;若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称为O(f(n)),O为算法的渐进时间复杂度,简称为时间复杂度。

        因为渐进时间复杂度用大写O来表示,所以也被称为大O表示法

        概念有点晦涩,我们使用下面的这个示例来理解一下

2.1 示例

        通过以下示例,来理解算法的运行时间以不同的速度增加:

        小明要为“嫦娥5号”编写一个查找算法,这个算法在火箭即将登陆月球前开始执行,帮助计算着陆地点。

        前面示例表明,简单查找和二分查找这两种算法的运行时间呈现不同的增速。小明需要做出决定,是使用简单查找还是二分查找。使用的算法必须快速而准确。

        一方面,二分查找的速度更快。小明必须在10秒钟内找出着陆地点,否则火箭将偏离方向。另一方面,简单查找算法编写起来更容易,因此出现bug的可能性更小。小明可不希望引导火箭着陆的代码中有bug!为确保万无一失,小明决定计算两种算法在列表包含100个元素的情况下需要的时间。

        假设检查一个元素需要1毫秒。使用简单查找时,小明必须检查100个元素,因此需要100毫秒才能查找完毕。而使用二分查找时,只需检查7个元素(log2100 大约为7),因此需要7毫秒就能查找完毕。

        然而,实际要查找的列表可能包含10亿个元素,在这种情况下,简单查找需要多长时间呢?二分查找又需要多长时间呢?请务必找出这两个问题的答案,再继续。

使用包含10亿个元素的列表运行二分查找,运行时间为30毫秒(log21 000 000 000大约为30)。小明心里想,二分查找的速度大约为简单查找的15倍,因为列表包含100个元素时,简单查找需要100毫秒,而二分查找需要7毫秒。因此,列表包含10亿个元素时,简单查找需要30 × 15 = 450毫秒,完全符合在10秒内查找完毕的要求。小明决定使用简单查找。这是正确的选择吗?

        不是。实际上,小明错了,而且错得离谱。列表包含10亿个元素时,简单查找需要10亿毫秒,相当于11天!为什么会这样呢?因为二分查找和简单查找的运行时间的增速不同。

        也就是说,随着元素数量的增加,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。因此,随着列表的增长,二分查找的速度比简单查找快得多。Bob以为二分查找速度为简单查找的15倍,这不对:列表包含10亿个元素时,为3300万倍。

        有鉴于此,仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地。

        大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速

        再来看一个例子。为检查长度为n的列表,二分查找需要执行log2n 次操作。使用大O表示法,这个运行时间怎么表示呢?O(log2n)。一般而言,大O表示法像下面这样。

        这指出了算法需要执行的操作数。之所以称为大O表示法,是因为操作数前有个大O。这听起来像笑话,但事实如此!


三. 总结

        有了基本操作执行次数的函数T(n),无法直接分析和比较代码的运行时间。

        例如算法A的执行次数是T(n)= 100n,算法B的执行次数是T(n)= 5n2,这两个函数到底谁的运行时间更长一些,需要看n的取值。

        因此,大O表示法就是把程序的相对执行时间函数T(n)简化为一个数量级,这个数量级可以是n、n2、n3等。


五. 扩展 

算法分析——大O标记法之时间复杂度;

算法分析——大O标记法之空间复杂度;


http://chatgpt.dhexx.cn/article/LHTKuaGA.shtml

相关文章

Oracle数据库查询语句

1 oracle数据库查询表的所有数据–select * from 表名;(* 代表所有) 2 oracle数据库查询表中指定字段的值–select 字段名1,字段名2,……from 表名; 3 oracle数据库往表中添加数据信息–(添加信息使用inser…

Access数据库的查询

内容很简单,我搭建access数据库就是为了简单测试access语句的对错,以及学习access数据库的语法。 1.打开access数据库。 2.主页->空数据库 3.创建数据 4.创建->查询设计 5.【显示表】中的【表】【查询】【两者都有】,都可以。点击添加…

数据库查询语句SQL中like、%、-的区别

数据库查询语句SQL中like、%、-的区别 数据库查询语句SQL中like、%、-的区别 %百分号通配符:表示任何字符出现任意次数(可以是0次) SQL 语句选取 name 以字母 "k" 结尾的所有客户: SELECT * FROM Websites WHERE name LIKE %k; 执行输出结果: 下划线通配符:表示…

使用oracle数据库分页查询语句,各种数据库的分页查询语句

各种数据库的分页查询语句 1.oracle数据库分页select * from (select a.*,rownum rc from 表名 where rownum=endrow) a where a.rc=startrow2.DB2数据库分页Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as 各种数据库的分页…

解决数据库查询语句where条件为空查询全部数据,不为空按照条件查询

问题:在用查询语句查询电影类型,电影年代,电影区域的时候,要返回全部的数据,就是where条件为空,返回所有的数据 解决:select * from 表 where (字段条件 or 条件‘’) 代码: const …

数据库内外联接查询语句

建立如下表并插入数据: create table s(sid varchar2(10) primary key,sname varchar2(50),sage number(30));insert into s values(111,小红,20);insert into s values(222,小红,20);insert into s values(333,小红,20);insert into s values(555,小红,20);create…

SQL Server数据库的查询语句

select version; #查询数据库的版本 select servername; #查询服务名 select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字 select db_name(); #查询当前数据库名 select db_name(1); #查询第一个数据库名 select db_name(…

数据库去重语句整理

示例数据 Test表中有id和name两个字段,id各不相同,name有重复。 现在需要去除重复的数据,只保留重复的里面id最大的数据。 一、去重语句一(通用型): SELECT * FROM test c where c.id in( SELECT b.id from test a,test b wher…

数据库查询中的in语句

数据库查询中的in语句 在数据库中也有运算符&#xff0c;比如<、>、、之类的&#xff0c;还有一些or、and之类的&#xff0c;下面我们来学习关于in语句的方法&#xff0c;in在数据库中到底起怎样的作用&#xff1f; 如上图&#xff0c;我通过where语句限制年龄&#xff0…

数据库查询语句(二)-条件查询

文章目录 前言一、单条件查询二、多条件查询 前言 1. 熟练掌握where子句各类运算符的使用 2. 熟练掌握多条件查询and、or的使用 一、单条件查询 在SQL中&#xff0c;insert、update、delete和select后面都能带where子句&#xff0c;用于插入、修改、删除或查询指定条件的记…

数据库查询语句中的排序

1.排序查询语法 排序查询语法&#xff1a; select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]语法说明&#xff1a; 先按照列1进行排序&#xff0c;如果列1的值相同&#xff0c;则按照列2排序&#xff0c;以此类推asc从小到大排序&#xff0c;即升序desc从大到…

C# 数据库查询语句1

C# 数据库查询语句1作者&#xff1a;陈钰桃 撰写时间&#xff1a;2022年3月27日第1节. 查询数据 数据库表是存储数据库中所有数据的对象。 在表中&#xff0c;数据按行和列格式逻辑组织&#xff0c;类似于电子表格(Excel)。在表中&#xff0c;每行代表一个唯一记录&#xff0c;…

数据库基础之查询语句

mysql三范式&#xff1a; 第一范式(确保每列保持原子性)【属性不可分】 第二范式(确保表中的每列都和主键相关)【符合第一范式&#xff0c;同时非主属性完全依赖于主键】 第三范式(确保每列都和主键列直接相关,而不是间接相关)【符合2NF&#xff0c;并且消除传递依赖】 前言 …

数据库的查询语句

目录 一 . 基本查询 1. 查询所有数据 2.查询部分字段 3. 起字段别名 4. 拓展 二 . 条件查询 三 . 模糊查询 四 . 范围查询 五 . 为空查询 六 . 排序 七 . 聚合函数 八 . 分组 九 . 分页查询 练习模板 一 . 基本查询 1. 查询所有数据 select * from goods; 2.查…

深度学习-深度卷积神经网络发展

AlexNet网络 现代意义上的深度卷积神经网络起源于AlexNet网络&#xff0c;它是深度卷积神经网络的鼻祖。这个网络相比之前的卷积网络最显著的特点是层次加深&#xff0c;参数规模变大。网络结构如下图所示&#xff1a; 这个网络有5个卷积层&#xff0c;它们中的一部分后面接着m…

什么是深度卷积神经网络,基于深度卷积神经网络

卷积神经网络算法是什么&#xff1f; 一维构筑、二维构筑、全卷积构筑。 卷积神经网络&#xff08;ConvolutionalNeuralNetworks,CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff08;FeedforwardNeuralNetworks&#xff09;&#xff0c;是深度学习&a…

经典卷积和深度卷积的神经网络

文章目录 LeNet网络AlexNet深度卷积神经网络 (AlexNet)VGGNIN(网络中的概念)含并行连接的网络GoogLeNet / Inception V3批量 归一化一些B站评论区大佬讨论残差网络ResNetResNet为什么能训练一千层暂时浅过一遍,不求每个部分都理解很深度,后面通过复现项目来加深理解。 这里…

深度学习--卷积神经网络

目录 &#xff08;一&#xff09;输入层&#xff08;Input Layer&#xff09; &#xff08;二&#xff09;卷积层&#xff08;Convolution Layer&#xff09; &#xff08;三&#xff09;激活层&#xff08;Activation Layer&#xff09; &#xff08;四&#xff09;池化层…

基于深度卷积神经网络,深度卷积神经网络结构

1、卷积神经网络算法是什么&#xff1f; 一维构筑、二维构筑、全卷积构筑。 卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;&#xff0c;是深…

深度学习——卷积神经网络

卷积神经网络CNN由纽约大学的Yann Lecun于1998年提出&#xff0c;其本质是一个多层感知机&#xff0c;成功的原因在于其所采用的局部连接和权值共享的方式&#xff1a; 一方面减少了权值的数量使得网络易于优化另一方面降低了模型的复杂度&#xff0c;也就是减小了过拟合的风险…