(摘自浙大数据结构慕课)
空间复杂度
S(n)=C×N
- 递归
这里引用《算法竞赛入门经典(第2版)》中的描述:
如果在递归调用初期查看调用栈,则会发现每次递归调用都会多一个栈帧。在C语言的函数中,调用自己和调用其他函数并没有任何本质区别,都是建立新栈帧,传递参数并修改当前代码行。在函数体执行完毕后删除栈帧,处理返回值并修改当前代码行。调用栈所在的段称为堆栈段(Stack Segment)。和其他段一样,堆栈段也有自己的大小,不能被越界访问,否则就会出现段错误。
如下图,当N过大时,计算机甚至不会返回结果——段错误。(递归的弊端)
- (c语言)比较大的数组应尽量声明在main函数外,否则程序可能无法运行。
在递归中提到堆栈段以及栈溢出。而栈溢出不一定是递归调用太多,也可能是局部变量太大,局部变量也存放在堆栈段中。换言之,只要总大小超过允许范围,就会产生栈溢出。
时间复杂度
-
初级:对于一般函数而言,只需分析乘除法的次数(加减法速度比乘除快很多,可以忽略不计)。
在研究一个算法的效率时往往选择分析最坏情况复杂度:最坏情况复杂度往往比平均复杂度方便计算。 -
高级:对算法不做精细的分析,只需知道随着数据规模的增长,时间增长的大致趋势。