最好、最壞情況時間複雜度
先看**:
// n表示陣列array的長度
int find(int array, int n, int x)
return pos;
}
在乙個無序的陣列(array)中,查詢 x 出現的位置,沒有找到返回 -1。按照上節課講的分析方法,這段**的複雜度是 o(n),其中,n 代表陣列的長度。但是我們並不需要每次都把整個陣列都遍歷一遍,有可能中途找到就提前結束迴圈了。 優化一下查詢**:
// n表示陣列array的長度
int find(int array, int n, int x)
}return pos;
}
查詢成功之後,就會break出迴圈,那麼時間複雜度顯然就不是o(n)了。如果第乙個元素正好是 x,時間複雜度就是 o(1)。但如果陣列中不存在變數 x,就需要把整個陣列都遍歷一遍,時間複雜度就成了 o(n),不同的情況下,這段**的時間複雜度是不一樣。為表示**在不同情況下的不同時間複雜度,引入三個概念:最好情況時間複雜度、最壞情況時間複雜度和平均情況時間複雜度。
平均時間複雜度
剛才的例子:變數 x 在陣列中的位置,有n+1種情況:在陣列的 0~n-1 位置中或者不在陣列中。把每種情況下,查詢需要遍歷的元素個數累加起來,然後再除以 n+1,就可以得到需要遍歷的元素個數的平均值,即:
1 +2
+3+⋯
+n+n
n+1=
n(n+
3)2(
n+1)
\frac=\frac
n+11+2
+3+⋯
+n+n
=2(
n+1)
n(n+
3)那麼容易得到時間複雜度就是:o(n)。
但是這 n+1 種情況,出現的概率並不是一樣的。假設在陣列中與否的概率都為 1/2,查詢的資料出現在 0~n-1 這 n 個位置的概率一樣,為 1/n。所以,要查詢的資料出現在 0~n-1 中任意位置的概率就是 1/(2n),那麼平均時間複雜度計算如下:
1 ×1
2n+2
×12n
+3×1
2n+⋯
+n×1
2n+n
×12=
3n+1
4\begin \quad 1 \times \frac+2 \times \frac+3 \times \frac+\dots+n \times \frac+n \times \frac \\ =\frac \end
1×2n1
+2×2
n1+
3×2n
1+⋯
+n×2
n1+
n×21
=43
n+1
所以時間複雜度為o(n)。
這個值就是概率論中的加權平均值,也叫期望值,所以平均時間複雜度的全稱應該叫加權平均時間複雜度或者期望時間複雜度。
均攤時間複雜度
對應的分析方法:攤還分析(或者叫平攤分析):
1 ×1
n+1+
1×1n
+1+⋯
+1×1
n+1+
n×1n
+1=o
(1
)1 \times \frac+1 \times \frac+\dots+1 \times \frac+n \times \frac=o(1)
1×n+11
+1×
n+11
+⋯+
1×n+
11+
n×n+
11=
o(1)
課後思考
// 全域性變數,大小為10的陣列array,長度len,下標i。
int array = new int[10];
int len = 10;
int i = 0;
// 往陣列中新增乙個元素
void add(int element)
// new_array複製給array,array現在大小就是2倍len了
array = new_array;
len = 2 * len;
} // 將element放到下標為i的位置,下標i加一
array[i] = element;
++i;
}
分析如下: 資料結構與演算法之美 04 複雜度分析 下
本章講解 最好情況時間複雜度 在最理想情況下執行的時間複雜度 最壞情況時間複雜度 在最壞情況下執行的時間複雜度 平均情況時間複雜度 在所有情況下執行的次數的加權平均值 均攤時間複雜度 在執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,可以將這個高階別 複雜...
資料結構與演算法 複雜度分析
一 什麼是複雜度分析?1.資料結構和演算法解決是 如何讓計算機更快時間 更省空間的解決問題 2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係...
資料結構與演算法(二) 複雜度分析(下)
除了前面記錄的複雜度的基礎知識,還有四個複雜度分析方面的知識點 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度。先看一段 public int find int array,int n,int x return pos 這是在乙個無序的陣列中查詢x的位置,並返回x的下標,...