還記得以前在學校,算時間複雜度是我最痛苦的經驗之一,我永遠搞不懂,為什麼不把程式碼就打進電腦裡讓它跑,它跑得動,那就好了,沒有問題;不過現在身為一個遊戲程式設計師,還是console game的程式設計師,這股任性就沒辦法再這樣揮灑了...。
那,一個演算法基礎的分析,大概會是怎樣呢?
我們可以想像成這樣:如果我宣告了一個變數,那就要給它一段記憶體空間,然後對它進行了一連串的運算,這些運算需要一段時間,所以一個演算法,我們可以把它分析為兩個部份:時間複雜度和空間複雜度,時間複雜度代表的是這個演算法執行時間的長短,同常會計算最簡單的加法運算的次數,空間複雜度是它所需要的儲存大小;所以一個演算法的分析,也可以看成是對一個函式的效能評估,也是作遊戲的人一直要跟硬體爭取的東西。
我們通常會使用Big-O這個工具來表示一個函式的效能,接下來講得會針對時間複雜度的部份。下面是三個簡單的範例 。
從三個範例,我們可以知道時間複雜度的是Fun1最快,Fun2次之,Fun3最慢。
以下是我們列出來的一些時間複雜度的等級:
O( 1 ) or O(C):常數時間 (常數級) O( log n ) :對數時間(對數級)
O( n ) :線性時間 (線性級函數) O( n log n ):對數線性時間(對數線性級)
O( n^2 ) :平方時間(二次函數) O( n^3 ) : 立方時間(三次函數)
O( 2^n ) :指數時間(指數級) O( n! ) : 階乘時間(階乘級)
接下來就是它們的比較了。
沒有在表中的O( n! )通常是最慢的時間複雜度。
時間複雜度算出來的是時間的成長程度,而且我們有可能還有別的因素要考量,並不是像上面的三個範例,算出來一個Big-O就決定了演算法的優劣。
例如:
1.當n小於3時,n!會比2^n還要快。
2.假如要計算的函式不是那麼規則的呢?它可能會有其他的因素影響它計算的時間複雜度,所以我們還可以把一個演算法的時間複雜度分析為最佳、平均、最糟這三種情況。
不過這些我們就先不討論了,只要先瞭解這幾個時間複雜度的快慢就行了。
留言列表