時間複雜度
爲什麼需要複雜度分析
直接跑代碼通過統計、監控獲取算法的執行時間和佔用的內存大小的性能測試,叫事後統計法。
侷限性:
1、測試結果非常依賴測試環境;如,不同處理器效率不同
2、測試結果受數據規模影響很大;測試數據規模太小,測試結果可能無法反應算法的性能
複雜度分析有不依賴環境、成本低、效率高、易操作、指導性強等特點
概念
大O時間複雜度表示法,表示代碼執行時間隨數據規模增長的變化趨勢,也叫漸進式時間複雜度
複雜度描述的是算法執行時間與數據規模的增長關係
複雜度量級,從小到大排序:常數階O(1)->對數階O(logn)->線性階O(n)->線性對數階O(nlogn)->平方階O(n^2)->立方階O(n^3)->k次方階O(n^k)->非多項式量級(指數階O(2^n),階乘階O(n!))
分析法則
由於時間複雜度描述的是算法執行時間與數據規模的增長變化趨勢,所以常數階、低階和係數實際上對這種增長不產生決定性影響,所以在做時間複雜度分析是忽略這些項。
複雜度分析法則
(1)單段代碼看高頻:比如循環
(2)多段代碼取最大:比如一段代碼有單循環和多重循環,那麼取多重循環的複雜度
(3)嵌套代碼求乘積:比如遞歸、多重循環等
(4)多個規模求加分:比如方法有兩個參數控制兩個循環次數,無法事先評估m和n誰的量級大取兩則相加