爲什麼需要複雜度分析?
把代碼跑一遍,通過統計,監控得到算法執行時間和佔用內存大小的方法叫做事後統計法,這種方法有以下侷限性
-
測試結果非常依賴測試環境
同一段代碼拿到不同機子上測試會有不同的結果 -
測試結果受數據規模的影響很大
-
掌握複雜度分析,將能編寫出性能更優的代碼,有利於降低系統開發和維護成本。
綜上,我們需要一個不用具體的測試數據來測試,就可以粗略地估計算法的執行效率的方法。所以就有了時間,空間複雜度分析方法
如何進行複雜度分析
大O複雜度表示法
時間複雜度(表示執行的快慢):
大O時間複雜度實際上並不具體表示真正的執行時間,而是表示代碼執行時間隨數據規模增長的變化趨勢,也叫做漸進時間複雜度
T(n)=O(f(n))代碼的執行時間跟每行代碼執行次數的總和成正比
T(n)表示代碼執行的時間,n表示數據規模的大小,f(n)表示每行代碼執行的次數總和,因爲這是一個公式,所以用f(n)來表示。公式中的O表示代碼的執行時間T(n)與f(n)表達式成正比。
當n很大時,你可以把它想象成10000,100000。大O這種複雜度表示方法只是表示一種變化趨勢,而公式中的低價,常量,係數三部分並不左右增長趨勢,所以都可以忽略。
評論一個算法好壞的時候 我們應該先看指標T(n) 如果兩個算法的指標一樣的或者判斷不出哪個指標高或者低 這個時候再去判斷係數
分析法則:
-
只關注循環執行次數最多的一段代碼
-
加法法則:總複雜度等於量級最大的那段代碼的複雜度
注意:只要是常量級的執行時間,不管這個常量是10000,100000 都可以忽略掉,時間複雜度表示的是一個算法的執行效率與數據規模增長的變化趨勢,常量可以忽略掉的原因是它對增長趨勢並沒有影響
T1(n)=O(f(n)), T2(n)=O(g(n)),那麼T(n)=T1(n)+T2(n)=max(O(f(n)),O(g(n)))=O(max(f(n),g(n))). -
乘法法則:嵌套代碼的複雜度等於嵌套內外代碼複雜度的乘積,我們可以把乘法法則看成是嵌套循環
T1(n)=O(f(n)), T2(n)=O(g(n)),那麼T(n)=T1(n)*T2(n)=O(f(n))*O(g(n)) =O(f(n)*g(n)).
4.多個規模求加法:比如方法有兩個參數控制兩個循環的次數,那麼這時就取二者複雜度相加
當數據規模無法評估哪個量級較大時,加法法則失效,可以使用O(m+n)
常用的複雜度級別:
非多項式量級:
隨着數據規模的增長,算法的執行時間和空間佔用暴增,這類算法性能極差
O(2n)和O(n!)
多項式量級:
隨着數據規模的增長,算法的執行時間和空間佔用,按照多項式的比例增長。
- O(1)常量級時間複雜度
這裏並不是說O(1)只執行了一行代碼
O(1)表示只要代碼的執行時間不隨n的增大而增大,這樣代碼的時間複雜度我們都計作O(1)。一般情況下,只要算法中不存在循環語句,遞歸語句,即使有成千上萬的代碼,其時間複雜度也是O(1)
2.O(logn),O(nlogn)
不管對數階的底爲多少,時間複雜度都爲O(logn)。比如:log3n就等於log3nlog2n(換底公式),所以O(log3n)=O(Clog2n),其中C=log32是一個常量,我們知道,在採用大O標記複雜度的時候,可以忽略係數,即O(Cf(n))=O(f(n)).所以,O(log2n)就等於O(log3n)。因此,在對數階時間複雜度的表示方法裏,我們忽略對數的”底”,統一表示爲O(logn)
O(nlogn)就是來自乘法法則。
3.O(m+n),O(m*n)
空間複雜度分析(表示內存的消耗):
表示算法的存儲空間與數據規模之間的增長關係,也稱爲漸進空間複雜度
我們說空間複雜度的時候,是指除了原本的數據存儲空間外,算法運行還需要額外的存儲空間。
複雜度分析的4個概念
- 最好情況時間複雜度:
代碼在最理想情況下執行的時間複雜度。 - 最壞情況時間複雜度:
代碼在最壞情況下執行的時間複雜度。 - 平均情況時間複雜度(加權平均時間複雜度或者期望時間複雜度):
用代碼在所有情況下執行的次數的加權平均值表示。 - 均攤時間複雜度:
在代碼執行的所有複雜度情況中絕大部分是低級別的複雜度,個別情況是高級別複雜度且發生具有時序關係時,使用攤還分析(平攤分析)方法,可以將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
二、爲什麼要引入這4個概念?
1.同一段代碼在不同情況下時間複雜度會出現量級差異,爲了更全面,更準確的描述代碼的時間複雜度,所以引入這4個概念。
2.代碼複雜度在不同情況下出現量級差別時才需要區別這四種複雜度。大多數情況下,是不需要區別分析它們的。
三、如何分析平均、均攤時間複雜度?
1.平均時間複雜度
代碼在不同情況下複雜度出現量級差別,則用代碼所有可能情況下執行次數的加權平均值表示。
2.均攤時間複雜度
兩個條件滿足時使用:1)代碼在絕大多數情況下是低級別複雜度,只有極少數情況是高級別複雜度;2)低級別和高級別複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。
總結:其實平均和平攤基本就是一個概念,平攤是特殊的平均