复杂度分析
数据结构和算法解决的是 快 和 省 的问题。用 执行效率 评价算法好坏。用 时间复杂度分析 和 空间复杂度分析 衡量执行效率。
时间复杂度
概念
表示代码执行时间随着数据规模增大的变化趋势,也称为渐进时间复杂度(asymptotic time complexity),
定理
-
代码总的复杂度等于量级最大的那段代码的复杂度
-
乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
常见的时间复杂度
- O(1) O(logn) O(n) O(m + n) O(nlogn) O(n^k) O(2^n) O(n!)
O(logn) O(nlogn)
-
对数
概念:对数是对求幂的逆运算。
描述:如果 a 的 x 次方 等于 n, 那么 x 被称为 以 a 为底 n 的对数。其中 a 叫做对数的底数,n叫做真数。
换底公式:
-
为什么无论底是多少,我们都可以将对数阶的时间复杂度统一记为 logn
根据换底公式,最后都可以转化为:
-
O(nlogn) 是一种常见的时间复杂度,归并排序、快速排序的时间复杂度都是 O(nlogn)
空间复杂度
概念
空间复杂度的全称是渐进空间复杂度(asymptotic space complexity, 表示算法的存储空间与数据规模之间的增长关系
四种时间复杂度
最好、最坏、平均、均摊时间复杂度
-
平均时间复杂度
平均时间复杂度是指代码被重复执行无数次,对应的时间复杂度的平均值
平均时间复杂度更准确的描述应该为加权平均时间复杂度或者期望时间复杂度
-
均摊时间复杂度
概念:通过摊还分析法得到的时间复杂度,叫均摊时间复杂度
应用场景:对一个数据结构进行一组连续操作,在大部分情况下,时间复杂度很低,只有个别情况下,时间复杂度较高,而且,这些操作之间存在前后连贯的时序关系,这个时候,我们就可以把这一组操作放在一起分析,观察是否能够将交给时间复杂度的那次操作的耗时均摊到其他较低时间复杂度的操作上。还有,能够应用均摊复杂度的场景中,一般均摊时间复杂度等于最好时间复杂度