时间空间复杂度(基础篇)——数据结构与算法

简介: 正片开始👀时间复杂度👏上一篇搞定了复杂度的相关概念,现在就可以直接上阵实战一手了,为什么要专门搞一个计算实践,因为不仅是工作,学校考试啊复杂度也是和算法直接挂钩的趁瓷器活没来赶紧磨磨咱的金刚钻。

正片开始👀

时间复杂度👏

上一篇搞定了复杂度的相关概念,现在就可以直接上阵实战一手了,为什么要专门搞一个计算实践,因为不仅是工作,学校考试啊复杂度也是和算法直接挂钩的趁瓷器活没来赶紧磨磨咱的金刚钻。

来看第一个:

long Func(n)
{
return n<2?n:Func(n-1)*n ;
}

我们求递归阶乘Func的时间复杂度,说里面 n 最后要到1,我们可以认为递归了多少次就他就计算了多少次,我们稍加思索就可以看出他的时间复杂度是 O(N)。严格来说,递归算法怎么计算呢?


是递归次数 × 每次递归的函数的次数


这个每次递归函数的次数是个什么鬼呢?我们的三目操作符在递归中每次会走一次,也就是这个函数会出现一次,就是所谓的常数次嘛 O(1),递归了n次,自然就是O(N)了。如果我再在前面加上个 while(n–),又是一个执行n次的循环,相当于是在嵌套循环了,这是复杂度就是里外都O(N),为O(N^2)。


再来!

long Func(n)
{
return n<2?n:Func(n-1)+(n-2); 
}

这是斐波那契的递归数列,乍一看和上面的阶乘没太大区别,还是在算他递归了多少次,但是这下可没那么好算了捏。这时我们可以拿起笔画一画多半就有个谱了

image.png

最后结果一定会让n走到 1,这个是总数的 n ,2^n的 n 只是一个参数,会发现每一层都会满足等比数列关系,有 2的(n-1)次方的累加 = 2的n次方 - 1,这里1可以忽略就是2的n次方。


但是!完了吗?我们格局打开


这里的-1,是要每一层都是满的才满足,但是实际上不满,我们 n,n-1,n-2……最后是1没毛病;我们到其他路线上,n-2,n-3,n-4……压根儿到不了最后一行,在他头上提早结束,后面的同理,也就是说我们整个流程图在后面会有一大坨空白部分,没有调用次数捏。但是!就算缺吧,这些漏网份子依然相对于整体而言非常的小,影响不大,估算角度他依然是2^n。


其实际图像应该是个三角形:

image.png

格局继续打开

那么如果是2的n次方,那么你将见证一个计算时间复杂度的极端,要知道算法中二分查找是非常快的,要在10亿对象中找一个只需要 log2^1000000000,即30秒左右。


但是上面的斐波那契运行起来可谓慢的令人发指,我在之前在学习C语言递归时就在vs2019上试过,当n = 10时,1000次,小儿科秒出;n = 30时,十亿次,很快啊,看来CPU是有备而来,n = 50时,可以说久了去了,整个程序没有卡死胜似卡死。


看看咱CPU运行速度是多少赫兹可以换算运行速度,一般民用配置高一点点的能达到一秒十亿次计算,别看n只是涨了一点点,电脑寿命够长就给n整个80,你的寿命够长就可以给n整个100。


我们使用递归搞斐波那契会有许多重复,我们改进一下:

# include<stdio.h>
# include<malloc.h>
long long*Func(n)
{
long long* Farr= malloc(sizeof(long long)*(n+1));
Farr[0] = 0;
if(n==0)  // 防止n=0时发生越界
{
return Farr;
}
Farr[1] = 1;
}

这个算法就是有前面就能推后面,再看看时间复杂度是O(N),这个优化简直就是质的优化,这个思想就是以空间换时间,开了一个数组,都用了空间,但是性能更快了。


空间复杂度👏

说是空间复杂度,和空间也不沾关系,他计算的是大概定义的变量的个数,实际意义里面就算是结构体大不了你几十个字节嘛,也没必要去整烂活搞几万个字节出来。我小小 8个G,几十亿字节,你占用我几字节,几百字节,几千字节我压根儿不甩你,所以为什么不谈空间大小谈个数。


可能如今就只有嵌入式比较介意空间,因为嵌入式通常是在一些设备上面,举个栗子就是我们常见的智能居家AI,一个吸尘器机器人会用到的探测器算法,内存条占用多了机器咋安是吧,不是内存贵是空间有限。

我们就拿刚刚的阶乘来说,从n开始,会建立一个栈帧,每调用一次递归就要创建一个栈帧,每个栈帧里面空间是常数个,调用了n次,那么空间复杂度就是常数×n为O(N)。

