常用算法深入學習實錄

圖書簡介

常用算法深入學習實錄(DVD光碟1)
張子言等編著
ISBN 978-7-121-21323-6
2013年10月出版
定價:89.00元
516頁
16開

內容提要

對於任何一門程式語言來說,算法都是程式的“靈魂”。正是因為算法如此重要,所以筆者精心編寫了本書,希望通過書中的內容引領廣大讀者一起探討學習算法的奧秘,帶領廣大讀者真正步入程式開發的高級世界。
本書共分15章,循序漸進、由淺入深地詳細講解算法的核心內容,並通過具體實例的實現過程演練各個知識點的具體用法。本書首先詳細講解算法的基礎知識,剖析了將算法稱為“程式靈魂”的原因。然後詳細講解算法技術的核心內容,主要包括八大算法思想、數據結構、樹、圖、查找、內部排序、外部排序和檔案等知識點的具體用法。接下來通過具體實例詳細講解各種算法經典問題的解決方案,主要包括解決經典的數據結構問題、解決數學問題、解決趣味問題、解決圖像問題和解決奧賽問題的具體方案等。另外,書中還講解了算法技術在現實編程項目中的作用和具體用法。

書錄

第1章都說算法是程式的“靈魂” 1
1.1開始學習算法 1
1.1.1算法的特徵和發展由來 1
1.1.2何為算法 2
1.2計算機中的算法 3
1.2.1認識計算機中的算法 3
1.2.2為什麼是程式的“靈魂” 4
1.3表示算法的方法 4
1.3.1用流程圖來表示算法 5
1.3.2用N-S流程圖來表示算法6
1.3.3用計算機語言表示算法 7
1.4學好算法的秘訣 8
第2章分析妙趣橫生的算法思想 9
2.1八大算法思想 9
2.2比較“笨”的枚舉算法思想 9
2.2.1枚舉算法基礎 10
2.2.2實踐演練 10
2.3聰明一點的遞推算法思想 15
2.3.1遞推算法基礎 15
2.3.2實踐演練 15
2.4充分利用自己的遞歸算法思想 18
2.4.1遞歸算法基礎 18
2.4.2實踐演練 18
2.5各個擊破的分治算法思想 22
2.5.1分治算法基礎 23
2.5.2實踐演練 23
2.6貪心算法思想並不貪婪 29
2.6.1貪心算法基礎 29
2.6.2實踐演練 30
2.7試探法算法思想是一種委婉的做法 35
2.7.1試探法算法基礎 35
2.7.2實踐演練 36
2.8疊代算法 39
2.8.1疊代算法基礎 40
2.8.2實踐演練 40
2.9模擬算法思想 42
2.9.1模擬算法的思路 42
2.9.2實踐演練 42
第3章走在算法的路上之——分析簡單的數據結構 47
3.1學習編程的注意事項 47
3.2什麼是線性表 47
3.2.1線性表的特性 48
3.2.2順序表操作 49
3.2.3鍊表操作 60
3.3守規矩的先進先出的佇列 74
3.3.1佇列基礎 74
3.3.2鏈佇列和循環佇列 75
3.3.3佇列的基本操作 75
3.3.4佇列的鏈式存儲 76
3.4後進先出的棧 83
3.4.1什麼是棧 83
3.4.2棧的基本分類 84
3.4.3實踐演練 87
第4章走在算法的路上之——樹 91
4.1樹引發的關係 91
4.1.1樹的概念 92
4.1.2何謂二叉樹 94
4.1.3二叉樹存儲 96
4.1.4操作二叉樹 99
4.1.5遍歷二叉樹 102
4.1.6測試二叉樹 106
4.1.7線索二叉樹 113
4.1.8線索二叉樹的表示 113
4.1.9實踐演練線索二叉樹的操作 116
4.2霍夫曼樹 121
4.2.1霍夫曼樹基礎 121
4.2.2實踐演練 123
第5章走在算法的路上之——圖 131
5.1從哥尼斯堡七橋問題說起 131
5.2幾個相關概念 132
5.3存儲結構 136
5.3.1表示頂點之間相鄰關係的鄰接矩陣 137
5.3.2鄰接表 138
5.3.3合作的產物——十字鍊表 141
5.3.4實踐演練 143
5.4遍歷圖 148
5.4.1深度優先搜尋 148
5.4.2廣度優先搜尋 151
5.4.3遍歷算法的那點事 155
5.4.4測試圖的遍歷實例 157
5.5圖的連通性 160
5.5.1無向圖的連通分量 161
5.5.2最小生成樹 161
5.5.3關鍵路徑 165
5.6尋求最短的路徑 170
5.6.1求某一頂點到其他各頂點的最短路徑 170
5.6.2任意一對頂點間的最短路徑 174
第6章體驗查找算法帶來的魅力 179
6.1幾個相關概念 179
6.2基於線性表的查找法 180
6.2.1順序查找法 180
6.2.2折半查找法 183
6.2.3分塊查找法 186
6.3基於樹的查找 188
6.3.1二叉排序樹 188
6.3.2平衡二叉排序樹 203
6.4哈希法 209
6.4.1哈希法基礎 209
6.4.2處理衝突 211
6.4.3哈希表的查找過程 212
6.5索引查找 215
6.5.1索引查找的過程 215
6.5.2實踐演練 215
第7章內部排序 220
7.1排序基礎 220
7.1.1排序的目的和過程 220
7.1.2內部排序與外部排序 221
7.1.3穩定排序與不穩定排序 221
7.2霸道的插入排序 222
7.2.1直接插入排序 222
7.2.2折半插入排序 225
7.2.3表插入排序 226
7.2.4希爾排序 227
7.3交換類排序法 230
7.3.1冒泡排序(相鄰比序法) 231
7.3.2快速排序 232
7.4選擇類排序法 237
7.4.1直接選擇排序 237
7.4.2樹形選擇排序 238
7.4.3堆排序 239
7.4.4實踐演練 242
7.5歸併排序 245
7.5.1歸併排序思想 245
7.5.2二路歸併算法的思路 246
7.5.3實現歸併排序 248
7.5.4實踐演練 250
7.6基數排序 253
7.6.1多關鍵字排序 253
7.6.2鏈式基數排序 254
第8章外部排序和檔案 258
8.1外部信息方便了我們的生活 258
8.1.1磁帶存儲器 258
8.1.2磁碟存儲器 259
8.2外部排序的基本方法 261
8.2.1磁碟排序 261
8.2.2磁帶排序 266
8.3什麼是檔案 268
8.4檔案的組織方式 270
8.4.1順序檔案 270
8.4.2索引檔案 270
8.4.3ISAM檔案 271
8.4.4VSAM檔案273
8.4.5散列檔案 275
8.4.6多關鍵字檔案 275
第9章從應聘開始談算法 277
9.1面試 277
9.1.1面試前的準備 277
9.1.2常見的面試錯誤 278
9.2常見的算法筆試題 279
第10章經典的數據結構問題 303
10.1約瑟夫環 303
10.2大整數運算306
10.2.1數組實現大整數運算 306
10.2.2使用鍊表實現大整數運算 315
10.3計算機進制轉換321
10.4將中序表達式轉換為後序表達式 325
第11章解決數學問題 331
11.1最大公約數和最低公倍數331
11.2哥德巴赫猜想 333
11.3完全數336
11.4親密數338
11.5自守數340
11.6方程求解 341
11.6.1高斯消元法解方程組 342
11.6.2用二分法解非線性方程346
11.6.3用牛頓疊代法解非線性方程346
11.7矩陣運算 348
11.8一元多項式運算352
11.8.1一元多項式的加法運算352
11.8.2一元多項式的減法運算357
第12章解決趣味問題 366
12.1歌星大獎賽366
12.2借書方案 367
12.3打魚還是曬網 368
12.4捕魚和分魚370
12.5出售金魚 371
12.6平分七筐魚372
12.7繩子的長度和井深 373
12.8雞兔同籠 375
12.9漢諾塔376
12.9.1遞歸法 376
12.9.2非遞歸法378
12.10 馬踏棋盤 380
12.10.1使用循環查找法 380
12.10.2使用遞歸法 384
12.10.3使用棧方法 386
12.11 三色球問題390
12.12 新郎和新娘問題391
12.13 計算年齡幾何 394
第13章解決圖像問題 395
13.1八皇后問題395
13.1.1使用遞歸法 395
13.1.2使用循環法 398
13.2生命遊戲 401
13.3黑白棋問題406
13.4騎士迷宮問題 415
13.5 迷宮中的所有路徑 422
第14章算法的經典問題 425
14.1存錢利息最大化425
14.2背包問題 428
14.2.1使用動態規劃法 429
14.2.2使用遞歸法 434
14.3農夫過河 437
14.4三色旗440
14.5取石子443
14.6停車場管理447
14.7約瑟夫生者死者遊戲456
第15章解決奧賽問題 459
15.1孿生素數問題 459
15.2百錢買百雞問題461
15.3馬克思手稿中的數學題 463
15.4正整數分解為質因數464
15.5水仙花數 465
15.6素數 466
15.6.1求1000以內的所有素數 466
15.6.2求1000以內的回文素數 467
15.6.3求1000以內的平方迴文數 469
15.7階乘 470
15.7.1使用遞歸法 470
15.7.2實現大數的階乘 471
15.8青蛙過河 477
15.9過河卒481
15.10 素數組合 484
15.11 校驗碼問題487
15.12 老師排座位488
15.13 模擬立體圖491
15.14 採藥問題 495
15.15 等價表達式問題497
15.16 購買年貨問題 501

