數據結構和算法解決的是「快」和「省」的問題,即如何讓代碼運行的更快,如何讓代碼更省存儲空間。對應的,執行效率就是考量算法的一個很是重要的指標。咱們可使用時間複雜度分析和空間複雜度分析來考量算法的執行效率。算法
把一段代碼跑一遍,經過統計、監控就能獲得算法執行的時間和佔用的內存大小,這種分析方法叫作過後統計法。數據結構
過後統計法的侷限性:數據結構和算法
1.測試結果很是依賴測試環境post
2.測試結果受數據規模的影響很大測試
因爲過後統計法的侷限性,須要一個不用具體數據來測試,就能夠粗略地估計算法的執行效率的方法,那就是時間、空間複雜度分析方法。內存
全部代碼的執行時間T(N)與每行代碼的執行次數n成正比=>T(n)=O(f(n))get
T(n)表示代碼執行的時間;n表示數據規模的大小;f(n)表示每行代碼執行的次數總和。由於是一個公式,因此用f(n)表示;公式中的O表示代碼的執行時間T(n)與f(n)表達式成正比。效率
大O時間複雜度表示法並不具體表示代碼真正的執行時間,而是表示代碼執行時間隨數據規模增加的變化趨勢,所以也叫做漸進時間複雜度,簡稱時間複雜度。監控
當n很大時,公式中的低階、常量、係數三部分並不左右增加趨勢,因此均可以忽略,只須要記錄一個最大量級就能夠了。循環
如何分析一段代碼的時間複雜度?下述有三個比較實用的方法。
一、只關注循環最多的一段代碼
正如大O複雜度表示方法只是表示一種變化趨勢,咱們一般會忽略掉公式中的常量、低階、係數,只須要記錄一個最大階的量級就能夠了。因此在分析一個算法、一段時間複雜度的時候,也只關注循環次數最多的那一段代碼就能夠了。
2.加法法則:總複雜度等於量級最大的那段代碼的複雜度
3.乘法法則:嵌套代碼的總複雜度等於嵌套內外代碼複雜度的乘積
複雜度量級(按數量級遞增)
1. 常數階 O(1)
2. 對數階 O(logn)
3. 線性階 O(n)
4. 線性對數階 O(nlogn)
5. 平方階 O(n2)、立方階 O(n3)...k次方階 O(nk)
6. 指數階 O(2n)
7.階乘階 O(n!)
上述量級粗略可非爲兩類 多項式量級和非多項式量級
其中 非多項式量級只有兩個 指數階O(2n)和階乘階O(n!)
當數據規模n愈來愈大時,非多項式量級的執行時間會急劇增長,求解問題的執行時間會無限增加,所以,非多項式時間複雜度的算法實際上是很是低效的算法。
空間複雜度與時間複雜度的概念相相似,時間複雜度的全稱是漸進時間複雜度,表示算法的執行時間與數據規模之間的增加關係,類比一下,空間複雜度全稱是漸進空間複雜度,表示算法的存儲空間與數據規模之間的增加關係。
複雜度也叫漸進複雜度,包括時間和空間複雜度,用來分析算法的執行效率和數據規模之間的增加關係,能夠粗略地表示,越高階複雜度的算法,執行效率越低。經常使用的複雜度並很少,從低階到高階有:O(1),O(logn),O(n),O(nlogn),O(n2)