演算法圖解讀書筆記

daydaygo發表於2017-09-18

date: 2017-9-16 11:11:15

title: 演算法圖解讀書筆記

演算法圖解: http://www.ituring.com.cn/book/1864

套用面試時聽到的一句話: 連 topk 問題都不知道, 我們不要計算機基礎這麼差的. 所以, 光看這本書, 還遠遠不夠.

coding: https://coding.net/u/daydaygo/p/algorithm/git

一些概念

big O 表示法

對數(log)的理解: 可汗學院(khanacademy.org)有一個不錯的視訊

理解不同的大O執行時間

演算法所需的固定時間量,被稱為常量

平均情況和最糟情況

一些常見的大O執行時間

O(n!): 旅行商問題 階乘函式(factorial function)

遞迴

基線條件 + 遞迴條件

編寫涉及陣列的遞迴函式時,基線條件通常是陣列為空或只包含一個元素

迴圈 vs 遞迴: 程式的效能 vs 更容易理解

呼叫棧(call stack): 呼叫另一個函式時,當前函式暫停並處於未完成狀態

尾遞迴: 對遞迴進行優化, 但並不是適用所有場景


NP完全問題: 沒有快速演算法的問題

資料結構

陣列 vs 連結串列: facebook 查詢使用者名稱, 首字母作為陣列, 陣列的值為連結串列

佇列(queue): 先進先出(First In First Out,FIFO)

棧(stack): 後進先出(Last In First Out,LIFO)

雜湊表(Hash Table)

場景: DNS解析(DNS resolution) / 快取

雜湊函式: 防止重複 / SHA函式

衝突: 就在這個位置儲存一個連結串列

填裝因子

調整長度(resizing): 通常將陣列增長一倍

一個不錯的經驗規則是:一旦填裝因子大於0.7,就調整雜湊表的長度。

幾乎根本不用自己去實現雜湊表

節點(node) + 邊(edge)

有向圖(directed graph)/ 無向圖(undirected graph)

圖還可能有環

權重(weight): 加權圖(weighted graph) / 非加權圖(unweighted graph)

負權邊

二叉樹 binary tree

二叉查詢樹(binary search tree)

平衡狀態的特殊二叉查詢樹,如紅黑樹。

對資料庫或高階資料結構感興趣,請研究如下資料結構:B樹,紅黑樹,堆,伸展樹

演算法

二分查詢: 40億個 vs 32次查詢

選擇排序: 依次找出最小的數

快速排序: 選取基準值(pivot), 將序列分成大於基準值和小於基準值的 2 部分, 遞迴下去

合併排序(merge sort): 將序列依次分為 2 部分, 直到最小的可排序序列, 然後依次合併排序後的部分

廣度優先搜尋(breadth-first search,BFS)

場景: 最短路徑問題(shortest-path problem)

  • 編寫國際跳棋AI,計算最少走多少步就可獲勝;
  • 編寫拼寫檢查器
  • 人際關係網路找到關係最近的醫生

使用佇列實現時, 要注意儲存節點是否訪問過

big O: O(V + E),其中V 為頂點(vertice)數,E 為邊數。


狄克斯特拉演算法(Dijkstra's algorithm): 有向無環圖(directed acyclic graph,DAG)

貝爾曼-福德演算法(Bellman-Ford algorithm): 負權邊的圖

貪婪演算法

場景: 教室排程問題 / 揹包問題 / 集合覆蓋問題

在有些情況下,完美是優秀的敵人

每步都選擇區域性最優解

近似演算法(approximation algorithm): 速度有多快 / 得到的近似解與最優解的接近程度

動態規劃

場景:

  • 揹包問題: 當前的最大價值。
  • 最長公共子串,但其實更常用的是最長公共子序列
  • DNA鏈的相似性
  • git diff
  • 編輯距離(levenshtein distance)指出了兩個字串的相似程度
  • word 軟體中換行

但僅當每個子問題都是離散的,即不依賴於其他子問題時,動態規劃才管用

沒有放之四海皆準的計算動態規劃解決方案的公式。

K最近鄰(k-nearest neighbours,KNN)

特徵抽取: 畢達哥拉斯公式(2 點間的距離) / 餘弦相似度(cosine similarity)

分類就是編組

迴歸(regression)就是預測結果(如一個數字)

場景: 推薦系統 / 橙子還是柚子


歐幾里得演算法: 兩個正整數a,b的最大公約數 gcd(a,b)

分而治之(divide and conquer,D&C)

費曼演算法(Feynman algorithm)


OCR(optical character recognition): 第一步是檢視大量的數字影像並提取特徵,這被稱為訓練(training)

樸素貝葉斯分類器(Naive Bayes classifier): 垃圾郵件過濾器

反向索引(inverted index): 搜尋引擎

傅立葉變換: 絕妙優雅且應用廣泛的演算法之一 / 給它一杯冰沙, 它能告訴你其中包含哪些成分

並行演算法: 並行性管理開銷 / 負載均衡

MapReduce: 分散式演算法 / 對映(map)函式和歸併(reduce)函式

概率型演算法: 布隆過濾器是一種概率型資料結構 / HyperLogLog近似地計算集合中不同的元素數 / 它提供的答案有可能不對,但很可能是正確的 / 面臨海量資料且只要求答案八九不離十時

安全雜湊演算法(secure hash algorithm,SHA)函式: 比較檔案 / 檢查密碼

Simhash: 區域性敏感的雜湊演算法

Diffie-Hellman金鑰交換: 如何對訊息進行加密,以便只有收件人才能看懂呢?

線性規劃: 線性規劃用於在給定約束條件下最大限度地改善指定的指標 / Simplex演算法

函數語言程式設計一瞥

haskell // haskell: sum sum[] = 0 sum(x:xs) = x + (sum xs)

相關文章