本書通過虛擬的主人公小灰的心路歷程,用漫畫的形式講述了算法和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)知識(shí)、復(fù)雜多變的算法面試題目及算法的實(shí)際應(yīng)用場(chǎng)景。第1章 介紹了算法和數(shù)據(jù)結(jié)構(gòu)的相關(guān)概念,告訴大家算法是什么,數(shù)據(jù)結(jié)構(gòu)又是什么,它們有哪些用途,如何分析時(shí)間復(fù)雜度,如何分析空間復(fù)雜度。第2章 介紹了最基本的數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表、棧、隊(duì)列、哈希表的概念和讀寫操作。第3章 介紹了樹和二叉樹的概念、二叉樹的各種遍歷方式、二叉樹的特殊形式——二叉堆和優(yōu)先隊(duì)列的應(yīng)用。第4章 介紹了幾種典型的排序算法,包括冒泡排序、快速排序、堆排序、計(jì)數(shù)排序、桶排序。第5章 介紹了10余道職場(chǎng)上流行的算法面試題及詳細(xì)的解題思路。例如怎樣判斷鏈表有環(huán),怎樣計(jì)算大整數(shù)相加等。第6章 介紹了算法在職場(chǎng)上的一些應(yīng)用,例如使用LRU算法來淘汰冷數(shù)據(jù),使用Bitmap算法來統(tǒng)計(jì)用戶特征等。
微信公眾號(hào)程序員小灰的作者,多年的軟件行業(yè)從業(yè)經(jīng)驗(yàn),先后在京東金融和摩拜科技從事算法和研發(fā)相關(guān)工作,對(duì)算法有著深入的研究。
第1章 算法概述 / 1
1.1 算法和數(shù)據(jù)結(jié)構(gòu) / 1
1.1.1 小灰和大黃 / 1
1.1.2 什么是算法 / 3
1.1.3 什么是數(shù)據(jù)結(jié)構(gòu) / 7
1.2 時(shí)間復(fù)雜度 / 8
1.2.1 算法的好與壞 / 8
1.2.2 基本操作執(zhí)行次數(shù) / 10
1.2.3 漸進(jìn)時(shí)間復(fù)雜度 / 12
1.2.4 時(shí)間復(fù)雜度的巨大差異 / 15
1.3 空間復(fù)雜度 / 16
1.3.1 什么是空間復(fù)雜度 / 16
1.3.2 空間復(fù)雜度的計(jì)算 / 19
1.3.3 時(shí)間與空間的取舍 / 21
1.4 小結(jié) / 22
第2章 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ) / 23
2.1 什么是數(shù)組 / 23
2.1.1 初識(shí)數(shù)組 / 23
2.1.2 數(shù)組的基本操作 / 26
2.1.3 數(shù)組的優(yōu)勢(shì)和劣勢(shì) / 32
2.2 什么是鏈表 / 32
2.2.1 “正規(guī)軍”和“地下黨” / 32
2.2.2 鏈表的基本操作 / 35
2.2.3 數(shù)組VS鏈表 / 40
2.3 棧和隊(duì)列 / 41
2.3.1 物理結(jié)構(gòu)和邏輯結(jié)構(gòu) / 41
2.3.2 什么是棧 / 42
2.3.3 棧的基本操作 / 43
2.3.4 什么是隊(duì)列 / 44
2.3.5 隊(duì)列的基本操作 / 45
2.3.6 棧和隊(duì)列的應(yīng)用 / 48
2.4 神奇的哈希表 / 50
2.4.1 為什么需要哈希表 / 50
2.4.2 哈希函數(shù) / 52
2.4.3 哈希表的讀寫操作 / 53
2.5 小結(jié) / 56
第3章 樹 / 58
3.1 樹和二叉樹 / 58
3.1.1 什么是樹 / 58
3.1.2 什么是二叉樹 / 61
3.1.3 二叉樹的應(yīng)用 / 64
3.2 二叉樹的遍歷 / 68
3.2.1 為什么要研究遍歷 / 68
3.2.2 深度優(yōu)先遍歷 / 70
3.2.3 廣度優(yōu)先遍歷 / 80
3.3 什么是二叉堆 / 83
3.3.1 初識(shí)二叉堆 / 83
3.3.2 二叉堆的自我調(diào)整 / 86
3.3.3 二叉堆的代碼實(shí)現(xiàn) / 91
3.4 什么是優(yōu)先隊(duì)列 / 93
3.4.1 優(yōu)先隊(duì)列的特點(diǎn) / 93
3.4.2 優(yōu)先隊(duì)列的實(shí)現(xiàn) / 95
3.5 小結(jié) / 98
第4章 排序算法 / 100
4.1 引言 / 100
4.2 什么是冒泡排序 / 102
4.2.1 初識(shí)冒泡排序 / 102
4.2.2 冒泡排序的優(yōu)化 / 105
4.2.3 雞尾酒排序 / 108
4.3 什么是快速排序 / 112
4.3.1 初識(shí)快速排序 / 112
4.3.2 基準(zhǔn)元素的選擇 / 114
4.3.3 元素的交換 / 116
4.3.4 單邊循環(huán)法 / 118
4.3.5 非遞歸實(shí)現(xiàn) / 121
4.4 什么是堆排序 / 123
4.4.1 傳說中的堆排序 / 123
4.4.2 堆排序的代碼實(shí)現(xiàn) / 127
4.5 計(jì)數(shù)排序和桶排序 / 129
4.5.1 線性時(shí)間的排序 / 129
4.5.2 初識(shí)計(jì)數(shù)排序 / 130
4.5.3 計(jì)數(shù)排序的優(yōu)化 / 132
4.5.4 什么是桶排序 / 137
4.6 小結(jié) / 140
第5章 面試中的算法 / 141
5.1 躊躇滿志的小灰 / 141
5.2 如何判斷鏈表有環(huán) / 142
5.2.1 一場(chǎng)與鏈表相關(guān)的面試 / 142
5.2.2 解題思路 / 146
5.2.3 問題擴(kuò)展 / 148
5.3 最小棧的實(shí)現(xiàn) / 151
5.3.1 一場(chǎng)關(guān)于棧的面試 / 151
5.3.2 解題思路 / 153
5.4 如何求出最大公約數(shù) / 156
5.4.1 一場(chǎng)求最大公約數(shù)的面試 / 156
5.4.2 解題思路 / 158
5.5 如何判斷一個(gè)數(shù)是否為2的整數(shù)次冪 / 162
5.5.1 一場(chǎng)很“2”的面試 / 162
5.5.2 解題思路 / 165
5.6 無序數(shù)組排序后的最大相鄰差 / 167
5.6.1 一道奇葩的面試題 / 167
5.6.2 解題思路 / 168
5.7 如何用棧實(shí)現(xiàn)隊(duì)列 / 173
5.7.1 又是一道關(guān)于棧的面試題 / 173
5.7.2 解題思路 / 174
5.8 尋找全排列的下一個(gè)數(shù) / 179
5.8.1 一道關(guān)于數(shù)字的題目 / 179
5.8.2 解題思路 / 181
5.9 刪去k個(gè)數(shù)字后的最小值 / 184
5.9.1 又是一道關(guān)于數(shù)字的題目 / 184
5.9.2 解題思路 / 186
5.10 如何找到兩個(gè)數(shù)組的中位數(shù) / 192
5.10.1 有關(guān)中位數(shù)的問題 / 192
5.10.2 解題思路 / 194
5.11 如何求解金礦問題 / 200
5.11.1 一個(gè)關(guān)于財(cái)富自由的問題 / 200
5.11.2 解題思路 / 202
5.12 尋找缺失的整數(shù) / 211
5.12.1 “五行”缺一個(gè)整數(shù) / 211
5.12.2 問題擴(kuò)展 / 213
第6章 算法的實(shí)際應(yīng)用 / 218
6.1 小灰上班的第1天 / 218
6.2 Bitmap的巧用 / 220
6.2.1 一個(gè)關(guān)于用戶標(biāo)簽的需求 / 220
6.2.2 用算法解決問題 / 222
6.3 LRU算法的應(yīng)用 / 228
6.3.1 一個(gè)關(guān)于用戶信息的需求 / 228
6.3.2 用算法解決問題 / 231
6.4 什么是A星尋路算法 / 236
6.4.1 一個(gè)關(guān)于迷宮尋路的需求 / 236
6.4.2 用算法解決問題 / 238
6.5 如何實(shí)現(xiàn)紅包算法 / 248
6.5.1 一個(gè)關(guān)于錢的需求 / 248
6.5.2 用算法解決問題 / 251
6.6 算法之路無止境 / 254