文章目录
时间和空间复杂度有什么用
分析用来衡量算法代码的执行效率。
为什么需要复杂度分析?
事后统计法
把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。这种方法叫事后统计法。它是正确的,但是并不通用。首先测试结果非常依赖测试环境;比如同一串代码在i9的处理器和i3的处理器上面的运行时间肯定是不同的。其次和数据的初始状态和规模有关系;比如要进行一串数据的排序,如果这串数据本来就是有序的,那么运行时间肯定非常短。比如,对于小规模的数据排序,插入排序可能反倒会比快速排序要快!
我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。
大 O 复杂度表示法
大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。注意是变化趋势。
公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。
时间复杂度分析
时间复杂度分析的三种技巧
- 只关注循环执行次数最多的一段代码
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
几种常见时间复杂度实例分析
- O(1)、O(n)
- O(logn)、O(nlogn)
- O(m+n)、O(m*n)
空间复杂度分析
渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。
我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。
最好、最坏、平均、均摊时间复杂度
为了表示代码在不同情况下的不同时间复杂度,我们需要引入三个概念:最好情况时间复杂度、最坏情况时间复杂度和平均情况时间复杂度。
最好时间复杂度
最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
最坏时间复杂度
最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。
平均情况时间复杂度
最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大。为了更好地表示平均情况下的复杂度,我们需要引入另一个概念:平均情况复杂度。
代码在不同情况下复杂度出现量级差别,则用代码所有可能情况下执行次数的加权平均值表示。
均摊时间复杂度
对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。
坑位待填,现在主要是讲述时间、空间复杂度思路
参考资料
王争专栏:数据结构与算法之美
《数据结构》严蔚敏