-
最好、最坏、平均复杂度分析
这段代码要实现的功能是,在一个无序的数组(array)中,查找变量x 出现的位置。如果没有找到,就返回 -1。这段代码的复杂度是 O(n)。
我们在数组中查找一个数据,并不需要每次都把整个数组都遍历一遍,优化后的代码如下:
如果数组中第一个元素正好是要查找的变量 x,那就不需要继续遍历剩下的 n-1 个数据了,那时间复杂度就是O(1),最好情况时间复杂度就是O(1)。但如果数组中不存在变量 x,那我们就需要把整个数组都遍历一遍,时间复杂度就成了 O(n),最坏情况时间复杂度就是O(n)。
我们假设在数组中与不在数组中的概率都为 1/2。另外,要查找的数据出现在 0~n-1 这 n 个位置的概率也是一样的,为 1/n。所以,根据概率乘法法则,要查找的数据出现在 0~n-1 中任意位置的概率就是 1/(2n)。
去掉系数和常量,这段代码的平均时间复杂度仍然是 O(n)。
-
均摊时间复杂度
当数组没满时,插入操作很快,只需要执行1次赋值操作即可,时间复杂度为O(1)。当数组已满,需要扩容为原来的两倍,然后将元素数组中的值拷贝到新数组中,假如原数组长度为n,则需要进行n此操作,时间复杂度退化为O(n)。每当经历n次时间复杂度为O(1)的操作时,便经历1次时间复杂度为O(n)的操作, 整个插入操作的均摊时间复杂度就变为O(1)了。这就是摊还分析的大致思想。