算法的性能分析是算法設計中非常重要的方面,要想編寫出能高效運行的程序,我們就需要考慮到算法的效率。
算法的效率主要由以下兩個復雜度來評估:
時間復雜度:評估執行程序所需的時間。可以估算出程序對處理器的使用程度。算法的時間復雜度一般是問題規模的函數,通常用T=T(n)表示,其中,n表示問題的規模,即算法所處理的數據量。T表示算法所用時間。
算法的執行時間=該算法所有語句執行次數(包括重復執行次數)* 執行每條語句所花費時間總和。由於每條語句的執行時間是cpu速度決定的,對計算機而言是常數,因此可以忽略不計,只考慮語句的執行次數(頻率或頻度)。為了進一步簡化計算,可以只用算法中某條重要語句(執行時間最長的語句)的執行頻度。換句話說就是時間復雜度是主要語句頻度的倍數。
備注:一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,只需知道哪個算法花費的時間多,哪個算法花費的時間少就可以了。並且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
空間復雜度:評估執行程序所需的存儲空間。可以估算出程序對計算機內存的使用程度。不包括算法程序代碼和所處理的數據本身所占空間部分。通常用所使用額外空間的字節數表示。其算法比較簡單,記為S=S(n),其中,n表示問題規模。
設計算法時,一般是要先考慮系統環境,然后權衡時間復雜度和空間復雜度,選取一個平衡點。不過,時間復雜度要比空間復雜度更容易產生問題,因此算法研究的主要也是時間復雜度,不特別說明的情況下,復雜度就是指時間復雜度。
評價算法時間復雜度大小需要考慮的因素:
1,計算機硬件系統的運行速度。
2,所使用的軟件環境。
3,算法本身的策略,采用不同的存儲結構和不同的算法過程,是影響時間復雜度的本質原因之一。
4,所處理的數據量多少。
算法性能的評價方法:
1,事后統計法。
2,預先計算估算法。
1>精確計算法
2>近似估算法
這里我介紹數據結構最常用的方法,也就是第二種的第二類。
T(n)=O(f(n));S(n)=O(g(n))
其中,f(n)和g(n)是一個已知的函數,作為計較的尺度。
通常的比較尺度有:
O(1)稱為常量級,算法的時間復雜度是一個常數。
O(n)稱為線性級,時間復雜度是數據量n的線性函數。
O(n²)稱為平方級,與數據量n的二次多項式函數屬於同一數量級。
O(n³)稱為立方級,是n的三次多項式函數。
O(logn)稱為對數級,是n的對數函數。
O(nlogn)稱為介於線性級和平方級之間的一種數量級
O(2ⁿ)稱為指數級,與數據量n的指數函數是一個數量級。
O(n!)稱為階乘級,與數據量n的階乘是一個數量級。
它們之間的關系是: O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)