文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。
事后统计法
测试结果依赖环境;2 与测试的数据集大小有关
大O复杂度表示法
所有代码的执行时间T(n)与每行代码的执行次数n成正比.
T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
时间复杂度分析
1 只关注循环次数最多的一段代码。
2 加法法则:总复杂度等于量级最大的那代码的复杂度。
3 乘法法则:嵌套代码的复杂度=嵌套内外代码复杂度的乘积。
- 几种常见的复杂度
- 1 O(1)
O(1)表示是常量级别,并不是只执行一行代码。 - 2 O(logn) O(nlogn)
对数阶时间复杂度很常见,只是比较难看出来。例如二分查找。logn 是指不管底数是多少,都即为logn。空间复杂度一般不会有这种复杂度。 - 3 O(m+n) O(m*n)
时间复杂度由2个数据的规模来决定。常见的输入是一个二维数组的情况下多数是这样的。 - 4O(
n
2
n^2
n2)
当m=n的时候上面的复杂度就变为O( n 2 n^2 n2)。 - 5O(
2
n
2^n
2n)
对数阶 - 6O(n!)
阶乘阶
- 1 O(1)
复杂度分析的4种情况
最好情况时间复杂度
最省时间的情况
最坏情况时间复杂度
耗时最多的情况
平均情况时间复杂度
例如在无序数组中查找一个数。数组长度为n。可能1次命中,可能2次,可能3次…最多可能是n次,也有可能不在数组中。需要的操作分别为1,2,3…n,n次。我们假设x出现在数组中和不出现在数组中的概率分别为
1
2
\frac{1}{2}
21。出现在数组中每个位置的概率为
1
n
\frac{1}{n}
n1。最后得到平均复杂度O(n)。
1
∗
1
2
n
+
2
∗
1
2
n
+
.
.
.
n
∗
1
2
n
+
n
∗
1
2
=
1
+
2
+
3...
+
n
+
n
2
2
n
=
(
1
+
n
)
∗
n
+
2
n
2
4
n
=
3
n
+
1
4
1*\frac{1}{2n}+2*\frac{1}{2n}+...n*\frac{1}{2n}+n*\frac{1}{2}=\frac{1+2+3...+n+n^2}{2n}=\frac{(1+n)*n+2n^2}{4n}=\frac{3n+1}{4}
1∗2n1+2∗2n1+...n∗2n1+n∗21=2n1+2+3...+n+n2=4n(1+n)∗n+2n2=43n+1
均摊时间复杂度
例如ArrayList的插入。首先开辟n个空间。从0到n-1,插入复杂度O(1)。第n次,需要扩容,复制原数组,再插入,复杂度O(n)。再接下来的n+1到2n-1次,插入复杂度O(1)。第2n次,需要扩容,复制原数组,再插入,复杂度O(n)。如此往复。我们可以把O(n)的复杂度均摊到前面的n次操作中,从而得到均摊时间复杂度O(1)。