如何從最壞 平均 最好的情況分析複雜度?

2021-10-08 09:25:18 字數 1783 閱讀 5875

你好,我是彤哥,乙個每天爬二十六層樓還不忘讀原始碼的硬核男人。

上一節,我們從事後統計法過渡到漸近分析法,詳細講解了如何進行演算法的複雜度分析。

但是,如果遵循嚴格的漸近分析法,需要掌握大量數學知識,這無疑給我們評估演算法的優劣帶來了很大的挑戰。

那麼,有沒有更好地評估演算法的方法呢?

答案是必然的,本節,我們就從最壞、平均、最好三種情況來分析分析複雜度。

為了便於講解,我寫了乙個小例子:

public

class

linearsearch

;int index =

search

(array,10)

; system.out.

println

("index="

+ index);}

private

static

intsearch

(int

array,

int value)

}return-1;}}

這個例子使用線性搜尋從乙個陣列中查詢乙個元素,這個元素有可能存在,也有可能不存在於陣列中。

在最壞情況下,要查詢的元素不存在於陣列中,此時,它的時間複雜度是多少呢?

很簡單,必然需要遍歷完所有元素才會發現要查詢的元素不存在於陣列中。

所以,最壞情況下,使用線性查詢的時間複雜度為o(n)。

在平均情況下,我們要照顧到每乙個元素,此時,它的時間複雜度如何計算呢?

1*1

/(n+1)

+2*/

(n+1)+

...+ n*1/

(n+1)+

(n+1)/

(n+1)=

1/(n+1)*

(n+1

)(n+2)

/2=(n+2)

/2

所以,在平均情況下,忽略掉常數項,使用線性查詢的時間複雜度也是o(n)。

為什麼要忽略掉常數項?

當n趨向於無窮大的時候,常數項的意義不是很大,所以,可以忽略,比如(n+2)/2=n/2 + 1,n本身已經趨向於無窮大,加不加1有什麼意義呢,n的倍數是2還是1/2並不會有明顯的差別。

同樣地,低階項一般也會抹掉,比如2n^2 + 3n + 1,當n趨向於無窮大的時候,n^2的值是遠遠大於3n的,所以,不需要保留3n。

所以,計算複雜度時通常都會把常數項和低階項抹掉,只保留高階項。

最好情況是什麼呢?

如果我們要查詢的元素正好是陣列的第乙個元素,查詢一次就找到了,這無疑是最好的情況。

所以,在最好情況下,使用線性查詢的時間複雜度是o(1)。

通過上面的分析,可以看到,最壞情況和最好情況是比較好評估的,而平均情況則比較難以計算。

但是,最好情況又不能代表大多數樣本,且平均情況與最壞情況在省略常數項的情況下往往是比較接近的。

所以,通常,我們使用最壞情況來評估演算法的時間複雜度,這也是比較簡單的一種評估方法,且往往也是比較準確的。

本節,我們從最壞、平均、最好三種情況分析了線性查詢的時間複雜度,經過詳細地分析,我們得出結論,通常使用最壞情況來評估演算法的時間複雜度。

請注意,我們這裡使用了「通常」,說明有些情況是不能使用最壞情況來評估演算法的時間複雜度的。

那麼,你知道什麼情況下不能使用最壞情況來評估演算法的時間複雜度嗎?

下一節,我們接著聊。

最好,最壞,平均時間複雜度分析

例子1public static intfind int array,int n,int x return pos 分析例子1的時間複雜度 例1的主要實現在for迴圈中的array i 上。他的時間複雜度就是來自for迴圈 所以他的時間複雜度就是o n n就是陣列的長度。但是經常有時是,不需要將所有...

快速排序最好,最壞,平均複雜度分析

我們來分析一下快速排序法的效能。快速排序的時間效能取決於快速排序遞迴的深度,可以用遞迴樹來描述遞迴演算法的執 況。如圖9 9 7所示,它是在快速排序過程中的遞迴過程。由於我們的第乙個關鍵字是50,正好是待排序的序列的中間值,因此遞迴樹是平衡的,此時效能也比較好。圖9 9 7 在最優情況下,parti...

演算法複雜度分析 最好 最壞 平均 均攤

public int function int n,int x return sum 1.最壞時間複雜度當x n時,時間複雜度為o n 2.最壞時間複雜度 當x 1時,時間複雜度為o 1 3.平均時間複雜度 要查詢的變數 x 在陣列中的位置,有 n 1 種情況 在陣列的 0 n 1 位置中和不在陣列...