ps: 极客时间,数据结构与算法之美的个人总结
1.概念
- 最好时间复杂度:在最理想的情况下,执行代码的时间复杂度。
- 最坏时间复杂度:在最糟糕的情况下,执行代码的时间复杂度。
- 平均时间复杂度:加权平均值,期望值
- 均摊时间复杂度:在⼀组连续操作中,⼤部分情况下时间复杂度低,个别情况下⽐较⾼,⽽且存在时序关系,可将较⾼时间复杂度那次操作的耗时,平摊到其他那些时间复杂度⽐较低的操作上。
2. 案例
// n表示数组array的长度
int find(int[] array, int n, int x) {
int i = 0;
int pos = -1;
for (; i < n; ++i) {
if (array[i] == x) {
pos = i;
break;
}
}
return pos;
}
这段代码:最好情况是第一个就找到,复杂度为O(1),最差是全部遍历一遍,复杂度为O(n)。
那平均复杂度多少呢?
要查找的变量x在数组中的位置,有n+1种情况:在数组的0~n-1位置中和不在数组中。
得到的平均复杂度:省略掉系数、低阶、常量O(n).
均摊复杂度又是怎么回事?
// array表示一个长度为n的数组
// 代码中的array.length就等于n
int[] array = new int[n];
int count = 0;
void insert(int val) {
if (count == array.length) {
int sum = 0;
for (int i = 0; i < array.length; ++i) {
sum = sum + array[i];
}
array[0] = sum;
count = 1;
}
array[count] = val;
++count;
}
代码很容易懂: 当数组满了后,执行一次累加放到索引0位置。
最好复杂度是O(1), 最差是O(n).
平均复杂度:O(1)
均摊时间复杂度
每一次O(n)的插入操作,都会跟着n-1次O(1)的插入操作.所以把耗时多的那次操作均摊到接下来的n-1次耗时少的操作上,均摊下来,这一组连续的操作的均摊时间复杂度就是O(1)。
3. 为什么引入
只有同⼀块代码在不同的情况下,时间复杂度有量级的差距。