1. 程式人生 > >演算法筆記-複雜度分析2

演算法筆記-複雜度分析2

時間複雜度四個概念

本文創作靈感來源於 極客時間 王爭老師的《資料結構與演算法之美》課程,通過課後反思以及借鑑各位學友的發言總結,現整理出自己的知識架構,以便日後溫故知新,查漏補缺。

是什麼

什麼是時間複雜度四個概念
  • 最好情況時間複雜度:在最理想的情況上,執行這段程式碼的時間複雜度。
  • 最壞情況時間複雜度:在最糟糕的情況上,執行這段程式碼的時間複雜度。
  • 平均情況時間複雜度:用程式碼在所有情況下執行的次數的加權平均值表示。
  • 均攤時間複雜度:在程式碼執行的所有複雜度情況中絕大部分是低級別的複雜度,個別情況是高級別複雜度且發生具有時序關係時,可以將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
  • 為什麼

為什麼要有時間複雜度四個概念
  • 演算法是我們來解決某一類問題得出應有結果的有限步驟,但是在實際運用中,很有可能在演算法進行到某一個點的時候,就已經得到我們最終想要的結果了。所以,在分析出時間複雜度之後,演算法有可能在執行之初或者是執行結束,或者是執行的任一時刻就得出結果,停止執行。
  • 同一段程式碼在不同情況下時間複雜度的具體值可能會出現量級差異,為了更全面,更準確的描述程式碼的時間複雜度,所以引入這4個概念。
  • 程式碼複雜度在不同情況下出現量級差別時就需要區別這四種複雜度,以便更加全面準確的分析時間複雜度。

怎麼辦

怎麼分析程式碼的這四種時間複雜度
    public int getIndex(int[] list,int val){
        int index = 0;
        for(int i = 0; i < list.length; i++){
            if(val == list[i]){
                index = i;
                break;
            }
        }
        return index;
    }

上述程式碼中,陣列 list ,以及某一個特定的值 val ,getIndex 方法負責找出陣列 list 中 val 值得陣列下標。

最好情況時間複雜度
  • 在 getIndex 方法中,假設 val = 5,我們查詢陣列 list 中值等於 5 的陣列下標。那麼,程式碼執行最少時間的情況就是陣列 list 中的第一個元素的值就等於 5 ,則程式碼 for 迴圈只執行一次,最好情況時間複雜度為 O ( 1 ) O(1)
最壞情況時間複雜度
  • 在 getIndex 方法中,假設 val = 10,我們查詢陣列 list 中值等於 10 的陣列下標。那麼,程式碼執行最少時間的情況就是陣列 list 中的最後一個元素的值就等於 10 ,則程式碼 for 迴圈執行了 n (n代表陣列list的長度) 次,最好情況時間複雜度為 O ( n ) O(n)
平均情況時間複雜度
  • 平均情況時間複雜度的分析要充分考慮到每一種情況出現的概率,此處分為兩個步驟
  • 第一步:在 getIndex 方法中,假設 val = 7,我們查詢陣列 list 中值等於 7 的陣列下標。但是,陣列中是否有值等於 7 的元素存在兩種情況,有或者無,我們就是理論上假設每種情況出現的概率都是 1 2 \dfrac{1}{2}
  • 第二步:假設陣列 list 中存在值等於 7 的元素,那麼元素出現在每個位置上的概率就是 1 n \dfrac{1}{n} (n代表陣列list的長度)最終 7 出現在陣列中任意位置的概率為 1 2 n \dfrac{1}{2n}
  • 那麼,平均時間複雜度就是每種情況的時間複雜度之和的平均值。每種情況的概率就是 1 1 2 n + 2 1 2 n + 3 1 2 n + + n 1 2 n = n + 1 4 1 * \dfrac{1}{2n} + 2 * \dfrac{1}{2n} + 3 * \dfrac{1}{2n} + 。。。 + n * \dfrac{1}{2n} = \dfrac{n+1}{4} 去掉多項式的係數和常熟則時間複雜度為 O ( n ) O(n)
均攤時間複雜度
  • 從概念上理解,在程式碼執行過程中,每種情況出現的概率並不是相等的。又或者是大部分情況是每種情況出現的概率是相等的,此時演算法時間複雜度為 O ( 1 ) O(1) ,只有個別情況程式碼的時間複雜度 O ( n ) O(n) ,此時我們需要將時間複雜度高的耗時操作均分到時間複雜度低的操作中。
  • 王爭老師講解中曾提到,均攤時間複雜度是一種特殊的平均情況時間複雜度,一般的均攤時間複雜度就等於最好最好情況時間複雜度。由於這種情況實際運用中很少見,所以我們只需要瞭解大意,不求甚解即可。我們應該掌握的是這種分析方法:攤還分析法。

總結

初入演算法複雜度分析,必是步履蹣跚,一路磕磕絆絆跌跌撞撞。看不懂別慌,也別忙著總結,先讀五遍文章先,無他,唯手熟爾~
與諸君共勉