- 正在学习的算法课程:极客时间的王争老师的《数据结构与算法之美》
- 传送门: https://time.geekbang.org/column/126
- 目前学到第三讲,很良心,共56讲,推荐想学数据结构的同学
2019/09/23
一、时间复杂度分析(二)
四个复杂度分析:
-
最好情况时间复杂度
-
最坏情况时间复杂度
-
平均情况时间复杂度
-
均摊时间复杂度(没懂)
二、最好、最坏情况时间复杂度
-
最好情况时间复杂度:理想情况中,最佳情况下,执行这段代码的时间复杂度
-
最坏情况时间复杂度:理想情况中,最差情况下,执行这段代码的时间复杂度
上代码
// 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;
}
return pos;
}
复杂度:O(n)
优化后的代码:
// 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)
三、平均情况时间复杂度
- 平均时间复杂度:全称加权平均时间复杂度或者期望时间复杂度
上述代码,极端考虑,存在两种情况,查找的数据在数组中和不在数组中。
简化之后,平均时间复杂度为O(n)
四、均摊时间复杂度
上代码,c#,c#不懂,一直用的是python
// 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;
}
最理想情况:O(1)
最差的情况:O(n)
平均复杂度:O(1)
平均复杂度分析
真不会c#,明天问问大佬
五、课后作业
时间复杂度分析
// 全局变量,大小为 10 的数组 array,长度 len,下标 i。
int array[] = new int[10];
int len = 10;
int i = 0;
// 往数组中添加一个元素
void add(int element) {
if (i >= len) { // 数组空间不够了
// 重新申请一个 2 倍大小的数组空间
int new_array[] = new int[len*2];
// 把原来 array 数组中的数据依次 copy 到 new_array
for (int j = 0; j < len; ++j) {
new_array[j] = array[j];
}
// new_array 复制给 array,array 现在大小就是 2 倍 len 了
array = new_array;
len = 2 * len;
}
// 将 element 放到下标为 i 的位置,下标 i 加一
array[i] = element;
++i;
}