我們昨天介紹了資料結構,那今天來簡單的看演算法吧!
先簡單解釋一下為什麼要在資料結構的文章裡介紹演算法,
我們經常在各個地方都能看到演算法的存在,其實他沒有你想像的困難
像是泡泡麵、煮飯、找教室路線,甚至整理撲克牌,背後都存在一套「為了達成目標而設計的步驟」。
而這套步驟,就是 演算法(Algorithm)
根據字典定義 : 演算法(Algorithm)是一種明確且有限的步驟,用來解決特定問題或完成任務
再換個說法就是:
利用步驟來達成事情
用小朋友的話來理解的話就是:
假設你要用 1、5、10 元湊出 72 元
那他的方式可以為
用1元開始加
2
3
4
...
72 ->成功!
或是
從最大的10元開始加
10
20
...
70
還不夠2元!
71
72 ->成功!
那可以看出第一個方法明顯比較慢,要加 72 次
那第二個方法只要 9 次就能找到答案
這就是演算法的核心:解決同一個問題可以有很多種做法,而演算法在乎的正是
「用什麼樣的步驟,能又快又好地達成目標」。
方法二之所以看起來比較快,是因為它每一步都優先選擇當下能帶來最大效果的做法(先使用面額最大的 10 元)。
這種「每一步都選擇目前看起來最好的選項」的想法,其實就是之後會介紹到的
貪心法(Greedy) 的核心概念。
不過要注意的是,貪心法並不保證每次都是最佳解。因此這裡只是先建立一個概念,之後介紹貪心法時再深入探討。
| 特性 | 說明 |
|---|---|
| Input(輸入) | 至少要有 0 個或多個以上的輸入資料 |
| Output(輸出) | 執行完畢後,至少要產生 1 個以上的輸出結果 |
| 明確性(Definiteness) | 每一個步驟都必須清楚、不能模糊,不能有「大概」、「差不多」這種說法 |
| 有效性(Effectiveness) | 每一個步驟都必須是實際可執行的,且能在有限時間內完成 |
| 有限性(Finiteness) | 整個演算法必須在有限的步驟內結束,不能無窮無盡地執行下去 |
| 分類 | 演算法 | 說明 |
|---|---|---|
| 遞迴 | Recursion | 函式呼叫自己來解決問題,後面排序、樹、圖的走訪都會用到 |
| 排序演算法 | Bubble Sort、Selection Sort、Insertion Sort、Merge Sort、Quick Sort | 讓資料按照特定順序排列 |
| 搜尋演算法 | Linear Search、Binary Search | 在資料中找出特定目標 |
| 圖的走訪演算法 | BFS、DFS | 走訪圖狀結構中的節點 |
至於分治法(Divide and Conquer)和貪心法(Greedy)之後如果有機會的話
會再介紹 !
明天我們要來介紹判斷演算法好壞的工具,時間複雜度(Time Complexity)和Big O表示法
參考資料與書籍