衡量一个算法是否良好
运行时的快慢 | 时间复杂度 |
---|---|
所需要耗费的资源 | 空间复杂度 |
时间复杂度:
找到基本语句,并计算该语句的总执行次数(以基本语句执行次数最多情况计算该算法的时间复杂度)
一般求算法的时间复杂度时,需要了解该算法的原理
用大O的渐进表示法表示
二分查找:O(lgN)
递归:O(N)
单次递归调用语句的次数 * 总递归次数
- 大部分单次递归调用语句次数为1(每次执行无循环语句)
斐波那契数列
- 要计算数列中的某一项值,也是递归计算
- 如果要计算第N项,其时间复杂度为 O(2^N)
- 这种算法时间复杂度过高,性能太差(因为重复次数太多),如图,每计算一项就需要一个树形图,
- 左侧在求F5时就已经求得了F4,但是在右侧依旧要求F4
对斐波那契算法优化,时间复杂度优化到O(N)
借助辅助空间
递归是函数的循环调用
每调用一个函数,都会开辟一块栈帧,在编译阶段就确定了一块栈帧的大小
栈 帧:
- 函数在栈上分配的各自空间,每个空间就叫栈帧(栈空间中每个小空间)实际是一种数据结构
- 该结构中保存的是函数调用相关的一些信息,比如参数、局部变量、一些寄存器信息、返回时需要用的信息
- 栈空间有固定的大小,所以函数递归调用次数不能过多,否则会造成栈溢出