Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【初探数据结构】时间复杂度和空间复杂度

【初探数据结构】时间复杂度和空间复杂度

作者头像
我想吃余
发布于 2025-03-31 08:23:26
发布于 2025-03-31 08:23:26
13104
代码可运行
举报
运行总次数:4
代码可运行

时间复杂度

时间复杂度的概念

算法执行时间随输入规模(N)增长的渐进趋势的数学函数,具体表现为算法中基本操作的执行次数

由于一个算法所花费的时间与其中语句的执行次数成正比例,所以算法中的基本操作的执行次数,为算法的时间复杂度。

为什么不用时间呢?

  • 不同硬件设备运行速度差异大,实际时间不具备普适性。

即:

找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N ; ++ i)
	{
		for (int j = 0; j < N ; ++ j)
		{
		++count;
		}
	}
	for (int k = 0; k < 2 * N ; ++ k)
	{
		++count;
	}
	int M = 10;
	while (M--)
	{
		++count;
	}
	printf("%d\n", count);
}

Func1执行的基本操作次数:

F(N)=N^2+2*N+10

那么,我们每次表示时间复杂度都要写像这样长长的表达式吗?

麻烦,而且我们没有必要去精确计算执行次数,只需要一个大概次数,所以我们使用大O渐进表示法。

大O渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。 推导大O阶方法:

目标:忽略低阶项和常数系数,聚焦最高阶项的增长趋势。

推导步骤

  1. 用常数1替代所有加法常数(如 F(N)=1000O(1))。
  2. 只保留最高阶项(如 F(N)=N³ + N² + 1O(N³))。
  3. 去除最高阶项的系数(如 F(N)=3N²O(N²))。

使用大O的渐进表示法后,Func1的时间复杂度为:

O(N^2)

大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

此外,有一些算法的时间复杂的存在最好、最坏和平均的情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

看一个例子:在一个长度为N数组中搜索一个数据x

  • 最坏情况:N次且没有找到
  • 平均情况:N/2次找到
  • 最好情况:1次找到

一般时间复杂度取用算法的最坏运行情况

所以:数组中搜索数据的时间复杂度为O(N)

易错建议
  1. 很多初学者,找时间复杂度习惯用循环去计算,实则很容易出错。建议读者一定要去观察程序的执行逻辑。 误区:循环层数越多,时间复杂度一定越高。 反例
代码语言:javascript
代码运行次数:3
运行
AI代码解释
复制
		for (int i = 0; i < N; i++) {       // O(N)
		    for (int j = 0; j < 100; j++) { // 固定执行100次
		        // 操作
		    }
		}

总时间复杂度为 O(N),而非 O(N²)

  1. 时间复杂度代表的是一个量级。你可以尽你最大的想象力去想象他有多大,我的意思是,他是无法被轻易改变的。如:
N-9999999999999999999999……

他的时间复杂度依然为:

O(N)

同样的:

9999999999999999999999……

他的时间复杂度依然为:

O(1)

空间复杂度

空间复杂度也是一个数学表达式(函数),是对一个算法在运行过程中临时占用存储空间大小的量度(注意这个临时) 。也使用大O渐进表示法

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

你知道为什么要有这个”临时“吗?

因为空间是可以重复利用的,算法中开辟过的空间重复使用空间复杂度不会增加。 而时间是一去不复返的,无法重复使用。

看一个例题你就明白了

代码语言:javascript
代码运行次数:1
运行
AI代码解释
复制
// 计算Fib的空间复杂度?
// 返回斐波那契数列的前n项
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

这里的时间复杂度不难推导:O(2^N)

那么空间复杂度呢? 也是O(2^N)吗? 没错,这里重复利用了空间,实际上空间复杂度为:

O(N)
  • 误区:递归算法的空间复杂度一定很高。 反例:递归遍历链表的空间复杂度为 O(N)(递归栈深度),而迭代法为 O(1)

常见的复杂度对比

总结

  • 时间复杂度关注算法执行次数的增长趋势,空间复杂度关注额外空间的占用。
  • 大O渐近表示法通过简化表达式,聚焦主要矛盾。
  • 实际应用中需结合具体场景选择最优算法。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构入门(2)时间复杂度与空间复杂度
