- 正在學習的算法課程:極客時間的王爭老師的《數據結構與算法之美》
- 傳送門: 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;
}