1. 程式人生 > 其它 >資料結構與演算法---最好和最壞情況時間複雜度分析

資料結構與演算法---最好和最壞情況時間複雜度分析

技術標籤:資料結構與演算法資料結構演算法

最好和最壞情況時間複雜度(best case time complexity)

案例程式碼如下:

// 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;
}

上面程式碼非常的簡單 ,在無序的數組裡,找變數x出現的位置。沒找到就返回-1。這段程式碼的時間複雜度是O(n),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(n)了,以簡單的複雜度分析的方法並解決不了這一問題了。

因為需要查詢的x的位置充滿了不確定性,既有可能在第一個,也有可能在最後一個。所以我們就需要引入三個概念:最好時間複雜度,最壞時間複雜度和平均時間複雜度。

最好時間複雜度和最壞時間複雜度都很好理解,該段程式碼的最壞時間複雜度便是O(n),最好時間複雜度是O(1)。因為最好情況x在第一個就找到了,最壞情況會找不到或者在最後一位。

稍微需要花點腦子的就是平均時間複雜度分析,我們依舊拿著查詢變數x的例子來解釋。

// 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;
}

要查詢x在陣列中的位置有n+1種情況(在陣列0~n-1位置或不在陣列中),俺們將每種情況下,查詢需要遍歷的資料個數累加,除n+1,就可以得到需要遍歷的資料個數的平均值。

圖片出於極客網

我們在大O標記法中,可以省去係數,低階,常量, 所以,俺們可以講上面的公式簡化,便是O(n)。

雖然這個結論是對的,在n+1種情況內每種情況出現的概率並不是一樣的。

我們知道,x要麼在陣列,要麼就不在陣列。在陣列與不在陣列的概率為1/2。另外,我們需要查詢的資料x出現在0~ n-1,其概率也是一樣的為1/n。根據概率乘法法則,要查詢的資料x出現在0~n-1中任意位置的概率為1/(2n)。

按照這樣的方法計算的平均時間複雜度就變成了:

在這裡插入圖片描述
該值是概率論的加權平均值,就是期望值,所以平均時間複雜度的全稱就是加權平均時間複雜度或者期望時間複雜度。

引入概率後代碼的加權平均值為(3n+1)/4。用大O表示法來表示還是O(n)。