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

本篇旨在浅析最好、最坏、平均、均摊时间复杂度。这些时间复杂度能够表示代码在不一样状况下的不一样时间复杂度。算法

1、最好和最坏状况时间复杂度

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

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

2、平均状况时间复杂度

通常来讲,最好状况时间复杂度和最坏状况时间复杂度对应的都是极端状况下的代码复杂度,发生的几率其实并不大,为更好地表示平均状况下的时间复杂度,须要用另一个概念:平均状况事件复杂度数据结构和算法

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

要查找变量x在数组中的位置,有n+1种状况,在数组的0-n-1位置中和不在数组中。将每一种状况下,查找须要遍历的元素个数累计起来,而后再除以n+1,就能够获得须要遍历的元素个数的平均值,即:事件

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

省略掉系数、低阶、常量以后,上述公式表示的时间复杂度就是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

这个值就是几率论中的加权值,也叫指望值。因此平均时间复杂度的全称应该是加权平均时间复杂度或者指望时间复杂度


3、均摊时间复杂度

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

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

1 极端状况出现的频率很是有规律,并且有必定的先后时序关系

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

在这两个前提之下,咱们能够选择将极端状况耗费的时间平摊到其余大部分状况下。

应用场景:

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

4、小结:

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



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

相关文章
相关标签/搜索