第 1 章 数据结构为何重要 1
1.1 基础数据结构:数组 1
1.1.1 读取 3
1.1.2 查找 5
1.1.3 插入 7
1.1.4 删除 8
1.2 集合:一条规则决定性能 10
1.3 总结 12
第 2 章 算法为何重要 13
2.1 有序数组 13
2.2 查找有序数组 15
2.3 二分查找 16
2.4 二分查找与线性查找 19
2.5 总结 20
第 3 章 大O记法 21
3.1 大O:数步数 21
3.2 常数时间与线性时间 22
3.3 同一算法,不同场景 24
3.4 第三种算法 24
3.5 对数 25
3.6 解释O(log N) 26
3.7 实例 27
3.8 总结 28
第 4 章 运用大O来给代码提速 29
4.1 冒泡排序 29
4.2 冒泡排序实战 30
4.3 冒泡排序的实现 33
4.4 冒泡排序的效率 35
4.5 二次问题 36
4.6 线性解决 38
4.7 总结 39
第 5 章 用或不用大O来优化代码 40
5.1 选择排序 40
5.2 选择排序实战 41
5.3 选择排序的实现 45
5.4 选择排序的效率 46
5.5 忽略常数 47
5.6 大O的作用 47
5.7 一个实例 48
5.8 总结 49
第 6 章 乐观地调优 50
6.1 插入排序 50
6.2 插入排序实战 51
6.3 插入排序的实现 55
6.4 插入排序的效率 56
6.5 平均情况 58
6.6 一个实例 60
6.7 总结 61
第 7 章 查找迅速的散列表 62
7.1 探索散列表 62
7.2 用散列函数来做散列 63
7.3 一个好玩又赚钱的同义词典 64
7.4 处理冲突 65
7.5 找到平衡 68
7.6 一个实例 69
7.7 总结 72
第 8 章 用栈和队列来构造灵巧的代码 73
8.1 栈 73
8.2 栈实战 75
8.3 队列 79
8.4 队列实战 80
8.5 总结 81
第 9 章 递归 82
9.1 用递归代替循环 82
9.2 基准情形 83
9.3 阅读递归代码 84
9.4 计算机眼中的递归 86
9.5 递归实战 87
9.6 总结 89
第 10 章 飞快的递归算法 90
10.1 分区 90
10.2 快速排序 94
10.3 快速排序的效率 98
10.4 最坏情况 101
10.5 快速选择 103
10.6 总结 105
第 11 章 基于结点的数据结构 106
11.1 链表 106
11.2 实现一个链表 107
11.3 读取 108
11.4 查找 109
11.5 插入 110
11.6 删除 112
11.7 链表实战 114
11.8 双向链表 115
11.9 总结 118
第 12 章 让一切操作都更快的二叉树 119
12.1 二叉树 119
12.2 查找 121
12.3 插入 124
12.4 删除 126
12.5 二叉树实战 132
12.6 总结 133
第 13 章 连接万物的图 134
13.1 图 134
13.2 广度优先搜索 136
13.3 图数据库 144
13.4 加权图 146
13.5 Dijkstra 算法 148
13.6 总结 154
第 14 章 对付空间限制 155
14.1 描述空间复杂度的大O记法 155
14.2 时间和空间之间的权衡 157
14.3 写在最后的话 158