前言

可以將算法理解為由基本運算及規定的運算順序所構成的完整解題步驟;或者看成按照要求設計好的有限的確切計算序列,並且這樣的步驟和序列可以解決一類問題。對於任何一門程式語言來說,算法都是“程式”的靈魂。
算法還重要嗎
我們先不要給算法是否還重要輕易地下一個結論,先來看看一種現象:哪種語言是開發者們可以高高興興地用來編程的?在當前的市面中,基本上每個月都會有一些對語言使用程度做的排名。其實,程式語言又能體現出算法的相關價值。也許你掌握了好幾種語言,但隨著工作時間的增加和對技術的深入研究,你會發現:不是具體的技術而是算法這些基本的東西成為技術深入的“軟肋”,特別是在緊要關口,這個“軟肋”往往就會更疼。
到目前為止,筆者認為自己工作中創造性東西比以前少了很多。很多算法已經被包裝到了語言和工具中, 作為一個開發者,也就不像以前那樣費力地去學習了。而往往有些算法只適用於本語言或工具,而且只能解決某些問題,移植到別的情況下則無法使用。筆者也是在開始學習C語言後才感到算法適用範圍有所不同。而最為彆扭的是,你發現以前在用ASPNET和Visual Studio開發工具中對於有些問題已經界定好了思路。人都是懶惰的,既然有現成的東西可用,為何要費力去創新?這也就導致了長期使用單一編程環境的開發者視野上比較狹隘。開發者很難有屬於自己的思維方式,這就是有些人說自己做到一定程度後成了熟練“代碼工人”的原因。
Ruby之父松本行弘就曾表示,注重的是算法而不是工具。如果沒有自己的思維方式和編程邏輯,很容易對某種具體的技術或者工具產生依賴性,而這些編程工具和技術往往是國外開發的。假設有一天我們沒有這些現成的工具和技術該怎么辦?豈不是一窮二白了嗎?但是如果有了穩固的算法,思維編程世界裡的東西都不可怕。
本書的內容
全書採用故事性與趣味性相結合的講解方式,還穿插了學習技巧和職場生存法則,講解了程式設計師所必須掌握的基本素養;並且緊跟時代潮流,講解了算法技術在現實編程項目中的作用和具體用法。

相關詞條

熱門詞條

聯絡我們