close

還記得以前在學校,算時間複雜度是我最痛苦的經驗之一,我永遠搞不懂,為什麼不把程式碼就打進電腦裡讓它跑,它跑得動,那就好了,沒有問題;不過現在身為一個遊戲程式設計師,還是console game的程式設計師,這股任性就沒辦法再這樣揮灑了...

那,一個演算法基礎的分析,大概會是怎樣呢?

我們可以想像成這樣:如果我宣告了一個變數,那就要給它一段記憶體空間,然後對它進行了一連串的運算,這些運算需要一段時間,所以一個演算法,我們可以把它分析為兩個部份:時間複雜度空間複雜度,時間複雜度代表的是這個演算法執行時間的長短,同常會計算最簡單的加法運算的次數,空間複雜度是它所需要的儲存大小;所以一個演算法的分析,也可以看成是對一個函式的效能評估,也是作遊戲的人一直要跟硬體爭取的東西。

我們通常會使用Big-O這個工具來表示一個函式的效能,接下來講得會針對時間複雜度的部份。下面是三個簡單的範例 。

基本演算法分析1.JPG

從三個範例,我們可以知道時間複雜度的是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! )        階乘時間(階乘級)

接下來就是它們的比較了。

基本演算法分析2.JPG


沒有在表中的O( n! )通常是最慢的時間複雜度。

時間複雜度算出來的是時間的成長程度,而且我們有可能還有別的因素要考量,並不是像上面的三個範例,算出來一個Big-O就決定了演算法的優劣。

例如:
1.n小於3時,n!會比2^n還要快。
2.假如要計算的函式不是那麼規則的呢?它可能會有其他的因素影響它計算的時間複雜度,所以我們還可以把一個演算法的時間複雜度分析為最佳、平均、最糟這三種情況。

不過這些我們就先不討論了,只要先瞭解這幾個時間複雜度的快慢就行了。

arrow
arrow
    全站熱搜

    SnakeEater 發表在 痞客邦 留言(1) 人氣()