二、复杂度分析(下)

上一篇讲了时间复杂度分析,以及空间复杂度分析;

这篇从要从四个方面去分析复杂度:最好情况时间复杂度最坏情况时间复杂度平均情况时间复杂度均摊时间复杂度。

1、最好、最坏情况时间复杂度

首先分析以下例子:

由于在循环中有一个 if 判断语句,所以无法粗略的定义该段代码的时间复杂度为O(n)。在这里我们就需要引入三个概念

最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度。

由该例子,我们走两个极端,所以最好情况时间复杂度为O(1);最坏情况时间复杂度为O(n)。这两种极端比较好理解,平均情况时间复杂度就需要详细解释。

2、平均情况时间复杂度

还是根据上例代码,进行分析。总共出现n+1种情况:0~n-1 以及 x不在该数组中的情况,所以公式如下:

时间复杂度为O(n)

上述方法虽然正确,但是没有考虑概率问题,出现的n+1种情况出现的概率不可能全部相等,我们可以考虑进去一些简单的概率知识。

假设需要查找的x在数组内 和 不在数组内的概率为1/2,0~n-1这n个数出现的概率为1/n,所以0~n-1出现的概率为1/2n。不在该数组出现的可能也应该是n次,得到的公式如下:

最后得到的结果也是O(n),该值在概率中叫做加权平均数,也叫做期望值。

平均时间复杂度的全称也叫做 加权平均时间复杂度。

在大多数情况下,不需要区分这三个复杂度,使用一个复杂度就可以满足需求了。

3、均摊时间复杂度

该方法是向数组中插入值,当该数组被插满的时候,将数组中的值进行累加,并把累加和赋给数组0下标的值。并且下次再插入数值时,从数组下标1的位置开始向后赋值,再次赋满的时候求和然后覆盖掉0下标的值。

我们根据代码得出:

最坏情况时间复杂度:O(n)    进入for循环求和的时候

最好情况时间复杂度:O(1)    进入该方法只进行了赋值

平均情况时间复杂度:O(1)    有n种情况O(1),只有一种额外的情况是O(n),故可得下式:

由于该情况比较特殊,它在大多数情况下都是O(1),只有在一种情况下是O(n),故我们根据这种情况引入了均摊时间复杂度

因为没出现一次O(n)求和操作,都会跟着n-1的O(1),所以这一套操作均摊之后,时间复杂度为O(1)。值就是均摊时间复杂度的基本思路。

猜你喜欢

转载自blog.csdn.net/qq_28090573/article/details/85243851