今天開始要來講演算法相關的主題,在進入「最大數與最小數找法」之前,要先來談談 Big O Notation
Big O notation, sometimes also called “asymptotic analysis”, primarily looks at how many operations a sorting algorithm takes to completely sort a very large collection of data
如同以 KPI 作為一個工作績效的衡量指標,衡量演算法效益的指標就是 Big O Notation, O 代表 "Order of"(次序)的 function,表示演算法的時間複雜度(執行速度),以運算次數來計算執行速度
例如:今天 TODO List 裡有 n 筆資料,簡易搜尋法會需要執行 n 次,執行時間是 O(n)。二元搜尋法 會需要log n 的步驟來執行這 n 筆資料,執行時間是 O(log n)
n:正整數,代表輸入規模、資料量大小,可簡單看為要排序的陣列長度
常見的Big O 執行時間,「由快到慢」排列:
PS. 在演算法中,log n 通常指的是以 2 為底的對數,即以二進制為基數的對數。例如:log 8 = 3
從第一個數看起,記錄到目前為止最大或最小的數,逐一往後面的數找下去,如果接下來的數比所記錄的數更大或更小,就取代之,直到最後一個數為止
舉例:請找出 8、56、49、38、7、64、25、76 裡「最大數」、「最小數」
我們可以知道要在八個數裡找出「最大數」,總共要比較七次。同理可推,給定 n 個數,共要比較 n - 1 次才能找到「最大數」
我們可以知道要在八個數裡找出「最小數」,總共要比較六次。同理可推,給定 n 個數,共要比較 n - 2 次才能找到「最小數」
在「逐一比較法」中,要找出「最大數」和「最小數」共需有比較 (n-1) + (n-2) = 2n - 1 次
說了那麼多來統整一下「逐一比較法」的特點:
也稱為「相鄰元素比較法」,將比較大或小的數不斷兩兩比較,直到最後勝出的數為即為最大或最小數
舉例:請找出 8、56、49、38、7、64、25、76 這八個數裡的「最大數」和「最小數」
我們可以在上圖中得知,要在八個數裡找出「最大數」,共要比較七次。同理可推,給定 n 個數,共要比較 n - 1 次才能找到「最大數」,與「逐一比較法」相同
只要把第一輪兩兩比較中那些輸的數再做比較就可以,第一輪比較就是最下層那幾個數,比輸的有 8、38、7、25,共四個數,比較三次會得到最小數。同理可推,給定 n 個數,共要比較 n/2 - 1 次才能找到「最小數」
在「兩兩比較法」中,要找出「最大數」和「最小數」共需要比較,(n-1) + (n/2 - 1) = 3n/2 - 2 次
「兩兩比較法」的特點:
這兩種演算法的效率都較低,特別是對於大型資料集而言。如果需要處理大型的資料集,通常會更傾向使用其他更高效的演算法,如快速排序(Quick Sort)、合併排序(Merge Sort)或堆排序(Heap Sort),有較低的平均時間複雜度,通常是O(n log n),會在後面篇章介紹