复杂度分析

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

事后统计法

测试结果依赖环境;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!)
      阶乘阶

复杂度分析的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} 12n1+22n1+...n2n1+n21=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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值