相关文章
|
29天前
|
机器学习/深度学习 存储 算法
颠覆认知!Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【7月更文挑战第22天】在Python算法设计中,时间与空间复杂度是评估算法效能的核心。时间复杂度不仅限于大O表示法,还涵盖平均与最坏情况分析。空间复杂度虽关注额外存储,但也反映内存效率。平衡二者需视场景而定,如利用原地算法减少内存消耗,或牺牲空间加速执行。算法优化技巧,如分治与动态规划,助你在资源与速度间找寻最优解,从而高效应对大数据挑战。
30 3
|
2月前
|
存储 算法 C语言
数据结构中的空间复杂度
优化空间复杂度对于提升程序性能和资源利用率至关重要,特别是在资源受限的环境(如嵌入式系统和移动设备)中。高效的数据结构和算法设计可以显著提升程序的执行效率和可扩展性。 综上所述,理解和优化空间复杂度是设计高效数据结构和算法的关键。通过分析常见数据结构的空间复杂度,并结合实际代码示例,我们可以更好地理解这一重要概念,并在实际编程中应用这些知识。希望本文能帮助你更好地掌握空间复杂度及其在数据结构中的应用。
16 2
|
14天前
|
搜索推荐
九大排序算法时间复杂度、空间复杂度、稳定性
九大排序算法的时间复杂度、空间复杂度和稳定性,提供了对各种排序方法效率和特性的比较分析。
28 1
|
28天前
|
存储 算法 搜索推荐
深度剖析 Python 算法:时间复杂度与空间复杂度的爱恨情仇,你站哪边?
【7月更文挑战第23天】在Python算法设计中,时间复杂度与空间复杂度如影随形,反映算法效率与资源消耗。时间复杂度揭示算法随输入规模增长的计算趋势,空间复杂度关注额外存储需求。找最大值示例中,两种实现均具O(n)时间与O(1)空间复杂度,但在排序等复杂场景下,如冒泡排序与快速排序,或哈希表与二叉树查找,权衡变得关键。实时系统偏好低时间复杂度算法,存储受限环境则需关注空间效率。最佳选择依应用场景而定,掌握二者平衡,方能编写高效代码。
24 10
|
28天前
|
存储 缓存 算法
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是关键考量,需精妙平衡以优化程序性能。时间复杂度反映算法随输入规模增长的执行时间趋势,空间复杂度关注额外存储需求。线性搜索O(n)时间,O(1)空间;二分搜索O(log n)时间,O(1)空间,提升效率;动态规划如斐波那契数列O(n)时间与空间,利用存储减小计算。实际应用需按场景需求调整,如实时数据偏重时间,资源受限环境优先考虑空间。平衡两者,理解算法本质,结合实践,创造高性能程序。
35 7
|
28天前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是幕后操控程序效率的双雄。时间复杂度反映算法执行时间随输入规模增长的速度,空间复杂度则计量算法运行时额外内存的使用。如顺序查找的时间复杂度O(n)与固定空间O(1),对比冒泡排序的O(n^2)时间和快速排序的O(n log n)时间优势,后者虽递归消耗空间,但在多数情况下提供更佳性能。根据需求,可权衡选择,如利用哈希表在充足内存下实现O(1)查找,或在空间受限时,偏好空间效率更高的算法,实现Python代码的高性能与优雅。
36 6
|
27天前
|
存储 算法 搜索推荐
揭秘!Python算法设计的隐形杀手:忽视时间复杂度与空间复杂度的后果有多严重?
【7月更文挑战第24天】在 Python 编程中, 算法设计是性能与效率的基石。忽视时间复杂度 (如使用 O(2^n) 的斐波那契数列递归算法而非 O(n) 的动态规划版本) 和空间复杂度 (如在插入排序中每次迭代都复制整个已排序数组, 导致 O(n^2) 的空间复杂度) 可能严重拖累程序。性能优化至关重要, 合理的算法设计保证程序高效稳定, 是攀登技术高峰的坚实阶梯。
36 3
|
27天前
|
算法 搜索推荐 数据处理
震惊!Python算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第24天】在编程世界里, Python以简洁强大备受欢迎, 但算法设计与复杂度分析对程序性能至关重要。算法是程序的灵魂, 其效率直接影响数据处理能力。时间复杂度衡量算法执行速度, 如冒泡排序O(n²)与快速排序O(n log n)的显著差异; 空间复杂度关注内存占用, 递归算法需警惕栈溢出风险。优秀算法需平衡时间和空间效率, 深入理解问题本质, 迭代优化实现高效可靠。
25 2
|
27天前
|
算法 Python
算法小白秒变高手?一文读懂Python时间复杂度与空间复杂度,效率翻倍不是梦!
【7月更文挑战第24天】在编程中,算法效率由时间复杂度(执行速度)与空间复杂度(内存消耗)决定。时间复杂度如O(n), O(n^2), O(log n),反映算法随输入增长的耗时变化;空间复杂度则衡量算法所需额外内存。案例对比线性搜索(O(n))与二分搜索(O(log n)),后者利用有序列表显著提高效率。斐波那契数列计算示例中,递归(O(n))虽简洁,但迭代(O(1))更节省空间。掌握这些,让代码性能飞跃,从小白到高手不再是梦想。
21 1
|
7天前
|
存储 算法
【数据结构】——时间复杂度与空间复杂度
【数据结构】——时间复杂度与空间复杂度