Aloha!又是我少女人妻Uerica!第二天了,真是令人興奮,因為後面要怎麼寫我都還沒想好啊~哈哈哈哈!昨晚躺在床上想了一夜都睡不著,一直在想...明天要吃什麼?
好的~延續昨天的話題,若要用程式寫出某個結果,通常都不會只有一種演算法,那在這麼多演算法中要如何評估與選擇才是最適合的呢?雖然影響演算法優劣的因素有很多,但一般拿來評估與判斷的有兩個面向:演算法執行的時間長短(時間複雜度),以及演算法執行時需要耗多少記憶體(空間複雜度)。
探討演算法的效能時,常用漸進符號 Big O 來表示與描述執行演算法的步驟數或佔用的記憶體空間。
這裡的時間複雜度所探討的就是程式執行的時間。就像昨天提到的,做料理時,如果沒有有效率的料理步驟,往往差到一天的時間都是有可能的,但因為每個人家裡的廚具好壞、鍋子的大小等,都會影響到料理完成的快慢,所以為了更客觀的判斷,在計算執行時間時,都是使用 “步驟次數” 來計算。
直接來顆栗子!今天來做嫩煎雞翅吧~
由上述例子來看,我們完全不考慮鍋子大小,並且雞翅只需翻面一次,調味料也早已按雞翅份量調好的請況下,大家有發現最有可能增加步驟的地方在哪裡嗎?
沒錯~就是雞翅數量與雞翅翻面的部分!
上面的嫩煎雞翅食譜中,無論雞翅多寡我們都只需要開一次火、加一次油、下一次調味料,最後再將所有雞翅一次倒入盤中!只有雞翅需要一個個翻面的部分會受到雞翅的多寡所影響而增加步驟與時間。
好的!那我們把上述那顆栗子數字化吧!
要做一道嫩煎雞翅,開火需要 Ta 的時間、下油與熱油鍋要 Tb 的時間、將所有雞翅倒入鍋中要 Tc 的時間、翻一隻雞翅需要 Td 的時間,在這邊若有 n 個雞翅則需要 n * Td 的時間,加調味料要 Te 的時間、起鍋要 Tf 的時間。
這裡的時間複雜度就是 Ta + Tb + Tc + n * Td + Te + Tf = O(n)
因只需判斷與比較不同演算法的效率,所以只著重在最受影響的部分。在演算法圖鑑一書中有提到,O 這個符號表示 "忽略重要項目之外的部分" 的意思。以上述的例子來看,除了雞翅的數量外,其他都是不變的常數,所以在此使用O(n)
來表示此演算法的時間複雜度。
啊哈~今天先到這裡啦!寫著寫著就睏了。話說我以前超愛吃雞翅凍,還常常跟同學一起團購省運費,但我每次都會拿去微波,不知道哪天突然發現雞翅凍好像是要吃那個凍的狀態 XDD