时间空间复杂度详解

本文详细介绍了时间复杂度和空间复杂度的概念。时间复杂度通过大O表示法来描述算法执行次数,举例说明了如何从函数表达式中获取渐进表示。递归函数的时间复杂度计算方法也进行了讲解。空间复杂度则关注算法运行过程中内存的使用,以斐波那契数列为例,阐述了如何计算空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 时间复杂度的概念

时间复杂度的定义:在计算机科学中, 算法的时间复杂度是一个函数 ,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。

我们在描述算法的复杂度是一般都是用渐进表示法O(n)来表示的,大O渐进表示法是指取出对结果影响不大的项之后所保留的结果。总结下来说:以最坏的情况计算得到执行次数F(n)函数经以下操作后可以得到我们的渐进表示法:当F(n)非常数时,保留最高阶并去除常数系数则可得到渐进表示。当复杂度为常数级时用1代替。

常见时间复杂度计算举例

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);
}

从该函数中我们以能得出F(n)表达式为n^2+2n+10。处理后可得渐进表示法O(n)= n^2.

我们比较常见的递归函数的时间复杂度是怎么计算的呢,我们以最简单的阶乘函数举例。

long long Fac(size_t N)
{
 if(0 == N)
 return 1;
 
 return Fac(N-1)*N;
}

在递归函数中,我们将每次递归调用的执行次数累加即可。易知F(n) = n+1 ; O(n)= n。

2.空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中 临时占用存储空间大小的量度
空间复杂度不是程序占用了多少 bytes 的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用 O 渐进表示法
注意: 函数运行时所需要的栈空间 ( 存储参数、局部变量、一些寄存器信息等 ) 在编译期间已经确定好了,因 此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
与时间复杂度同理,我们用变量的个数来描述时间复杂度,我们都明白,在C语言中调用函数的过程中会开辟栈帧。
我们用斐波那契数列的递归实现方法来解析一下它的空间复杂度。
long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

 由图可知当求f(n)时会先调用f(n-1)而后一直开辟新的空间直到求出f(n-1)时开辟的空间将会被系统收回,由上图我们易知整个过程中最长的链是靠左侧的那一条,也就是最坏的情况考虑,那在这个过程中开辟的函数栈帧是多少呢 一共n个,为什么不是所有开辟的空间统一计算呢,这是空间复杂度和时间复杂度计算的区别,时间一去不复返,而空间是可以重复利用的。用渐进表达式求斐波那契数的空间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值