0%

时间复杂度分析

在上一篇文章中我们提到了时间复杂度大O分析法的使用,这次继续来探究时间复杂度的分析

我们先来看一下下面这段代码

这段代码的作用是在数组中寻找x的位置,找到了直接返回位置,没有找到的话返回-1,用上一篇文章所学到的知识,可以很清楚的看出来,这段代码的时间复杂度为O(n)

但是这段代码明显还有优化的空间,如果我们在数组中间寻找到x的话,就不需要把整个数组都循环一边了,所以可以优化为下面这段代码。

如果在这种情况下的话,就不能用上一次所说到的方法来衡量了,因为我们不知道需要寻找的x所在的位置在哪里,如果在第一个的话,它的时间复杂度就是O(1),如果这个数组里没有的话,就需要全部遍历一遍,它的时间复杂度就是O(n),这里就需要引入最好时间复杂度最坏时间复杂度

顾名思义,最好时间复杂度就是在最理想的状态下的时间复杂度,就是我们前面说的,所需要找的x恰好是数组的第一个字符,时间复杂度为O(1)

最坏时间复杂度就是在最糟糕的情况下的时间复杂度,就是前面说的需要寻找的x不在数组中的情况,时间复杂度就是O(n)

但是问题又来了,不管是最好还是最坏,它们发生的概率都是非常小的,都不能真正代表它的时间复杂度,这里我们就需要再引入一个概念:平均时间复杂度

还是前面的例子,我们把x在每一个位置上所需要便利的个数都加起来然后再处以总次数n+1来求平均,这样的话我们就能够得到平均时间复杂度了

这里提供一个化简的思路,使用高中所学的倒序相加法来进行化简,在化简得到这个值以后,因为在大O表示法中是可以省略系数、低阶和常量的,所以最后得到的平均时间复杂度为O(n)

虽然这样得到的结论是没有任何问题的,但是在计算的过程中还是有一些出入的,因为这n+1种情况出现的概率是不一样的,所以在每一个数计算的时候还需要乘上相对应的概率才可以,具体的运算情况如下

我们知道,要查找的变量 x,要么在数组里,要么就不在数组里。这两种情况对应的概率统计起来很麻烦,为了方便你理解,我们假设在数组中与不在数组中的概率都为 1/2。另外,要查找的数据出现在 0~n-1 这 n 个位置的概率也是一样的,为 1/n。

所以,根据概率乘法法则,要查找的数据出现在 0~n-1 中任意位置的概率就是 1/(2n)。因此,前面的推导过程中存在的最大问题就是,没有将各种情况发生的概率考虑进去。

如果我们把每种情况发生的概率也考虑进去,那平均时间复杂度的计算过程就变成了这样:

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

引入概率之后,前面那段代码的加权平均值为 (3n+1)/4。用大 O 表示法来表示,去掉系数和常量,这段代码的加权平均时间复杂度仍然是 O(n)。

到这里基本我们常用的时间复杂度就说完了,但是还有一种特殊的平均时间复杂度,那就是均摊时间复杂度

均摊时间复杂度就是把耗时多的平均到耗时少的上面,一般都是不会遇到的,而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度,所以就不再过多的提它了,因为连平均时间复杂度的应用条件都是极其苛刻的,均摊时间复杂度就更是极少会碰到了,明白最好时间复杂度和最坏时间复杂度就可以了。