演算法圖解讀書筆記
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)
相關文章
- 《圖解 HTTP》 讀書筆記圖解HTTP筆記
- 【演算法圖解】讀書筆記:第3章 遞迴演算法圖解筆記遞迴
- 《圖解TCP/IP》讀書筆記(一)圖解TCP筆記
- 《演算法圖解》讀書筆記—像小說一樣有趣的演算法入門書演算法圖解筆記
- 終、《圖解HTTP》讀書筆記 - 彙總篇(總結)圖解HTTP筆記
- 《演算法圖解》筆記演算法圖解筆記
- 讀書筆記筆記
- 《讀書與做人》讀書筆記筆記
- 《圖解HTTP》閱讀筆記(上)圖解HTTP筆記
- 《圖解HTTP》閱讀筆記(下)圖解HTTP筆記
- webpackDemo讀書筆記Web筆記
- Vue讀書筆記Vue筆記
- 散文讀書筆記筆記
- Cucumber讀書筆記筆記
- HTTP 讀書筆記HTTP筆記
- postgres 讀書筆記筆記
- 讀書筆記2筆記
- 讀書筆記3筆記
- 《解構產品經理》讀書筆記筆記
- 《JavaScript程式設計精解》--讀書筆記JavaScript程式設計筆記
- js高程讀書筆記JS筆記
- 《論語》讀書筆記筆記
- 《重構》讀書筆記筆記
- PMBook讀書筆記(一)筆記
- 【演算法】演算法圖解筆記_快速排序演算法圖解筆記排序
- 《如何有效閱讀一本書》讀書筆記筆記
- 《將心注入》讀書筆記筆記
- Raft論文讀書筆記Raft筆記
- 讀書筆記-沒有空白筆記
- JVM讀書筆記之OOMJVM筆記OOM
- swift語法-讀書筆記Swift筆記
- 【GO】《GO HANDBOOK》讀書筆記Go筆記
- 讀書筆記(2)《微精通》筆記
- 《Effective C++》讀書筆記C++筆記
- 編譯原理讀書筆記編譯原理筆記
- 類載入讀書筆記筆記
- 《Effective-Ruby》讀書筆記筆記
- 《CSS揭祕》讀書筆記CSS筆記
- 產品讀書筆記-需求筆記