算法复杂度分析(上)
数据结构和算法本身解决的是“快”和“省”的问题。所以,执行效率是算法一个非常重要的考量指标。如何衡量编写的代码的执行效率?可以通过时间、空间复杂度分析。
为什么需要复杂度分析?
事后统计法的局限性
我们可以把代码跑一遍,通过统计、监控就能得到算法执行的时间和占用的内存大小。这种方法叫做事后统计法。但是这种方法有非常大的局限性。
1.测试结果非常依赖测试环境
测试环境中硬件的不同会对测试结果有很大的影响。比如,同一段代码在不同代CPU处理器(如i3和i9)执行速度相差很大。还有,比如原本在这台机器上a代码比b代码的执行速度要快,等我们换到另一台机器上时,可能会有截然相反的结果。
2.测试结果受数据规模的影响很大
对同一个排序算法,待排序数据的有序度不一样,排序的执行时间就会有很大的差别。极端情况下,如果数据已经是有序的,那排序算法不需要做任何操作,执行时间就会非常短。除此之外,如果测试数据规模太小,测试结果可能无法真实地反映算法的性能。比如,对于小规模的数据排序,插入排序可能会比快速排序要快。
所以,我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。这就是下面介绍的时间、空间复杂度分析方法。
大O复杂度表示法
算法的执行效率,粗略地讲就是算法代码的执行的时间。但是,如何在不运行代码的情况下,用“肉眼”得到一段代码的执行时间?
下面有段代码,我们可以估算一下这段代码的执行时间:
public int sum(int n) {
int sum = 0; // 一个unit_time
int i = 1;