1. 程式人生 > >演算法-複雜度分析:如何分析、統計演算法的執行效率和資源消耗?

演算法-複雜度分析:如何分析、統計演算法的執行效率和資源消耗?

整理自極客時間-資料結構與演算法之美。購買地址(有音訊、更完整):

只要講到資料結構與演算法,就一定離不開時間、空間複雜度分析。而且 我個人認為複雜度分析是真個演算法的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半

1.為什麼需要複雜度分析?

你可能會有些疑惑,我把程式碼跑一遍,通過統計、監控,就能得到演算法執行的時間和佔用的記憶體大小。為什麼還要做時間、空間複雜度分析呢?

首先肯定的說,這種評估演算法執行效率的方法是正確的。很多書籍管這種方法叫“事後統計法”。但是這種方法有很大的侷限性:

  1.  測試結果非常依賴測試環境:如測試環境中的硬體對測試j結果影響很大。
  2. 測試結果受資料規模的影響很大。如小規模的資料 插入排序反而比快速排序快。

所以,我們需要一個不用具體資料來測試,就可以粗略的估算執行效率的方法。

2.大O複雜度表示法

演算法的執行效率,粗略的講,就是演算法的執行時間。

例子1:

//這裡有段簡單的程式碼,求1到n的累加和。
int cla(int n){
    int sum = 0;
    int i = 1;
    for (;i<=n; i++){
        sum = sum + 1;
    }
    return sum;
}

現在我們來估算下,上述程式碼的執行時間:

儘管每行程式碼對應cpu執行的個數、執行的時間都不一樣,但是我們這裡只是粗略的估計,所以我們可以假設每行程式碼執行的時間都一樣,都為unit_time

。在這個假設的基礎上,我們進行分析!