內容簡介
算法是一系列解決問題的清晰指令,是程式設計的靈魂。同一問題可採用不同的算法解決,而一個算法的優劣將直接影響程式的執行效率。本書以ACM程式設計競賽的題目為基礎,詳細介紹一些常用的算法以及相關的理論知識,主要內容包括高級數據結構、字元串、動態規划進階算法、圖論高級算法、經典算法問題、組合數學、計算幾何、組合遊戲論。
圖書目錄
第1章 高級數據結構 (1)
1.1 堆 (1)
1.1.1 堆的定義 (1)
1.1.2 建堆 (1)
1.1.3 堆排序算法 (2)
1.2 樹狀數組 (3)
1.2.1 樹狀數組的定義 (4)
1.2.2 樹狀數組的實現和使用 (4)
1.2.3 例題講解 (5)
1.3 左傾堆 (7)
1.3.1 左傾堆相關定義和性質 (7)
1.3.2 左傾堆的操作 (7)
1.3.3 例題講解 (8)
1.4.1 Treap (11)
1.4.2 Splay樹 (13)
1.4.3 例題講解 (18)
1.5 練習題 (22)
第2章 字元串 (24)
2.1 Trie樹 (24)
2.1.1 Trie樹的原理 (24)
2.1.2 Trie樹的實現 (25)
2.1.3 例題講解 (26)
2.2.1 KMP算法的原理 (29)
2.2.2 KMP算法的實現 (31)
2.2.3 例題講解 (32)
2.3 Aho-Corasick自動機 (35)
2.3.1 Aho-Corasick自動機原理 (35)
2.3.2 Aho-Corasick自動機算法的實現 (37)
2.3.3 例題講解 (39)
2.4.1 後綴數組基本原理 (43)
2.4.2 後綴數組的套用 (46)
2.4.3 例題講解 (49)
2.5 練習題 (54)
第3章 動態規划進階算法 (57)
3.1 樹狀DP (57)
3.1.1 樹狀DP的定義 (57)
3.1.2 樹狀DP解題方法 (58)
3.1.3 例題講解 (58)
3.2 狀態壓縮DP (62)
3.2.1 集合的整數表示 (62)
3.2.2 例題講解 (63)
3.3 動態規劃的最佳化方法 (66)
3.3.1 單調佇列最佳化的動態規劃 (66)
3.3.2 例題講解 (66)
3.3.3 斜率最佳化的動態規劃 (68)
3.3.4 例題講解 (68)
3.3.5 四邊形不等式最佳化的動態規劃 (71)
3.3.6 例題講解 (71)
3.4 練習題 (73)
第4章 圖論高級算法 (76)
4.1 最大流 (76)
4.1.1 最大流的定義 (76)
4.1.2 增廣路算法涉及的三個重要概念 (77)
4.1.3 Edmonds-Karp算法 (79)
4.1.5 ISAP算法 (84)
4.1.6 網路流的建圖 (89)
4.1.7 例題講解 (91)
4.2 最小費用流 (99)
4.2.1 最小費用流算法 (99)
4.2.2 例題講解 (100)
4.3 二分圖匹配 (109)
4.3.1 二分圖的定義 (109)
4.3.2 二分圖的最大匹配 (109)
4.3.3 二分圖的性質與套用 (114)
4.3.4 例題講解 (115)
4.4 練習題 (118)
第5章 經典算法問題 (121)
5.1.1 多項式 (121)
5.1.2 多項式的表示與多項式乘法 (121)
5.1.3 DFT和FFT的實現 (123)
5.1.4 例題講解 (124)
5.2.1 NP問題簡介 (127)
5.2.3 例題講解 (128)
5.3 對偶圖問題 (135)
5.3.1 基本概念 (135)
5.3.2 平面圖轉化為對偶圖 (137)
5.3.3 對偶圖的套用 (140)
5.4 RMQ問題 (144)
5.4.1 RMQ問題的簡單求解方法 (145)
5.4.2 ST(Sparse Table)算法 (145)
5.4.3 例題講解 (146)
5.5 LCA問題 (151)
5.5.1 LCA問題的簡單求解方法 (151)
5.5.2 基於倍增的雙親存儲法 (152)
5.5.3 高效的LCA算法 (152)
5.5.4 例題講解 (154)
5.6 練習題 (158)
第6章 組合數學 (161)
6.1 排列組合 (161)
6.1.1 基本計數原則 (161)
6.1.2 排列 (161)
6.1.3 組合 (162)
6.1.4 例題講解 (163)
6.2 母函式 (164)
6.2.1 母函式基礎 (165)
6.2.2 母函式的兩類具體套用 (165)
6.2.3 例題講解 (166)
6.3 整數劃分 (169)
6.3.1 從動態規劃到母函式 (169)
6.3.2 例題講解 (170)
6.4 Stirling數和Catalan數 (172)
6.4.1 第一類Stirling數 (172)
6.4.2 第二類Stirling數 (173)
6.4.3 Catalan數 (173)
6.4.4 例題講解 (174)
6.5 容斥原理與反演 (179)
6.5.1 容斥原理 (179)
6.5.2 反演理論 (180)
6.5.3 Mobius反演 (181)
6.5.4 例題講解 (184)
6.6 群論與Polya定理 (187)
6.6.1 群的基本性質 (187)
6.6.2 置換群 (188)
6.6.3 Burnside定理及Polya定理 (189)
6.6.4 例題講解 (190)
6.7 練習題 (192)
第7章 計算幾何 (195)
7.1 多邊形上的數據結構表示 (195)
7.1.1 點 (195)
7.1.2 線段 (197)
7.1.3 多邊形類 (198)
7.1.4 例題講解 (199)
7.2 多邊形相交問題 (202)
7.2.1 線段相交 (202)
7.2.2 多邊形相交問題的討論 (203)
7.2.3 例題講解 (204)
7.3 多邊形求面積 (207)
7.3.1 計算多邊形的面積 (207)
7.3.2 格點數 (208)
7.3.3 例題講解 (209)
7.4 凸包 (210)
7.4.1 凸多邊形 (210)
7.4.2 凸多邊形的性質 (215)
7.4.3 構造凸包 (215)
7.4.4 例題講解 (219)
7.5 相交問題 (230)
7.5.1 半平面交 (230)
7.5.2 凸多邊形交 (232)
7.5.3 例題講解 (232)
7.6 圓 (240)
7.6.1 圓與線段的交 (240)
7.6.2 圓與多邊形的交的面積 (241)
7.6.3 圓與圓的交的面積 (241)
7.6.4 圓與圓的並的面積 (245)
7.7 練習題 (249)
第8章 組合遊戲論 (252)
8.1 組合遊戲論中的遊戲 (252)
8.1.1 組合遊戲論的定義 (252)
8.1.2 博弈樹模型 (253)
8.1.3 巴什博弈 (253)
8.1.4 威佐夫博弈 (254)
8.1.5 例題講解 (255)
8.2 NIM遊戲和SG函式 (256)
8.2.1 NIM遊戲的定義 (256)
8.2.2 NIM遊戲中的性質 (256)
8.2.3 Sprague-Grundy函式的價值 (257)
8.2.4 SG函式的套用 (258)
8.2.5 例題講解 (259)
8.3 NIM遊戲的變形 (262)
8.3.1 ANTI-NIM問題 (262)
8.3.2 Staircase NIM (264)
8.3.3 例題講解 (265)
8.4 練習題 (267)
參考文獻 (269)