如何评价一个算法的好坏?
算法是什么?
算法是解决问题的方法。
解决一个问题的方法很多,但是不一定都是最高效的,但我们也不可能把所有的方法都实现一遍,然后一一比对。因此,我们需要一些评判标准去衡量这些方法的好坏。
那么,如何去判断一个算法的好坏呢?
首先,它必须能彻底解决问题。
其次,程序在任何情况下都不会崩溃。
在此基础上,程序运行时间更短,占用内存更少,就认为这个算法更好。
用专业一点的话总结,就是如下几点:
- 准确性:彻底解决问题
- 健壮性:不崩溃
- 时间复杂度:时间效率
- 空间复杂度:占用空间
时间复杂度
判断一个算法的运行时间,不会真的把它编写出来,然后运行一遍,看他的时间消耗。而是通过一个合理的方法预估它的运行时间。
那么如何预估?
计算每条语句的执行次数(又叫该语句的频度)。用总的执行次数间接表示程序运行时间。
频度可以简化:
- 加法常数,去掉
- 无限大变量,只保留指数最高的变量式子
- 最高项系数简化为1
使用大O记法(是字母O,不是数字0)来表示算法的运行时间。
1 | O(频度) |
这里的频度是简化后的频度。
常见的时间复杂度:
1 | O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O( n^2 )平方阶 < O( n^3 )立方阶 < O( 2^n )指数阶 |
空间复杂度
通常,影响算法空间复杂度最大的是运行时申请的临时存储空间。和时间复杂度类似,算法的空间复杂度也用大O记法表示。
如果程序所占用的空间,不随某个变量n的大小变化,也就是他的存储空间是固定的,那么这个算法的空间复杂度为O(1)。
如果随着n增大,程序申请的空间成线性增长,则空间复杂度为O(n)。
同理,成平方关系增长,就是O( n^2 );成立方关系增长,就是O(n^3)。