通过上一篇的了解,我们可以用时间复杂度和空间复杂度来判断算法的快慢和占用内存大小,从而判断算法的好坏.
应用时间复杂度时发现的问题
不过在不同的情况下,同一算法在不同情况下,时间复杂度不一样.举个例子,从数组中找一个变量x,如果数组中第一个元素正好是要查找的变量 x,那就不需要继续遍历剩余n-1个数据,这个时候时间复杂度就是O(1);
如果数组中不存在该元素,那就要把整个数组遍历一遍,时间复杂度就是O(n).
所以为了表示不同情况下的时间复杂度,把时间复杂度又分了四种类型:
最好时间复杂度,最坏时间复杂度,平均时间复杂度,均摊时间复杂度.
最好时间复杂度
即最理想情况执行代码的时间复杂度,
如上个例子中的第一种情况:
数组中第一个元素正好是要查找的变量 x,那就不需要继续遍历剩余n-1个数据,这个时候时间复杂度就是O(1).
最坏时间复杂度
即最糟糕情况执行代码的时间复杂度,
如上个例子中的第二种情况:
数组中不存在该元素,那就要把整个数组遍历一遍,时间复杂度就是O(n).
平均时间复杂度
以上两种情况都太极端了,发生概率比较小,为了表示平均情况的复杂度,引入平均时间复杂度.
时间复杂度是怎么计算的?
1)先考虑有哪些情况,有一次就找到的,有两次找到的,有n次找到的,还有n次没找到的;
总共n+1种情况:在数组的 0~n-1 位置中和不在数组中.
2)考虑每种情况出现的概率,
3)每种情况花费的次数 * 每种情况出现的概率 /总次数.
均摊时间复杂度
这是一种特殊的平均时间复杂度,它的出现需要满足两个条件:
1)当一个算法在大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,
2)这些操作之间存在前后连贯的时序关系.
这个时候我们可以考虑是否可以将较高时间复杂度那次操作的耗时均摊到较低的操作上.这样一来,平均的时间复杂度就往往等于最好时间复杂度.