复杂度分析

本文是极客时间《数据结构和算法之美》的学习笔记,介绍了算法复杂度分析方法。包括事后统计法、大O复杂度表示法,分析了几种常见复杂度,如O(1)、O(logn)等。还阐述了复杂度分析的4种情况,即最好、最坏、平均和均摊时间复杂度。

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

事后统计法

测试结果依赖环境;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(n2n^2n2)
      当m=n的时候上面的复杂度就变为O(n2n^2n2)。
    • 5O(2n2^n2n)
      对数阶
    • 6O(n!)
      阶乘阶

复杂度分析的4种情况

最好情况时间复杂度

最省时间的情况

最坏情况时间复杂度

耗时最多的情况

平均情况时间复杂度

例如在无序数组中查找一个数。数组长度为n。可能1次命中,可能2次,可能3次…最多可能是n次,也有可能不在数组中。需要的操作分别为1,2,3…n,n次。我们假设x出现在数组中和不出现在数组中的概率分别为12\frac{1}{2}21。出现在数组中每个位置的概率为1n\frac{1}{n}n1。最后得到平均复杂度O(n)。
1∗12n+2∗12n+...n∗12n+n∗12=1+2+3...+n+n22n=(1+n)∗n+2n24n=3n+141*\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、付费专栏及课程。

余额充值