数据结构和算法:复杂度分析(下)

961 阅读4分钟

本篇旨在浅析最好、最坏、平均、均摊时间复杂度。这些时间复杂度可以表示代码在不同情况下的不同时间复杂度。

一、最好和最坏情况时间复杂度

顾名思义,最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。

同理,最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。

二、平均情况时间复杂度

一般来说,最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大,为更好地表示平均情况下的时间复杂度,需要用另外一个概念:平均情况事件复杂度

下面举例分析平均时间复杂度:

要查找变量x在数组中的位置,有n+1种情况,在数组的0-n-1位置中和不在数组中。将每一种情况下,查找需要遍历的元素个数累计起来,然后再除以n+1,就可以得到需要遍历的元素个数的平均值,即:

(1 + 2 + 3 + ... + n + n)/(n+1)=n(n + 3) / (2(n + 1))

省略掉系数、低阶、常量之后,上述公式表示的时间复杂度就是O(n)。

上述结论虽然正确,但是计算过程还有问题。在上述的n+1中遍历情况,出现的概率并不是一样的,所有需要考虑到概率来进行计算。

要查找的变量x,要么在数组中,要么不在数组中。这两种情况对应的概率计算起来很麻烦,我们这里假设x在数组中和不在数组中的概率都是1/2,另外要查找的数据出现在0~n-1这n个位置的概率也是一样的,为1/n。根据概率乘法原则,要查找的数据出现在0~n-1中任意位置的概率为1/(2n),因此平均复杂度的计算公式就变成了:

(1 + 2 + 3 + ... + n)/ (2n)+n / 2= (3n+1)/4

这个值就是概率论中的加权值,也叫期望值。所以平均时间复杂度的全称应该是加权平均时间复杂度或者期望时间复杂度


三、均摊时间复杂度

均摊时间复杂度就是一种特殊的平均时间复杂度,对应的分析方法叫做摊还分析法或者均摊分析法

使用摊还分析法需要有很特别的前提:

1 极端情况出现的频率非常有规律,而且有一定的前后时序关系

2 其他大部分情况下的时间复杂度都相同

在这两个前提之下,我们可以选择将极端情况耗费的时间平摊到其他大部分情况下。

应用场景:

对一个数据结构进行一组连续操作中,大部分情况下的时间复杂度都很低,只有个别情况下的时间复杂度较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间较低的操作上。而且,能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。

四、小结:

本篇讲了几个关于时间复杂度分析相关的概念,包括最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。之所以引入这些概念,是因为,同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。在有了这些概念之后,可以全面地表示一段代码的执行效率。



下一篇:数据结构和算法:数组