下面一串代码是关于如何实现斐波那契数列,代码非常简洁,其实编程是非常灵活的,一个功能可以有不同的实现方法,通常我们需要找到效率最高的,同时代码量非常可观,简洁的理想代码。
对编程一片赤诚的小吴
2024/02/11
1210
【数据结构与算法】时间复杂度与空间复杂度
早期,计算机刚被发明出来,内存空间并不是很大,所以不仅追求程序运行时的时间效率,还追求空间效率,但发展到今天,已经不太追求空间效率了,时间效率的追求是不变的。
aosei
2024/01/23
1210
【数据结构与算法】时间复杂度与空间复杂度
数据结构:时间复杂度
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即🔍时间复杂度和🔍空间复杂度。
用户11396661
2024/12/09
1230
数据结构:时间复杂度
【时间复杂度空间复杂度】
当文件没有进行保存时,这个文件保留在内存中,一旦断电,文件将无法保存,因此为了避免这种情况的发生,,处理文件之后,应该及时的ctrl+s保存到磁盘当中去。
每天都要进步呀
2023/03/28
1.7K0
【时间复杂度空间复杂度】
【初阶数据结构】时间复杂度和空间复杂度(超有趣+超详细)
作为一位程序员,一颗强有力的好胜心和对知识充满渴望的眼神是必不可少的。如果你还拥有一头秀发,那更是程序员界中的佼佼者(开玩笑)😊。
埋头编程
2024/10/16
1420
【数据结构与算法】时间复杂度和空间复杂度
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
平凡的人1
2022/11/15
2990
【数据结构与算法】时间复杂度和空间复杂度
时间和空间复杂度
❤️❤️下面求斐波那契数列的算法效率高还是不高?为什么?该如何衡量一个算法的效率呢?
E绵绵
2024/04/17
1640
时间和空间复杂度
【数据结构与算法】2.时间复杂度和空间复杂度
算法效率分为两种:第一种是时间效率;第二种是空间效率。时间效率又称为时间复杂度,而空间效率又称为空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度衡量一个算法所需要的额外空间。
爱敲代码的小杨.
2024/05/07
1370
【数据结构与算法】2.时间复杂度和空间复杂度
[数据结构]——算法的时间复杂度和空间复杂度
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
小李很执着
2024/06/15
1580
[数据结构]——算法的时间复杂度和空间复杂度
【初阶数据结构】——时间复杂度和空间复杂度详解(C描述)
我们已经了解了什么是算法,那当我们写出一个算法的时候,如何去衡量这个算法的好坏呢?
YIN_尹
2024/01/23
4120
【初阶数据结构】——时间复杂度和空间复杂度详解(C描述)
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
如下斐波那契数列的递归实现方式非常简洁,但是简洁一定好的吗?单纯通过代码的长度去衡量算法效率是不准确的。
是店小二呀
2024/07/22
1101
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
知识改变命运:数据结构 【时间和空间复杂度】
**算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作 空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间, 在计算机发展的早期,计算机的存储容量很小。**所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
用户11319080
2024/10/17
840
算法的时间复杂度和空间复杂度
        这个算法看起来十分简洁,但是它的效率是很差劲的,算50以上就会算算很久,那么它的效率就很差,效率的好坏不能只是看代码是否简洁。 
2024/04/30
1580
DS:时间复杂度和空间复杂度
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。
小陈在拼命
2024/02/17
2540
DS:时间复杂度和空间复杂度
时间和空间复杂度
算法效率分析分为两种:第一种是时间效率,第二种是空间效率 。 时间效率被称为时间复杂度,而空间效率被称作 空间复杂度 。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。
用户10921393
2024/01/23
1160
时间和空间复杂度
【数据结构】时间复杂度与空间复杂度
数据结构是什么呢?其实数据结构就是计算机存储和组织数据的一种形式,这些数据存在一种或多种特定关系的数据元素的集合。 算法又是什么?数值分析中我们对一个复杂的数学问题,会通过设定特定的算法将这个复杂的数学问题转化成加减乘除进行计算,这也是算法,事实上,算法就是定义良好的计算过程,用来将输入的数据转化成输出结果。
HABuo
2024/11/19
660
【数据结构】时间复杂度与空间复杂度
数据结构初步(一)- 时间与空间复杂度
当当当,本节开始进入到数据结构的学习之旅。什么是数据结构呢,什么又是时间复杂度与空间复杂度呢?学习数据结构的道路并不是一帆风顺的,唯有持续冲锋数据结构的高地。
怠惰的未禾
2023/04/27
5870
数据结构初步(一)- 时间与空间复杂度
【初阶数据结构】时空罗盘妙解:时间复杂度&&空间复杂度
本篇开启数据结构初阶的学习,数据结构的重要性已经不言而喻,无论是在面试还是工作的时候,都占据重要的地位,面对海量数据或复杂逻辑关系,巧妙运用数据结构可梳理问题脉络,找到简洁的解题思路📖
DARLING Zero two
2025/01/20
1240
【初阶数据结构】时空罗盘妙解:时间复杂度&&空间复杂度
算法的时间复杂度
算法在编写成可执行程序后, 运行时需要耗费时间资源和空间资源. 因此衡量一个算法的好坏, 一般是从时间和空间两个维度来衡量的, 即时间复杂度和空间复杂度.
用户11317877
2024/10/16
1590
算法的时间复杂度
打开数据结构大门:深入理解时间与空间复杂度
在我们的编程之旅中,C语言为我们打下了坚实的基础。然而,如今我们踏入了新的领域——数据结构与算法
是Nero哦
2024/01/18
2150
推荐阅读
相关推荐
数据结构入门(2)时间复杂度与空间复杂度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档