在上一篇文章中咱们提到了时间复杂度大O分析法的使用,此次继续来探究时间复杂度的分析数组
咱们先来看一下下面这段代码学习
这段代码的做用是在数组中寻找x的位置,找到了直接返回位置,没有找到的话返回-1,用上一篇文章所学到的知识,能够很清楚的看出来,这段代码的时间复杂度为O(n)优化
可是这段代码明显还有优化的空间,若是咱们在数组中间寻找到x的话,就不须要把整个数组都循环一边了,因此能够优化为下面这段代码。blog
若是在这种状况下的话,就不能用上一次所说到的方法来衡量了,由于咱们不知道须要寻找的x所在的位置在哪里,若是在第一个的话,它的时间复杂度就是O(1),若是这个数组里没有的话,就须要所有遍历一遍,它的时间复杂度就是O(n),这里就须要引入最好时间复杂度和最坏时间复杂度get
顾名思义,最好时间复杂度就是在最理想的状态下的时间复杂度,就是咱们前面说的,所须要找的x刚好是数组的第一个字符,时间复杂度为O(1)博客
最坏时间复杂度就是在最糟糕的状况下的时间复杂度,就是前面说的须要寻找的x不在数组中的状况,时间复杂度就是O(n)变量
可是问题又来了,不论是最好仍是最坏,它们发生的几率都是很是小的,都不能真正表明它的时间复杂度,这里咱们就须要再引入一个概念:平均时间复杂度cli
仍是前面的例子,咱们把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)。
到这里基本咱们经常使用的时间复杂度就说完了,可是还有一种特殊的平均时间复杂度,那就是均摊时间复杂度
均摊时间复杂度就是把耗时多的平均到耗时少的上面,通常都是不会遇到的,并且,在可以应用均摊时间复杂度分析的场合,通常均摊时间复杂度就等于最好状况时间复杂度,因此就再也不过多的提它了,由于连平均时间复杂度的应用条件都是极其苛刻的,均摊时间复杂度就更是极少会碰到了,明白最好时间复杂度和最坏时间复杂度就能够了。
文章首发公众号和我的博客:
公众号:无意的梦呓(wuxinmengyi)
这是一个记录红队学习、信安笔记,我的成长的公众号
扫码关注便可
记录红队相关学习笔记