挑戰408——數據結構(4)——Big-O表示法(2)

最壞情況與平均複雜度

上篇討論的都是算法的運行時間直接取決於問題規模的大小N,但是在某些情況下,算法的運行時間不僅取決於問題的大小,還取決於代碼的特定特性,看下面一段代碼:

int linearSearch(int key, Vector<int> & vec) {
    int n = vec.size();
    for (int i = 0; i < n; i++) {
    if (key == vec[i]) return i;
    }
    return -1;
}

其作用是在一個vector中,查找某個數值。它返回出現key的vec中的第一個下標位置,如果key不顯示在向量中的任何位置,則返回-1。因爲實現中的for循環執行了n次,所以你可能第一時間想到的LinearSearch的性能,就是O(N)。但是換個角度想,對linearSearch的調用有時候可以非常快地執行。例如,假設正在搜索的key元素恰好位於向量中的第一個位置。在這種情況下,for循環的其實只運行一次。如果你足夠幸運地搜索始終位於向量開始處的值,linearSearch將始終在確定的時間內完成。 反之,當key不在vector中時,當然會發生linearSearch函數的最壞情況。因爲當key不存在時,該函數必須完成for循環的所有n個循環,這意味着其性能是O(N)((因爲O(n/2)忽略常數也是O(n)))。
當分析程序的計算複雜性時,我們通常對最小可能的時間不感興趣。一般來說,我們往往會關注以下兩種複雜性分析:

  1. 最壞情況下的複雜度。(Worst-case complexity.) 最常見的複雜性分析類型包括在最壞的情況下確定算法的性能。它允許你設置計算複雜度的上限。如果我們分析最壞的情況,那麼之事可以保證算法的性能至少與你的分析表明一樣好。因爲沒有什麼情況比這個更糟糕了。
  2. 平均情況下的複雜度。(Average-case complexity) 從實際的角度來看,如果你在所有可能的輸入數據集中平均計算其行爲,那麼考慮算法的平均執行情況通常是有用的。特別是當你沒有辦法確定你的問題的具體輸入是非典型的輸入,平均案例分析可提供實際績效的最佳統計估計。

我們稍後介紹的“Quicksort算法”中,算法的平均情況和最差情況下的性能有時會以定性的方式存在差異,這意味着在實踐中,要綜合考慮到這兩個情況。

Big-O的公式化定義(題外話,考研不考)

因爲理解大O符號對現代計算機科學至關重要,因此提供更正式的定義以幫助我們瞭解大O的直觀模型的原理以及爲什麼建議的大O公式的簡化。在數學中,大O表示法用於表達兩個函數之間的關係,在這樣的表達式中:
在這裏插入圖片描述
該表達式的形式意義在於,f(N)是具有以下特徵的t(N)的近似值:存在常數N0和正常數C,使得對於N≤N0的每個值, 以下條件成立:
在這裏插入圖片描述
換句話說,只要N“足夠大”,函數t(N)總是被函數ƒ(N)的常數倍數界定。
當用於表達計算複雜度時,函數t(N)表示算法的實際運行時間,這通常很難計算。函數ƒ(N)是一個簡單得多的公式,儘管如此,對於運行時間如何作爲N的函數而言,提供了合理的定性估計,因爲在大O的數學定義中表達的條件確保實際的運行時間不能增長比ƒ(N)快。 (即不會比Fn更大)、
讓我們返回到選擇排序示例。分析選擇排序的循環結構表明,執行了最內循環中的操作,執行次數爲
在這裏插入圖片描述
並且運行時間與這個公式成正比。當這種複雜性用大O表示法表示時,常數和低階項被消除,只留下執行時間爲O(N^2)的斷言,這實際上是斷言:
在這裏插入圖片描述
爲了表明這個表達式在大O的正式定義下確實是真的,所有你需要做的是找到常量C和N0,使得:
在這裏插入圖片描述
對於N≥N0的所有值。這個特殊的例子非常簡單。將常數C和N0都設置爲1. 畢竟,只要N不小於1,就有(N^2)≥N。因此,放縮一下就變成這樣:
在這裏插入圖片描述
所以,對於任意的N >= 1,都滿足要求。

更一般的證明

可以使用類似的參數來表示任何k階多項式,可以用一般式子來表示:
在這裏插入圖片描述
其big-O爲 在這裏插入圖片描述
爲了證明這個結論,我們的目標是尋找常數C和N0使得 對於任意的 N >= N0:
在這裏插入圖片描述
都成立。如前面的例子所示,首先使N0爲1.對於N≥1的所有值,N的每個連續階數至少與其前身一樣大,因此
在這裏插入圖片描述
再次進行放縮(放大):
在這裏插入圖片描述
將右邊的公因子提出來:
在這裏插入圖片描述
顯然,左邊的一堆絕對值相加是一個常數,用C來替換這個常數,有:
在這裏插入圖片描述
於是證明了上述整個多項式的算法複雜度就是在這裏插入圖片描述
如果這些繁重的數學式子嚇到了你,不用擔心,不懂無所謂,更重要的是明白Big-O的含義,而非它的公式化過程,反正考研不考哈哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章