黑客帝國:Neo,是這個問題驅使着我們,是這個問題帶你來到這兒。你知道這個問題,我也是。
第一部分
第1章 算法真的很重要
malloc()一個包裝了系統內存分配函數的函數。
free()一個包裝了系統內存回收函數的函數。
exit()一個包裝了系統退出函數的函數。
如果需要,儘可能用實踐檢驗
你對二叉樹進行了平衡處理嗎?
算法真的很重要
每一個優秀的軟件開發者都應該具備。並不需要你能夠對算法進行詳細的數學分析,但是你必須能夠理解這些分析。
第2章 算法的數學原理
問題的樣本規模
設計一個高效的算法通常是從選擇一個合適的數據結構開始的。
第3章 模式和領域
我們編寫軟件是爲了解決問題
模式:一種交流語言。
設計模式是一個驗證過的解決方案,這個解決方案能夠一般問題。
算法模式的格式:名稱,梗概,使用環境,驅動因素,解決方案,結論,分析,相關算法。
第二部分
第4章 排序算法
插入排序
中值排序
快速排序
在快速排序中,我們不再尋找中值,而是通過某些策略來選擇一個元素,這個元素將數組切分成了兩個子數組。
選擇排序
堆排序
計算排序
桶排序
第5章 查找
存在性查詢,檢索查詢,關聯查找
二分查找每次將有序集合折半直到找到待查找元素
最常使用的一個方法是使用散列函數來將目標元素的一個或者多個特徵轉換成一個值,這個值用來索引一個已經索引的散列表。
不適當的散列函數可能會導致一個不均勻的鍵值分佈。
選擇散列函數是在實現基於散列的查找之前必須做的第一個決定。
二叉查找樹
AVL樹和紅黑樹
紅黑樹和其他的平衡二叉樹是內存查找的最好選擇。
n路樹和B樹
第6章 圖算法
無向圖,有向圖,有權圖,超圖
存儲結構有:鄰接表,鄰接矩陣
決定使用鄰接表還是鄰接矩陣的最重要因素是圖是否爲稀疏圖。
深度優先探索,廣度優先搜索
單源最短路徑,所有點對最短路徑,最小生成樹算法(Prime)
第7章 人工智能中的尋路
如果一個問題沒有明確的解決算法,那麼我們可以考慮使用尋路算法。在這章我們將討論兩種尋路算法,一種基於博弈樹,另外一種基於搜索樹。
深度優先搜索
博弈樹和搜索樹的一個不同就是搜索樹必須在搜索中存儲棋面狀態的副本。基於博弈樹的搜索算法在搜索過程中只需要執行或者撤銷走法。
廣度優先搜索
廣度優先搜索嘗試在不重複訪問狀態的情況下,尋找到一種最短路徑。
A*搜索在搜索時能夠利用啓發式信息,智能地調整搜索策略。
A*搜索是一種迭代的有序搜索,它維護一個棋面狀態的開放集合,在每次迭代時,A*搜索使用一個評價函數f*(n)評價開放集合中的所有棋面狀態,選擇最小的棋面狀態。
A*搜索的效果直接依賴於其啓發式函數。
Minimax
NegMax
第8章 網絡流算法
有很多問題可抽象成頂點和有容易限制的邊的網絡。
任務分配,二部圖匹配,運輸問題,轉運問題,最大流。
從理論上來說,你可以利用線性編程來解決上面提到的所有問題,但是你必須得先將這些問題轉換成正確的線性表示形式,而且得到的解能夠轉換成原來的形式。
在一個流網絡中,如果我們給定了所有邊的容量,那麼我們可以計算出這個流網絡的最大流。
Ford-Fulkerson 增廣路徑。
流網絡的典型實現方式是使用數組存儲信息。
二部圖匹配
最小開銷流:解決最小開銷流問題,我們僅僅需要構造一個流網絡圖,並且保證滿足之前討論過的那些限制條件:容量限制、流量守恆以及反對稱。
第9章 計算幾何
計算幾何和點、線和麪這樣的幾何物體關係非常緊密。
計算幾何經典問題:凸包,計算線段集的相交,尋找最近鄰點
凸包掃描,最早計算凸包的一個算法叫做Graham掃描。
線段掃描
線段掃描的創新在於將所有的線段從左至右按照y座標進行排序。
最近點查詢
kd樹的平衡調整
kd樹的性能在高維度下非常差,算法在高維度下,性能會退化。
第10章 最後的招數
另類算法
近似算法
離線算法
並行算法
隨機算法
第11章 尾聲
原則:瞭解數據
原則:將問題分解至更小的問題
原則:選擇正確的數據結構
原則:空間換時間
原則:如果沒有顯而易見的解法,使用搜索
原則:如果沒有顯而易見的解法,將問題歸約爲另一個有解的問題
原則:編寫算法難,測試算法更難
第四部分
附錄 基準測試