基本信息
輕鬆學算法——網際網路算法面試寶典
作 譯 者:趙燁
出版時間:2016-07
千 字 數:500
版 次:01-01
頁 數:412
開 本:16開
I S B N :9787121291944
內容簡介
本書共分為12個章節,首先介紹了一些基礎的數據結構,以及常用的排序算法和查找算法;其次介紹了兩個稍微複雜一些的數據結構——樹和圖,還介紹了每種數據結構和算法的適用場景,之後是一些在工作與面試中的實際套用,以字元串、數組、查找等為例介紹了一些常見的網際網路面試題及分析思路,便於讀者了解這些思路,順利地通過網際網路公司的面試;最後介紹了一些常見的算法思想,便於讀者對今後遇到的算法問題更輕易地想出解決方案。本書的講解輕鬆有趣,易於讀者把煩瑣、枯燥的算法學習變為有趣、愉快的學習,把被動學習變為主動學習。本書也介紹了一些會在工作面試中用到的算法。對於一些正在學習算法的人來說,本書絕對是可以幫你輕鬆掌握算法的輔助資料;對於已經了解算法的人來說,可以從本書中了解到這些算法是如何在實際工作中使用的。本書適合即將畢業的學生、初入職場的工程師及想補充基礎算法知識的人學習,也適合作為一本網際網路公司面試的參考書,更是一本不可多得的便於讀者時常補習算法知識的收藏寶典。
目錄信息
第1章 數組、集合和散列表 1
1.1 要用就要提前想好的數據結構—數組 2
1.1.1 什麼是數組 2
1.1.2 數組的存儲結構 3
1.1.3 數組的特點 6
1.1.4 數組的適用場景 7
1.2 升級版數組—集合 8
1.2.1 什麼是集合 8
1.2.2 集合的實現 8
1.2.3 集合的特點 13
1.2.4 集合的適用場景 13
1.2.5 數組與變長數組的性能 14
1.3 數組的其他套用—散列表 14
1.3.1 什麼是散列表 15
1.3.2 對散列表函式產生衝突的解決辦法 16
1.3.3 散列表的存儲結構 17
1.3.4 散列表的特點 18
1.3.5 散列表的適用場景 20
1.3.6 散列表的性能分析 21
1.4 小結 28
第2章 棧、佇列、鍊表 29
2.1 漢諾塔遊戲—棧 30
2.1.1 什麼是漢諾塔 30
2.1.2 什麼是棧 31
2.1.3 棧的存儲結構 31
2.1.4 棧的特點 36
2.1.5 棧的適用場景 36
2.2 火爆的奶茶店—佇列 37
2.2.1 什麼是佇列 37
2.2.2 佇列的存儲結構 38
2.2.3 佇列的特點 43
2.2.4 佇列的適用場景 44
2.3 用棧實現佇列 45
2.3.1 用兩個棧實現佇列 46
2.3.2 兩個佇列實現棧 50
2.4 鍊表 53
2.4.1 什麼是鍊表 54
2.4.2 鍊表的存儲結構 54
2.4.3 鍊表的操作 55
2.4.4 鍊表的特點 66
2.4.5 鍊表的適用場景 66
2.4.6 鍊表的性能分析 67
2.4.7 面試舉例:如何反轉鍊表 68
2.5 鍊表其實也可以用數組模擬 69
2.5.1 靜態鍊表 70
2.5.2 靜態鍊表的實現 70
2.5.3 靜態鍊表的特點 80
2.6 再談漢諾塔 81
2.6.1 漢諾塔的移動原理 81
2.6.2 漢諾塔的遞歸實現 82
第3章 排序算法 84
3.1 算法基礎 85
3.1.1 時間複雜度 85
3.1.2 空間複雜度 88
3.1.3 穩定性 88
3.2 快而簡單的排序—桶排序 89
3.2.1 舉個例子 89
3.2.2 什麼是桶排序 90
3.2.3 桶排序的實現 90
3.2.4 桶排序的性能及特點 92
3.2.5 桶排序的適用場景 93
3.3 咕嘟咕嘟的冒泡排序 94
3.3.1 什麼是冒泡排序 94
3.3.2 冒泡排序的原理 94
3.3.3 冒泡排序的實現 96
3.3.4 冒泡排序的特點及性能 99
3.3.5 冒泡排序的適用場景 99
3.3.6 冒泡排序的改進方案 100
3.4 最常用的快速排序 100
3.4.1 什麼是快速排序 101
3.4.2 快速排序的原理 101
3.4.3 快速排序的實現 105
3.4.4 快速排序的特點及性能 107
3.4.5 快速排序的適用場景 108
3.4.6 快速排序的最佳化 108
3.5 簡單的插入排序 109
3.5.1 什麼是插入排序 110
3.5.2 插入排序的原理 110
3.5.3 插入排序的實現 112
3.5.4 插入排序的特點及性能 114
3.5.5 插入排序的適用場景 115
3.6 直接插入的改進—希爾排序 115
3.6.1 什麼是希爾排序 116
3.6.2 希爾排序的原理 116
3.6.3 希爾排序的實現 118
3.6.4 希爾排序的特點及性能 120
3.6.5 希爾排序的適用場景 121
3.7 簡單選擇排序 121
3.7.1 什麼是選擇排序 122
3.7.2 簡單選擇排序的原理 122
3.7.3 簡單選擇排序的實現 123
3.7.4 選擇排序的特點及性能 125
3.7.5 簡單選擇排序的最佳化 125
3.7.6 選擇排序的適用場景 126
3.8 小結 126
第4章 搜尋,沒那么難 128
4.1 最先想到的—順序查找 129
4.1.1 最先想到的 129
4.1.2 順序查找的原理與實現 129
4.1.3 順序查找的特點及性能分析 131
4.1.4 順序查找的適用場景 132
4.2 能不能少查點—二分查找 133
4.2.1 某些特殊情況的查找需求 133
4.2.2 二分查找的原理及實現 133
4.2.3 二分查找的最佳化 137
4.2.4 二分查找的特點及性能分析 138
4.2.5 二分查找的適用場景 139
4.2.6 我是來還債的—之前欠的二分插入排序 139
4.3 行列遞增的矩陣查找—二分查找思維拓展 141
4.3.1 一道題 142
4.3.2 幾個解法 142
4.3.3 其他拓展 153
4.4 分塊查找 154
4.4.1 每次插入元素都要有序嗎 154
4.4.2 什麼是分塊查找 155
4.4.3 分塊查找的原理及實現 155
4.4.4 分塊查找的特點與性能分析 159
4.4.5 分塊查找的適用場景 160
4.5 查找算法小結 161
4.6 搜尋引擎與倒排索引 162
4.6.1 什麼是搜尋引擎 162
4.6.2 倒排索引 162
4.6.3 索引實例 163
4.6.4 倒排索引的關鍵字提取 164
4.6.5 商業索引的其他拓展 164
第5章 樹 166
5.1 樹的定義及存儲結構 167
5.1.1 什麼是樹 167
5.1.2 其他相關術語 168
5.1.3 都有哪些樹 170
5.1.4 樹的存儲結構及實現 170
5.2 二叉樹 173
5.2.1 什麼是二叉樹 173
5.2.2 還有兩種特殊的二叉樹 173
5.2.3 二叉樹的實現 175
5.2.4 二叉樹的遍歷 185
5.2.5 完全二叉樹 187
5.3 二叉樹的查找算法 188
5.3.1 二叉查找樹 188
5.3.2 平衡二叉樹 198
5.4 B-樹、B+樹 202
5.4.1 什麼是B-樹 203
5.4.2 什麼是B+樹 204
5.4.3 B-樹、B+樹的特點及性能分析 205
5.5 在MySQL資料庫中是如何套用B+樹的 206
5.6 哈夫曼樹 209
5.6.1 幾個術語 209
5.6.2 什麼是哈夫曼樹 209
5.6.3 哈夫曼樹的構造 211
5.6.4 哈夫曼編碼及解碼 213
5.7 堆 215
5.7.1 什麼是堆 215
5.7.2 堆的基本操作 216
5.7.3 堆的性能分析 221
5.7.4 堆排序 222
5.8 紅黑樹 224
5.8.1 什麼是紅黑樹 224
5.8.2 紅黑樹的特點與優勢 224
第6章 圖 226
6.1 圖的定義及相關術語 227
6.1.1 什麼是圖 227
6.1.2 圖的分類 227
6.1.3 圖的相關術語 228
6.2 圖的表示與存儲方式 229
6.2.1 鄰接矩陣 229
6.2.2 鄰接表 234
6.3 更多的圖 237
6.3.1 連通圖 238
6.3.2 強連通圖 238
6.4 深度優先遍歷與廣度優先遍歷 238
6.4.1 深度優先遍歷 239
6.4.2 廣度優先遍歷 248
6.4.3 兩種遍歷方法的對比 253
6.5 最短路徑 254
6.5.1 帶權圖 254
6.5.2 Dijkstra算法 255
6.5.3 Floyd算法 269
第7章 字元串 272
7.1 字元及字元串簡介 273
7.1.1 什麼是字元 273
7.1.2 什麼是字元串 273
7.2 字元的全排列 275
7.2.1 問題描述及分析 275
7.2.2 最先想到的 275
7.2.3 利用字典序排列 278
7.3 反轉字元串 283
7.3.1 問題描述及分析 283
7.3.2 最先想到的 283
7.3.3 對換反轉法 285
7.3.4 拓展—旋轉字元串 287
7.4 判斷回文 288
7.4.1 問題描述及分析 288
7.4.2 對半判斷 289
7.5 尋找最大的回文子串 290
7.5.1 問題描述及分析 290
7.5.2 遍歷實現 291
7.6 將字元串轉換為數字 293
7.6.1 問題描述及分析 293
7.6.2 解決 293
7.7 判斷字元串包含的問題 297
7.7.1 問題描述及分析 297
7.7.2 非常簡單的解決思路 297
7.7.3 利用排序進行最佳化 299
7.7.4 投機取巧的素數方案 302
7.7.5 用散列表進行實現 304
7.7.6 用位運算進行實現 305
第8章 數組還有好多玩法 308
8.1 從數組中找出其和為指定值的兩個數 309
8.1.1 問題描述及分析 309
8.1.2 最簡單的辦法 309
8.1.3 一切為了速度 310
8.1.4 排序總是好的選擇 311
8.1.5 還能更好 313
8.2 找出連加值最大的子數組 315
8.2.1 問題描述及分析 315
8.2.2 暴力窮舉法 316
8.2.3 動態規劃法 319
8.2.4 問題拓展 321
8.3 數組正負值排序 323
8.3.1 問題描述及分析 323
8.3.2 最直觀的解法 324
8.3.3 借鑑簡單插入排序 325
8.3.4 借鑑快速排序 327
8.3.5 拓展 329
8.4 將數組隨機打亂順序 329
8.4.1 問題描述及分析 329
8.4.2 隨便糊弄一下 330
8.4.3 插入排序的思想又來了 331
8.5 數組賦值 333
8.5.1 問題描述及分析 333
8.5.2 分解計算 333
8.6 尋找旋轉數組的拐點 335
8.6.1 問題描述及分析 335
8.6.2 最簡單的方法 336
8.6.3 利用“有序” 337
8.7 荷蘭國旗問題 339
8.7.1 問題描述及分析 339
8.7.2 排序法 340
8.7.3 快速排序帶給人的靈感 340
第9章 查找又來了 344
9.1 出現次數超過一半的數字 345
9.1.1 問題描述及分析 345
9.1.2 排序法 345
9.1.3 散列表 347
9.1.4 刪除法 349
9.1.5 更優的解法 349
9.2 尋找缺少的數字 352
9.2.1 問題描述及分析 352
9.2.2 藉助快速排序 352
9.2.3 藉助散列表實現 354
9.2.4 投機取巧法 355
9.2.5 思路拓展 357
9.3 在10億個數中找出最大的1萬個數 357
9.3.1 問題描述及分析 357
9.3.2 拍腦袋想問題 358
9.3.3 藉助快速排序 358
9.3.4 不想都放入記憶體 358
9.3.5 傳說中的大頂堆 359
9.3.6 拓展—找出數組中第k大的數 359
第10章 更多 363
10.1 不使用額外的空間交換兩個數 364
10.1.1 問題描述 364
10.1.2 分析問題 364
10.1.3 解決問題 364
10.2 拿桌球的問題 365
10.2.1 問題描述 365
10.2.2 分析問題 365
10.2.3 解決問題 365
第11章 實現一些集合類 367
11.1 棧(Stack)的實現 368
11.1.1 實現前的思考 368
11.1.2 實現棧 368
11.1.3 參考JDK的實現 372
11.2 變長數組(ArrayList)的實現 372
11.2.1 實現前的思考 372
11.2.2 實現變長數組 373
11.2.3 參考JDK的實現 380
11.3 散列表(HashMap)的實現 381
11.3.1 實現前的思考 381
11.3.2 實現散列表 381
11.3.3 參考JDK的實現 389
第12章 方向 390
12.1 算法的一些常用思想 391
12.1.1 分治法 391
12.1.2 動態規劃 391
12.1.3 貪心算法 391
12.1.4 回溯法 392
12.1.5 分支限界法 392
12.2 新興算法 392
12.2.1 加密算法 392
12.2.2 商業算法 393
12.3 其他算法 393
12.3.1 基數估計算法 393
12.3.2 蟻群算法 394