這一篇筆記主要記錄總結了什麼是算法複雜度?、爲什要作算法複雜度分析?、如何作算法複雜度分析?、經常使用的複雜度級別?以及如何掌握複雜度分析?等問題。算法
數據結構與算法
解決的是如何更省、更快的存儲和處理數據
的問題。所以就須要一個考量效率和資源消耗
的方法,這就是複雜度分析方法。數組
複雜度也叫漸進複雜度
,其中包含時間複雜度
和空間複雜度
兩個維度,是用來分析算法執行時間(或者佔用空間)
與數據規模的增加
關係,能夠粗略的表示,越高階複雜度的算法,執行效率越低。數據結構
統計、監控等過後統計法
的侷限性:性能
所以須要一個不用具體的測試數據
就能夠粗略地估計算法的執行效率
的方法。複雜度分析
不依賴執行環境、成本低、可操做性強。學習
掌握複雜度分析
,將能寫出性能更優的代碼。測試
大 O 時間複雜度
實際上並不具體表明代碼真正的執行時間,而是表示代碼執行時間隨數據規模增加
的變化趨勢
,叫作漸進時間複雜度
,簡稱時間複雜度
。類比時間複雜度,空間複雜度全稱就是漸進空間複雜度
,表示算法的存儲空間
與數據規模之間
的增加關係
。ui
常見的空間複雜度是:O(1)、O(n)、O(n^2)spa
對有些代碼,其複雜度有不是固定的,有最好、最壞的狀況。如數組元素查找,有可能第一次就找到,這個時候算法時間複雜度是常數階O(1),也有可能須要整個遍歷一遍數組才能找到,這個時候是最壞的時間複雜度O(n)。code
因爲最好和最壞狀況複雜度對應的都是極端狀況下的代碼複雜度,發生的機率並不大,因此須要引入平均狀況複雜度
來更好的表示算法的時間複雜度。cdn
平均狀況複雜度
是將各類狀況下時間複雜度發生的機率考慮進去,而後計算總體時間複雜度的指望值,因此平均狀況複雜度
也叫作加權平均時間複雜度
或者指望時間複雜度
。
不少時候,只要使用一個複雜度就能夠知足需求了。只有同一塊代碼在不一樣狀況下,時間複雜度有量級的差距
,纔會使用這三種複雜度表示法來區分。
**適用場景:**對一個數據結構進行一組連續操做中,大部分狀況下時間複雜度都很低,只有個別狀況下時間複雜度比較高,並且這些操做之間存在先後連貫的時序關係
,這個狀況下,就能夠將這一組操做放在一塊兒分析,看可否將較高時間複雜度的那次操做平攤
到其餘那些時間複雜度較低的操做上。通常在可以應用均攤時間複雜度
的場景,均攤時間複雜度
就等於最好狀況時間複雜度
。
分析方法:攤還分析
。
非多項式量級
多項式量級
兩個數據的規模
來決定。多項式量級算法時間複雜度隨數據規模的增加變化趨勢曲線
多練習。
**解答:**不是畫蛇添足,漸進時間,空間複雜度分析爲咱們提供了一個很好的理論分析的方向,成本低,可操做性強,不用具體的測試數據就能夠粗略地估計算法的執行效率,有助於寫出性能高效的代碼,同時培養起算法複雜度分析的思惟,能夠和性能測試相輔相成。
// 全局變量,大小爲 10 的數組 array,長度 len,下標 i。
int array[] = new int[10];
int len = 10;
int i = 0;
// 往數組中添加一個元素
void add(int element) {
if (i >= len) { // 數組空間不夠了
// 從新申請一個 2 倍大小的數組空間
int new_array[] = new int[len*2];
// 把原來 array 數組中的數據依次 copy 到 new_array
for (int j = 0; j < len; ++j) {
new_array[j] = array[j];
}
// new_array 複製給 array,array 如今大小就是 2 倍 len 了
array = new_array;
len = 2 * len;
}
// 將 element 放到下標爲 i 的位置,下標 i 加一
array[i] = element;
++i;
}
複製代碼
解答:
分享我的技術學習記錄和跑步馬拉松訓練比賽、讀書筆記等內容,感興趣的朋友能夠關注個人公衆號「青爭哥哥」。