閱讀演算法圖鑑後,資料整理。
這本書對於初學者來說是一本初步了解演算法的好書,內容解釋演算法的思想步驟。
但缺點也相對於明顯,沒有真正的程式碼操作流程。另外對於日文了解的人也可以下載 app アルゴリズム図鑑,有動態演示。
何謂演算法
演算法是以執行計算或完成作業的程序,可以想像成料理食譜的步驟,用電腦解決特定的問題便是演算法。
執行時間與量測方法
由於每台電腦上同一個演算法所跑出來的執行時間可能會有不同,因此會使用步驟次數來表示時間,1個步驟為一個基本單位,在運作結束之前,總共執行了幾次基本單位。
n表示數列的個數。確認 1 個數的操作視為基本單位,耗費的時間通常會用Tc表示。- 在完成一個步驟後的基本單位以
Ts表示。 O表示忽略重要項目之外的部分,念作order,O(n^2) 表示執行時間在最糟糕的情況下能控制在 n^2 的常數倍。EX: 選擇排序為 O(n^2),快速排序為 O(n log n)。
ch1 資料結構
何謂資料結構
資料結構就是數據儲存在記憶體中時,所決定的順序與位置。而根據不同的需求設計資料結構,可以提高記憶體的使用效率。
列表 list
列表是資料結構的一種,該結構數據排成一直線,方便新增或刪除,但存取時卻較費時。
陣列 array
該資料結構與 list 相反,方便存取,但新增或刪除較費時費力
堆疊 stack
該資料結構會將數據由下而上排成一列,像是在堆放資料夾一樣。最新加入的數據會在最上方,再取出文件時也是從最上方開始執行。(後進先出 Last in first out)
佇列 queue
將資料排成一列,類似 stack,但兩端分別執行不同任務,下方執行刪除,上方執行追加,猶如排隊一般。(先進先出 Fist in first out)
雜湊表 hash table
該資料結構會將數據儲存為成對鍵 Key、值 value
堆積 heap
圖形的樹狀結構之一,用來實踐優先佇列,可以自由的追加數據,讀取數據依序從最小值開始選取。在樹狀結構中,每個頂點稱為節點 node
二元搜尋樹 binary search tree
圖形的樹狀結構之一,會將數據存入各節點中。
ch2 排序
何謂排序
排序 sort, 將數值由小到大排列。
氣泡排序 bubble sort O(n^2)
反覆進行 由右往左,將相鄰的數倆倆比對後重新排列,因為數由右邊向左移動的時候,很像水中氣泡浮起的樣子而得名。
選擇排序 selection sort O(n^2)
搜尋數列中最小的值,將它與最左的數對調。
插入排序 insertion sort O(n^2)
從數列中由左開始向右排序。左邊完成後,在右邊未搜尋的領域中取出一個數,插入以排序完成領域的是當位置。
堆積排序 heap sort O(n log n)
此排序是利用 堆積 heap 資料結構,首先會將資料堆積成遞降次序(descending order)結構,取出根後再重新排列,反覆進行完成排序。
堆積排序處理的速度通常會較前述排序快,但使維護、建置較為複雜。
合併排序 merge sort O(n log n)
將想要排序的數列分割成幾乎等長的兩個數列直到無法再分割後,在合併個數列。
快速排序 quick sort O(n log n)
隨機在數列中選取一個數作為基準 pivot,再將比基準值小/大的數分成兩組,同樣的步驟重複。
快速排序為分治法,將一個問題切成兩個小問題各自排序後,而一再重複同樣步驟在演算法中稱為遞迴。
ch3 陣列搜尋
線性搜尋 O(n)
從陣列前端開始查詢數據,同時也適用數據散亂排列時,但當數據不存在或較後方就會耗費比較多的時間。
二元搜尋 O(log n)
只適用在陣列已完成數據排序的情況,會從數據的正中央開始與目標數據做比較判斷目標數據在中心數據的左或右。
ch4 圖形搜尋
何謂圖形
離散數學的圖形是以畫成圓圈的地方稱為頂點或節點,並將連結頂點之間的線稱之為邊。
廣度優先搜尋 breath-first search
假設自己在某個頂點(起點),從起點開始經由邊搜尋頂點,直到找到指定的目標頂點。在搜尋時會優先從距離起點較近的頂點開始找起。
頂點選項是以 FIFO 方式管理,所以可以使用在 佇列 的資料結構。
深度優先搜尋 depth-first search
與廣度優先搜尋相同的是從起點開始到目標頂點。不同的地方在於會先探查單一路徑,直到無法前進在探查下個路徑。
貝爾曼 福特演算法 Bellman-Ford algorithm
計算圖形最短路徑問題的演算法。最短路徑問題是賦予邊權重的加權圖形裡,指定起點和終點並求出起點到終點支籤權重總和最小的路徑。使用此演算法的好處是即使權重為負數也可以正確運作。
戴克斯特拉演算法 Dijkstra’s algorithm
與前一個演算法相同用來解決最短路徑問題的演算法。一邊逐一判斷個頂點的最短路徑邊搜尋圖形,計算速度較快但缺點是在權重有出現負數時,無法正確運作。
A 演算法 A algorithm
從戴克斯特拉演算法所發展出來的演算法。使用預設權重做為參考,減少無謂搜尋的改良方式。
非常適用在能獲得從個地點到終點距離的線索時,即使線索不一定正確。通常廣泛的用於遊戲程式中追逐玩家的敵人行動運算。
ch5 安全性演算法
安全性和演算法
在網路數據傳輸時會遇到四個問題
- 竊聽 eavesdrop
- 電子欺騙 spoofing
- 竄改 falsification
- 抵賴 repudiation
為了防止竊聽會使用 加密 encryption,第二、三問題會利用訊息鑑別碼或數位簽章,第四問題則可以使用數位簽章。
加密的基礎
網際網路的環境中,傳輸數據時可能遭第三者偷窺,因此會將需要保密的數據加密後才送出 cipher text,等待接收到數據後才 decryption。
雜湊函數
將數據轉換成固定長度不規則的 value。
代表演算法有 MD5、SHA-1、SHA-2,現在叫普遍使用安全性高的SHA-2。
實際使用雜湊函數案例: 如使用者輸入的密碼保存於伺服器時。
共用金鑰密碼系統
共用金鑰密碼系統是在加密和解密時使用相同金鑰的加密方法。
代表的有:
凱撒密碼、AES(進階加密標準)、DES(資料加密標準)、一次性密碼本,目前廣泛使用的為AES。
公開金鑰密碼系統
又稱非對稱式密碼系統。加密使用公開金鑰,解密使用私密金鑰,兩把金鑰皆由接收者製作並將公開金鑰傳給傳送者。
此系統演算法有RSA加密和橢圓曲線密碼學,現在多半使用 RSA 加密。
但此方法有可能遭到中間人以同樣的方式,偽造兩把鑰匙中途攔截數據,並稱為中間人攻擊 man-in-the-middle attack。
混成密碼系統
對於前述兩者一個安全性問題,一個處理速度問題。因而產生混合密碼系統。
也就是現在常用確保網路資訊傳輸安全的安全協議 SSL(secure sockets layer),版本更新後稱為 TLS(transport layer security)。
迪菲 赫爾曼金鑰交換 Diffie-Hellman key exchange
雙方將公開金鑰交換,雙方各自的私密金鑰和公開金鑰合成,在互相交換,並再和自己的私密金鑰再做一次合成。
金鑰合成的最後結果與順序無關,所以合成鑰匙會有公開金鑰、雙方私鑰三個元素。如果被第三人偷窺時,由於雜湊的不可逆向解密因為使得無法破解,因此此系統有很高的安全性。
訊息鑑別碼
可以實現身分鑑別和訊息完整性兩種功能機制。
數位簽章
實現身分鑑別和訊息完整性兩種功能機制,並加入不可抵賴性機制。這個機制只有傳送者可以製作數位簽章的數據。
數位憑證
利用數位頻正可以確保公開金鑰的真實性。發送者必須像憑證機構申請發行憑證,證明公開金鑰是自己的。
ch6 分群
何謂分群 clustering
把類似的數據做分類成組的操作。為了決定甚麼是類似的,所以必須定義兩個數據間的距離。
k-means 演算法
此演算法會是先決定群集個數,再根據個數分組。
ch7 其他演算法
輾轉相除法 Euclidean algorithm
輾轉相除法是求兩數最大公因數(greatest common divisor, GCD)的演算法。
質數判定法 primality test
現代加密技術成使用的 RSA加密,便是利用非常大的值數做加密。
網頁排名
以權重分數計算來確認網頁的重要性。如 google 搜尋。
河內塔
遞迴演算法的遊戲。
總結
在 4、6、7 的章節的部分確實是有比較不熟悉,目前會先專注於了解1、2章的基礎。