搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
很楠不爱3
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
python房源数据爬虫分析预测系统+可视化 +商品房数据+Flask框架 大数据毕业设计(源码+讲解视频)✅_房产数据分析预测系统
2
FPGA常用通信协议---SPI_fpga spi
3
【淘天交易&;营销】交易团队春招-超复杂业务场景等你来挑战!
4
Git必知必会基础(07):git diff的使用
5
Psytopic测试
6
盲人手机导航:科技之光引领无障碍出行新纪元
7
Flink CDC 和 kafka 进行多源合并和下游同步方案_flink cdc kafka
8
MongoDB_mongodb 库叫什么
9
创造未来知识管理新篇章:Ollama与AnythingLLM联手打造个人与企业的安全知识库!
10
简介Opencv在Python中的使用_python opencv
当前位置:
article
> 正文
算法复杂度——时间复杂度和空间复杂度
作者:很楠不爱3 | 2024-05-08 01:04:09
赞
踩
时间复杂度为f (a1) =o (1),f (a2) =o (n2log2n) ,f (a3) =o (2n),f (a4) =o (log
1、时间复杂度
(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
(2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。 按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。 2、空间复杂度 与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n)) 我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。讨论方法与时间复杂度类似,不再赘述。
(3)渐进时间复杂度评价算法时间性能 主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。
【例3.7】有两个算法A1和A2求解同一问题,时间复杂度分别是T1(n)=100n2,T2(n)=5n3。
(1)当输入量n<20时,有T1(n)>T2(n),后者花费的时间较少。
(2)随着问题规模n的增大,两个算法的时间开销之比5n3/100n2=n/20亦随着增大。即当问题规模较大时,算法A1比算法A2要有效地多。它们的渐近时间复杂度O(n2)和O(n3)从宏观上评价了这两个算法在时间方面的质量。在算法分析时,往往对算法的时间复杂度和渐近时间复杂度不予区分,而经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。
【例3.8】算法MatrixMultiply的时间复杂度一般为T(n)=O(n3),f(n)=n3是该算法中语句(5)的频度。下面再举例说明如何求算法的时间复杂度。
【例3.9】交换i和j的内容。
Temp=i; i=j; j=temp; 以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。 如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
【例3.10】变量计数之一。
(1) x=0;y=0;
(2) for(k-1;k<=n;k++)
(3) x++;
(4) for(i=1;i<=n;i++)
(5) for(j=1;j<=n;j++)
(6) y++;
一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分。因此,以上程序段中频度最大的语句是(6),其频度为f(n)=n2,所以该程序段的时间复杂度为T(n)=O(n2)。 当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
【例3.11】变量计数之二。
(1) x=1;
(2) for(i=1;i<=n;i++)
(3) for(j=1;j<=i;j++)
(4) for(k=1;k<=j;k++)
(5) x++;
该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,因此可以从内层循环向外层分析语句(5)的执行次数: 则该程序段的时间复杂度为T(n)=O(n3/6+低次项)=O(n3)。 (4)算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。
【例3.12】在数值A[0..n-1]中查找给定值K的算法大致如下:
(1)i=n-1;
(2)while(i>=0&&(A[i]!=k))
(3) i--;
(4)return i;
此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关: ①若A中没有与K相等的元素,则语句(3)的频度f(n)=n; ②若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。 (5)最坏时间复杂度和平均时间复杂度 最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
【例3.19】查找算法
【例1·8】在最坏情况下的时间复杂度为T(n)=0(n),它表示对于任何输入实例,该算法的运行时间不可能大于0(n)。
平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
常见的时间复杂度按数量级递增排列依次为:常数0(1)、对数阶0(log2n)、线形阶0(n)、线形对数阶0(nlog2n)、平方阶0(n2)立方阶0(n3)、…、k次方阶0(nk)、指数阶0(2n)。显然,时间复杂度为指数阶0(2n)的算法效率极低,当n值稍大时就无法应用。
2、类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地\"进行的,是节省存储的算法,如这一节介绍过的几个算法都是如此;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如将在第九章介绍的快速排序和归并排序算法就属于这种情况。
分析一个算法所占用的存储空间要从各方面综合考虑。如对于递归算法来说,一般都比较简短,算法本身所占用的存储空间较少,但运行时需要一个附加堆栈,从而占用较多的临时工作单元;若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。若一个算法为递归算法,其空间复杂度为递归所使用的堆栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表不开始进行的一次非递归调用)。算法的空间复杂度一般也以数量级的形式给出。如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当=i自求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。
算法的时间复杂度和空间复杂度合称为算法的复杂度。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/很楠不爱3/article/detail/552084
推荐阅读
article
时间
复杂度
和空间
复杂度
...
时间
复杂度
时间
复杂度
简单的理解就是执行语句的条数。如果有循环和递归,则忽略简单语句,直接算循环和递归的语句执行次数。比如...
赞
踩
article
队列
之
顺序
队列
详解
(
C语言
版)...
本篇文章详细的介绍了数据结构
队列
中的
顺序
队列
,并用
C语言
对其常用操作进行了实现。_
顺序
队列
顺序
队列
...
赞
踩
article
Oracle
数据库
完整卸载_
oracle
数据库
卸载...
Oracle
数据库
完整卸载_
oracle
数据库
卸载
oracle
数据库
卸载 ...
赞
踩
article
时间
复杂度
和
空间
复杂度
如何
计算
?_
时间
复杂度
和
空间
复杂度
如何
计算
、...
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。...
赞
踩
article
快速过一遍
计算机
基础
--
操作系统
—4.
文件
管理_
链式
分配
和
链式
存储一样吗...
快速过一遍
计算机
基础
--
操作系统
—4.
文件
管理_
链式
分配
和
链式
存储一样吗
链式
分配
和
链式
存储一样吗 ...
赞
踩
article
深入解析《企业级数据架构》:
HDFS
、
Yarn
、
Hive
、
HBase
与
Spark
的核心应用_hado...
深入解析《企业级数据架构》:
HDFS
、
Yarn
、
Hive
、
HBase
与
Spark
的核心应用_
hadoop
hdfs
hb...
赞
踩
article
jenkins
部署
springboot
项目
(超详细讲解)
_
jenkins
部署
springboot
项...
jenkins
部署
springboot
项目
(超详细讲解)
_
jenkins
部署
springboot
项目
jenkins
部...
赞
踩
article
用
coze
白嫖
GPT4
和
DALLE3
...
白嫖GPT-4和DALLE-3的方法!
用
coze
白嫖
GPT4
和
DALLE3
...
赞
踩
article
Git
秘钥生成以及
Git
lab配置(附以下问题解决方法:Key
is
invalid
Fingerp...
在进行
Git
密钥配置时,总是提示:“The form contains the following errors:Key...
赞
踩
article
机器
学习
实战笔记——
第十一章
_
keras
.
optimizers
.
sgd
...
在实际模型训练中,可能遇到以下问题:梯度消失:随着算法向下传播到较低层,梯度通常会越来越小,低层的连接权重几乎不变导致模...
赞
踩
article
哈夫曼
树
学习...
给定N个权值作为N个叶子结点,构造一棵二叉
树
,若该
树
的带权路径长度达到最小,则称这样的二叉
树
为最优二叉
树
,也称为
哈夫曼
树
...
赞
踩
article
基于
MATLAB
的CT
滤波
反投影
算法
的实验研究_
iradon
滤波
matlab
...
2)对Shepp-Logan图平行束投影数据进行
滤波
反投影
重建,别采用S-L与R-L
滤波
器进行
滤波
。1、利用”irado...
赞
踩
article
专栏
数量
创新高
、
问答wap端新视觉_
csdn
付费
专栏
达到上限...
跟着公告菌一起来看开发小哥们在奋战双11之余又上新了啥功能~博主等级越高,可创建
专栏
数量
越多博主的知识多起来之后,更多沉...
赞
踩
article
计算机
考研
|这些
院校
性价比
巨高
!
千万别
漏了
!
...
今年东北大学刚更改408,加上地区不太优势,很可能爆冷,。要做出明智的选择,需要考虑近几年的复试分数线,以及当年的热度。...
赞
踩
article
5
.
树
...
树
广义
树
概念子节点表描述方法
树
的“左子节点/右兄弟节点”描述方法 本章将扩展前几章的内容,讨论一种较为复杂的数据结构,即...
赞
踩
article
用
MATLAB
实现的
计算机
CT
断层扫描
图像
重建项目源码_
aapm
数据集的
ct
图像
重建代码...
计算机
断层扫描
是堆叠在一起的 X 射线
图像
的集合,以获得作为诊断
图像
第三维的深度信息。这些“堆叠的” X 射线
图像
作为正...
赞
踩
article
【CV】
图像
分类
、目标
检测
、语义
分割
、实例
分割
、全景
分割
_
图像
识别 cv技术
分类
...
1.
图像
分类
(image classification)
图像
分类
就是识别
图像
中存在的内容,对
图像
判断出所属的
分类
。如下...
赞
踩
article
图像
分类
、
目标
检测、
图像
分割
区别_
图像
分割
和
目标
检测区别...
1、
图像
分类
图像
分类
主要是基于
图像
的内容对
图像
进行标记,通常会有一组固定的标签,而你的模型必须预测出最适合
图像
的标签。这...
赞
踩
article
git
切换
远程
地址
分支
推送到指定
地址
分支
版本回退_
git
切换
远程
仓库
...
方式一:修改
远程
仓库
地址
【
git
remote set-url origin URL】 更换
远程
仓库
地址
,URL为新
地址
...
赞
踩
article
联阳(
ITE
)
IT6251FN
QFN64
LVDS
显示端口 多媒体
转换器
芯片
...
IT6251 www.ite.com.tw 2010年7月-2010年Rev:0.2 2/8通用描述IT 6251是一种...
赞
踩
相关标签
数据结构
oracle
数据库
microsoft
算法
c++
开发语言
经验分享
架构
hdfs
hive
java
spring boot
ide
gitlab
coze
chatGPT-4
DALLE-3
白嫖
AI
git
运维
神经网络
机器学习