开发中,可能有多种算法能实现同样一个业务功能
当对软件运行效率等有严格要求时,我们就要对多个算法的执行效率和内存占用进行分析
这种分析就是算法的复杂度分析,具体可分为时间复杂度和空间复杂度的分析
掌握了复杂度分析是写出优秀算法的前提
本文将不涉及具体的复杂度分析,只将最核心的理论梳理出来
时间复杂度
它是渐进时间复杂度的简称,表示代码执行时间随数据规模增长的变化趋势,并不代表代码真正的执行时间
大O表示法
当数据量 n 很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略
我们只需要记录一个最大量级就可以了
复杂度量级
复杂度量级有以下几种,它们代表的算法效率由上到下,由左到右越来越低,NP 问题可以考虑使用贪婪算法快速找到近似解
多项式量级 | 非多项式量级(NP) |
---|---|
常量阶 | 指数阶 |
对数阶 (提示:求解 2x=n ) | 阶乘阶(旅行商问题) |
线性阶 | |
线性对数阶 | |
平方阶 | |
立方阶 | |
k 次方阶 |
如果同一算法在不同的输入情况下,复杂度有量级的差距,那么复杂度还可以再分为以下几种:
最好、最坏情况时间复杂度
平均情况时间复杂度
计算过程涉及到概率
均摊时间复杂度
场景: 对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系
摊还分析:这种场景中,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上
在能够应用均摊时间复杂度分析的场景,一般均摊时间复杂度就等于最好情况时间复杂度
空间复杂度
它是渐进空间复杂度的简称,表示代码占用的存储空间随数据规模增长的变化趋势,其他概念与时间复杂度类似