算法複雜度分析

        數據結構和算法的終極目標是“快”和“省”,衡量代碼的執行效率,最直接的方法就是把代碼跑一遍,通過統計、監控就能得到算法的執行時間和佔用內存的情況。但是這樣做的問題是測試結果非常依賴測試環境以及測試結果受規模的影響很大。同樣的代碼,在i3和i7上跑,執行的時間明顯不一樣。即使在同一臺機器上跑,同樣的代碼得出的統計、監控結果也可能不一樣,而且,當有多種算法可供選擇時,總不能把每種算法都跑一遍,選擇最優算法吧?

        藉助算法分析,就可以不用跑代碼,實現粗略估計代碼執行效率的目標。

        一、時間複雜度

        時間複雜度用來分析代碼的執行時間,用大O表示

private function cal(n:int):int{
    var sum:int = 0;
    var i:int = 1;
    for(;i<=n;++i){
        sum = sum + i;
    }
    return sum;
}

這段代碼每一行都在執行讀數據-運算-寫數據的類似操作,用來粗略估計時,可視爲每行代碼的執行時間爲單位時間。

for循環執行++i和sum = sum+i;,所以每執行一次for循環,消耗2個單位時間。再加上進入for循環之前消耗的2個單位時間,故這段代碼消耗的時間可以粗略視爲2n+2個單位時間

用大O時間複雜度表示法可以寫成T(n) = O(2n+2),表示的並不是代碼的真正執行時間,表示的是代碼執行時間隨數據規模增長的變化趨勢,也叫漸近時間複雜度,簡稱時間複雜度。當n很大時,前面的係數可以忽略,所以可以記爲T(n) = O(n);

幾種常見的時間複雜度

O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(n^3)<O(n^k)<O(2^n)<O(n!)

當代碼的複雜度由兩個數據規模決定,而這兩個數據規模的大小又不能確定時,例如O(m)、O(n),不能確定m、n的大小關係,

這是時間複雜度的寫法爲T(n) = O(m+n)

時間複雜度分析分爲

最好情況時間複雜度:在理想情況下,執行這段代碼的時間複雜度

最壞情況時間複雜度:在最糟糕的情況下,執行這段代碼的時間複雜度

平均情況時間複雜度:加權平均時間複雜度、期望時間複雜度

均攤時間複雜度:一種特殊的平均時間複雜度

 

        二、空間複雜度

        空間複雜度表示算法的存儲空間與數據規模之間的增長關係,全稱漸近空間複雜度,簡稱空間複雜度。

常見的空間複雜度O(1)、O(n)、O(n^2),對於O(log n)、O(n log n)對數階空間複雜度,很少遇到

雖然代碼中已經進行了複雜度分析,但是測試時仍然需要進行性能測試,因爲複雜度分析只是提供了一個理論分析,與平臺無關,通過性能測試可以幫助選擇特定場景下的最優算法。

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