編輯推薦
適讀人群 :適閤軟件開發人員、編程和算法愛好者以及計算機專業的學生閱讀 CSDN超人氣博主、算法專欄達人王曉華力作
淋灕盡緻展現算法本質,廣泛涵蓋常用算法結構及其應用
一本書玩轉算法,盡享算法樂趣
內容簡介
算法之大,大到可以囊括宇宙萬物的運行規律;算法之小,小到寥寥數行代碼即可展現一個神奇的功能。算法的應用和樂趣在生活中無處不在:
曆法和二十四節氣計算使用的是霍納法則和求解一元高次方程的牛頓迭代法;
音頻播放器跳動的實時頻譜背後是離散傅立葉變換算法;
DOS時代的PCX圖像文件格式使用的是簡單有效的RLE壓縮算法;
RSA加密算法的光環之下是樸實的歐幾裏德算法、濛哥馬利算法和米勒-拉賓算法;
井字棋、黑白棋、五子棋和俄羅斯方塊遊戲背後是各種有趣的AI算法;
華容道遊戲求解的簡單窮舉算法中還蘊藏著對棋盤狀態的哈希算法;
遺傳算法神秘不可測,但用遺傳算法求解0-1背包問題隻用瞭60多行代碼……
《算法的樂趣》帶你走進色彩繽紛的算法世界,讓你盡享算法的樂趣。
作者簡介
王曉華 ,2005年畢業於華中科技大學,目前在中興通訊上海研發中心從事光縴接入網通訊設備開發,擔任EPON(以太網無源光網絡)業務軟件開發經理,參與開發的PON設備在全球部署過億綫,為數億傢庭提供寬帶接入服務。
業餘時間喜歡研究算法和寫作博客,樂趣就是用程序解決生活中的問題:
為瞭方便使用Visual Studio 6.0開發軟件,曾特意編寫並開源瞭一個tabbar插件;
為瞭文檔安全,開發瞭一個基於layerFSD技術的透明文件加密係統;
使用Source Insight軟件覺得不習慣,於是以外掛的形式開發瞭TabSiPlus插件……
內頁插圖
精彩書評
★“另外兩本排名靠前的經典算法教材是Jon Kleinberg的Algorithm Design和Steven S Skiena的The Algorithm Design Manual。這兩本齣自名傢之手的教材和很多教材一樣,按照算法的類型或者背後的設計思路來組織內容。這是教材應該做的,“授人以魚不如授人以漁”,傳授思路而不是算法本身是教材的寫作目的。可是算法有意思的地方首先在於算法本身,因為算法是為瞭解決實際問題而設計的,所以讓大傢認識到算法奧妙的自然順序應該是先展示有趣的問題,再展示優雅的算法,結尾歸納設計思路。而這正是《算法的樂趣》吸引人的地方。
“我曾經以為從樂趣齣發闡述算法的書會從西方發芽,沒想到先看到瞭一本中文書。這真超齣瞭我的預料。”
——王益,LinkedIn高級主任分析師
★“這本書給我的驚喜是沒有像一般的算法書一樣單純地去講算法和數據結構本身,那樣無論語言多風趣,隻要一談到關鍵的問題也會馬上變得無趣起來。作者在每一章都舉給齣瞭一個實際的問題,然後嘗試用算法去解決這個問題,沒有局限於通用類算法,而是同時涵蓋邏輯類算法、通用類算法和專業類算法,真正是在訓練讀者解決問題的能力,而解決問題的能力,正是任何一傢公司所需人纔的核心的技能。”
——黃鑫((飛林沙)),極光推送首席科學傢
★“如果說《啊哈!算法》是算法界的小白書,內容太少看得不過癮,那麼這本《算法的樂趣》或許可以帶你一起牛逼一起飛。當我剛拿到書的目錄的時候,我就很期待,因為終於有一本算法書可以係統地和大夥說一說這些我也很想與大夥說的偉大算法。”
——啊哈磊,《啊哈!算法》作者
目錄
第1章 程序員與算法
1.1 什麼是算法
1.2 程序員必須要會算法嗎
1.2.1 一個隊列引發的慘案
1.2.2 我的第一個算法
1.3 算法的樂趣在哪裏
1.4 算法與代碼
1.5 總結
1.6 參考資料
第2章 算法設計的基礎
2.1 程序的基本結構
2.1.1 順序執行
2.1.2 循環結構
2.1.3 分支和跳轉結構
2.2 算法實現與數據結構
2.2.1 基本數據結構在算法設計中的應用
2.2.2 復雜數據結構在算法設計中的應用
2.3 數據結構和數學模型與算法的關係
2.4 總結
2.5 參考資料
第3章 算法設計的常用思想
3.1 貪婪法
3.1.1 貪婪法的基本思想
3.1.2 貪婪法的例子:0-1 背包問題
3.2 分治法
3.2.1 分治法的基本思想
3.2.2 遞歸和分治,一對好朋友
3.2.3 分治法的例子:大整數Karatsuba 乘法算法
3.3 動態規劃
3.3.1 動態規劃的基本思想
3.3.2 動態規劃法的例子:字符串的編輯距離
3.4 解空間的窮舉搜索
3.4.1 解空間的定義
3.4.2 窮舉解空間的策略
3.4.3 窮舉搜索的例子:Google 方程式
3.5 總結
3.6 參考資料
第4章 阿拉伯數字與中文數字
4.1 中文數字的特點
4.1.1 中文數字的權位和小節
4.1.2 中文數字的零
4.2 阿拉伯數字轉中文數字
4.2.1 一個轉換示例
4.2.2 轉換算法設計
4.2.3 算法實現
4.2.4 中文大寫數字
4.3 中文數字轉阿拉伯數字
4.3.1 轉換的基本方法
4.3.2 算法實現
4.4 數字轉換的測試用例
4.5 總結
4.6 參考資料
第5章 三個水桶等分8 升水的問題
5.1 問題與求解思路
5.2 建立數學模型
5.2.1 狀態的數學模型與狀態樹
5.2.2 倒水動作的數學模型
5.3 搜索算法
5.3.1 狀態樹的遍曆
5.3.2 剪枝和重復狀態判斷
5.4 算法實現
5.5 總結
5.6 參考資料
第6章 妖怪與和尚過河問題
6.1 問題與求解思路
6.2 建立數學模型
6.2.1 狀態的數學模型與狀態樹
6.2.2 過河動作的數學模型
6.3 搜索算法
6.3.1 狀態樹的遍曆
6.3.2 剪枝和重復狀態判斷
6.4 算法實現
6.5 總結
6.6 參考資料
第7章 穩定匹配與舞伴問題
7.1 穩定匹配問題
7.1.1 什麼是穩定匹配
7.1.2 Gale-Shapley 算法原理
7.2 Gale-Shapley 算法的應用實例
7.2.1 算法實現
7.2.2 改進優化:空間換時間
7.3 有多少穩定匹配
7.3.1 窮舉所有的完美匹配
7.3.2 不穩定因素的判斷算法
7.3.3 窮舉的結果
7.4 二部圖與二分匹配
7.4.1 最大匹配與匈牙利算法
7.4.2 帶權匹配與Kuhn-Munkres算法
7.5 總結
7.6 參考資料
第8章 愛因斯坦的思考題
8.1 問題的答案
8.2 分析問題的數學模型
8.2.1 基本模型定義
8.2.2 綫索模型定義
8.3 算法設計
8.3.1 窮舉所有的組閤結果
8.3.2 利用綫索判定結果的正確性
8.4 總結
8.5 參考資料
第9章 項目管理與圖的拓撲排序
9.1 AOV 網和AOE 網
9.2 拓撲排序
9.2.1 拓撲排序的基本過程
9.2.2 按照活動開始時間排序
9.3 關鍵路徑算法
9.3.1 什麼是關鍵路徑
9.3.2 計算關鍵路徑的算法
9.4 總結
9.5 參考資料
第10章 RLE 壓縮算法與PCX 圖像文件格式
10.1 RLE 壓縮算法
10.1.1 連續重復數據的處理
10.1.2 連續非重復數據的處理
10.1.3 算法實現
10.2 RLE 與PCX 圖像文件格式
10.2.1 PCX 圖像文件格式
10.2.2 PCX_RLE 算法
10.2.3 256 色PCX 文件的解碼和顯示
10.3 總結
10.4 參考資料
第11章 算法與曆法
11.1 格裏曆(公曆)生成算法
11.1.1 格裏曆的曆法規則
11.1.2 今天星期幾
11.1.3 生成日曆的算法
11.1.4 日曆變更那點事兒
11.2 二十四節氣的天文學計算
11.2.1 二十四節氣的起源
11.2.2 二十四節氣的天文學定義
11.2.3 VSOP-82/87 行星理論
11.2.4 誤差修正--章動
11.2.5 誤差修正--光行差
11.2.6 用牛頓迭代法計算二十四節氣
11.3 農曆朔日(新月)的天文學計算
11.3.1 日月閤朔的天文學定義
11.3.2 ELP-2000/82 月球理論
11.3.3 誤差修正--地球軌道離心率修正
11.3.4 誤差修正--黃經攝動
11.3.5 月球地心視黃經和最後的修正--地球章動
11.3.6 用牛頓迭代法計算日月閤朔
11.4 農曆的生成算法
11.4.1 中國農曆的起源與曆法規則
11.4.2 中國農曆的推算
11.4.3 一個簡單的"年曆"
11.5 總結
11.6 參考資料
第12章 實驗數據與麯綫擬閤
12.1 麯綫擬閤
12.1.1 麯綫擬閤的定義
12.1.2 簡單綫性數據擬閤的例子
12.2 最小二乘法麯綫擬閤
12.2.1 最小二乘法原理
12.2.2 高斯消元法求解方程組
12.2.3 最小二乘法解決"速度與加速度"實驗
12.3 三次樣條麯綫擬閤
12.3.1 插值函數
12.3.2 樣條函數的定義
12.3.3 邊界條件
12.3.4 推導三次樣條函數
12.3.5 追趕法求解方程組
12.3.6 三次樣條麯綫擬閤算法實現
12.3.7 三次樣條麯綫擬閤的效果
12.4 總結
12.5 參考資料
第13章 非綫性方程與牛頓迭代法
13.1 非綫性方程求解的常用方法
13.1.1 公式法
13.1.2 二分逼近法
13.2 牛頓迭代法的數學原理
13.3 用牛頓迭代法求解非綫性方程的實例
13.3.1 導函數的求解與近似公式
13.3.2 算法實現
13.4 參考資料
第14章 計算幾何與計算機圖形學
14.1 計算幾何的基本算法
14.1.1 點與矩形的關係
14.1.2 點與圓的關係
14.1.3 矢量的基礎知識
14.1.4 點與直綫的關係
14.1.5 直綫與直綫的關係
14.1.6 點與多邊形的關係
14.2 直綫生成算法
14.2.1 什麼是光柵圖形掃描轉換
14.2.2 數值微分法
14.2.3 Bresenham 算法
14.2.4 對稱直綫生成算法
14.2.5 兩步算法
14.2.6 其他直綫生成算法
14.3 圓生成算法
14.3.1 圓的八分對稱性
14.3.2 中點畫圓法
14.3.3 改進的中點畫圓法--Bresenham 算法
14.3.4 正負判定畫圓法
14.4 橢圓生成算法
14.4.1 中點畫橢圓法
14.4.2 Bresenham 橢圓算法
14.5 多邊形區域填充算法
14.5.1 種子填充算法
14.5.2 掃描綫填充算法
14.5.3 改進的掃描綫填充算法
14.5.4 邊界標誌填充算法
14.6 總結
14.7 參考資料
第15章 音頻頻譜和均衡器與傅裏葉變換算法
15.1 實時頻譜顯示的原理
15.2 離散傅裏葉變換
15.2.1 什麼是傅裏葉變換
15.2.2 傅裏葉變換原理
15.2.3 快速傅裏葉變換算法的實現
15.3 傅裏葉變換與音頻播放的實時頻譜顯示
15.3.1 頻域數值的特點分析
15.3.2 從音頻數據到功率頻譜
15.3.3 音頻播放時實時頻譜顯示的例子
15.4 破解電話號碼的小把戲
15.4.1 撥號音的頻譜分析
15.4.2 根據頻譜數據反推電話號碼
15.5 離散傅裏葉逆變換
15.5.1 快速傅裏葉逆變換的推導
15.5.2 快速傅裏葉逆變換的算法實現
15.6 利用傅裏葉變換實現頻域均衡器
15.6.1 頻域均衡器的實現原理
15.6.2 頻域信號的增益與衰減
15.6.3 均衡器的實現--仿Foobar的18 段均衡器
15.7 總結
15.8 參考資料
第16章 全局最優解與遺傳算法
16.1 遺傳算法的原理
16.1.1 遺傳算法的基本概念
16.1.2 遺傳算法的處理流程
16.2 遺傳算法求解0-1 背包問題
16.2.1 基因編碼和種群初始化
16.2.2 適應度函數
16.2.3 選擇算子設計與輪盤賭算法
16.2.4 交叉算子設計
16.2.5 變異算子設計
16.2.6 這就是遺傳算法
16.3 總結
16.4 參考資料
第17章 計算器程序與大整數計算
17.1 哦,溢齣瞭,齣洋相的計算器程序
17.2 大整數計算的原理
17.2.1 大整數加法
17.2.2 大整數減法
17.2.3 大整數乘法
17.2.4 大整數除法與模
17.2.5 大整數乘方運算
17.3 大整數類的使用
17.3.1 與Windows的計算器程序一決高下
17.3.2 最大公約數和最小公倍數
17.3.3 用擴展歐幾裏得算法求模的逆元
17.4 總結
17.5 參考資料
第18章 RSA 算法--加密與簽名
18.1 RSA 算法的開胃菜
18.1.1 將模冪運算轉化為模乘運算
18.1.2 模乘運算與濛哥馬利算法
18.1.3 模冪算法
18.1.4 素數檢驗與米勒-拉賓算法
18.2 RSA 算法原理
18.2.1 RSA 算法的數學理論
18.2.2 加密和解密算法
18.2.3 RSA 算法的安全性
18.3 數據塊分組加密
18.3.1 字節流與大整數的轉換
18.3.2 PCKS 與OAEP 加密填充模式
18.3.3 數據加密算法實現
18.3.4 數據解密算法實現
18.4 RSA 簽名與身份驗證
18.4.1 RSASSA-PKCS 與RSASSAPSS簽名填充模式
18.4.2 簽名算法實現
18.4.3 驗證簽名算法實現
18.5 總結
18.6 參考資料
第19章 數獨遊戲
19.1 數獨遊戲的規則與技巧
19.1.1 數獨遊戲的規則
19.1.2 數獨遊戲的常用技巧
19.2 計算機求解數獨問題
19.2.1 建立問題的數學模型
19.2.2 算法實現
19.2.3 與傳統窮舉方法的結果對比
19.3 關於數獨的趣味話題
19.3.1 數獨遊戲有多少終盤
19.3.2 史上最難的數獨遊戲
19.4 總結
19.5 參考資料
第20章 華容道遊戲
20.1 華容道遊戲介紹
20.2 自動求解的算法原理
20.2.1 定義棋盤的局麵
20.2.2 算法思路
20.3 自動求解的算法實現
20.3.1 棋局狀態與Zobrist 哈希算法
20.3.2 重復棋局和左右鏡像的處理
20.3.3 正確結果的判斷條件
20.3.4 武將棋子的移動
20.3.5 棋局的搜索算法
20.4 總結
20.5 參考資料
第21章 A*尋徑算法
21.1 尋徑算法演示程序
21.2 Dijkstra 算法
21.2.1 Dijkstra 算法原理
21.2.2 Dijkstra 算法實現
21.2.3 Dijkstra 算法演示程序
21.3 帶啓發的搜索算法--A*算法
21.3.1 A*算法原理
21.3.2 常用的距離評估函數
21.3.3 A*算法實現
21.4 總結
21.5 參考資料
第22章 俄羅斯方塊遊戲
22.1 俄羅斯方塊遊戲規則
22.2 俄羅斯方塊遊戲人工智能的算法原理
22.2.1 影響評價結果的因素
22.2.2 常用的俄羅斯方塊遊戲人工智能算法
22.2.3 Pierre Dellacherie 評估算法
22.3 Pierre Dellacherie 算法實現
22.3.1 基本數學模型和數據結構定義
22.3.2 算法實現
22.4 總結
22.5 參考資料
第23章 博弈樹與棋類遊戲
23.1 棋類遊戲的AI
23.1.1 博弈與博弈樹
23.1.2 極大極小值搜索算法
23.1.3 負極大極搜索算法
23.1.4 "α-β"剪枝算法
23.1.5 估值函數
23.1.6 置換錶與哈希函數
23.1.7 開局庫與終局庫
23.2 井字棋--最簡單的博弈遊戲
23.2.1 棋盤與棋子的數學模型
23.2.2 估值函數與估值算法
23.2.3 如何産生走法(落子方法)
23.3 奧賽羅棋(黑白棋)
23.3.1 棋盤與棋子的數學模型
23.3.2 估值函數與估值算法
23.3.3 搜索算法實現
23.3.4 最終結果
23.4 五子棋
23.4.1 棋盤與棋子的數學模型
23.4.2 估值函數與估值算法
23.4.3 搜索算法實現
23.4.4 最終結果
23.5 總結
23.6 參考資料
附錄A 算法設計的常用技巧
A.1 數組下標處理
A.2 一重循環實現兩重循環的功能
A.3 棋盤(迷宮)類算法方嚮遍曆
A.4 代碼的一緻性處理技巧
A.5 鏈錶和數組的配閤使用
A.6 "以空間換時間"的常用技巧
A.7 利用錶驅動避免長長的switch-case
附錄B 一個棋類遊戲的設計框架
B.1 代碼框架的整體結構
B.2 代碼框架的使用方法
前言/序言
程序員與算法,這是一個永恒的話題,無論在哪個論壇,隻要齣現此類主題的帖子,一定會看到兩種針鋒相對的觀點的“激烈碰撞”。其實泡過論壇的人都知道,兩種觀點“激烈辯論”的慘烈程度往往可以上升到互相問候先人的高度,即使是技術論壇也不例外。在準備此書之前,我在博客的“算法係列”專欄已經陸陸續續地寫瞭有一年多的時間,在此期間,不斷有讀者問我:“程序員必須會算法嗎?”我實在不想讓我的博客成為噴滿各種口水的是非之地,所以一般不正麵迴答,隻是籠統地說些“各行各業情況都不盡相同”之類的話,避免站隊。
算法的樂趣 下載 mobi epub pdf txt 電子書 格式