图书目录

目 录

第Ⅰ部分基于哈希的草图

第1 章 导论     3

1.1 示例     5

1.1.1 示例解决方法  6

1.1.2 本书给出的解决方法     8

1.2 本书的结构    11

1.3 本书的不同之处及目标读者    12

1.4 为什么大规模数据对当今的系统如此具有挑战性     13

1.4.1 CPU 内存性能差距    13

1.4.2 内存层次结构   14

1.4.3 延迟与带宽   15

1.4.4 分布式系统的情况    15

1.5 基于硬件来设计算法     16

1.6 本章小结     17

第2 章 哈希表和现代哈希回顾     19

2.1 无处不在的哈希  20

2.2 数据结构概述   22

2.3 现代系统中的使用场景     25

2.3.1 备份/存储解决方案中的重复数据删除   25

2.3.2 使用MOSS 和Rabin-Karp 指纹识别进行剽窃检测   26

2.4 有关O(1)      29

2.5 解决冲突:理论与实践     30

2.6 使用场景:Python 的dict是如何实现的   33

2.7 MurmurHash    35

2.8 分布式系统的哈希表:一致性哈希   36

2.8.1 一个典型的哈希问题    37

2.8.2 哈希环    38

2.8.3 查找    41

2.8.4 添加新节点/资源    41

2.8.5 删除节点   44

2.8.6 一致性哈希场景:Chord      48

2.8.7 一致性哈希:编程练习    50

2.9 本章小结    50

第3 章 近似成员关系:Bloom 过滤器和商

过滤器   53

3.1 工作原理    56

3.1.1 插入    56

3.1.2 查找    57

3.2 用例     58

3.2.1 网络中的Bloom 过滤器:Squid  58

3.2.2 Bitcoin 移动应用    59

3.3 一个简单的实现  60

3.4 设置Bloom过滤器     61

3.5 一点理论     66

3.6 Bloom 过滤器的调整和替代方案   69

3.7 商过滤器     70

3.7.1 商-余数法   71

3.7.2 了解元数据位  73

3.7.3 示例:插入商过滤器中  73

3.7.4 用于查找的Python代码   76

3.7.5 调整大小与合并   79

3.7.6 误报率和空间考虑   80

3.8 Bloom 过滤器和商过滤器的比较   80

3.9 本章小结     82

第4 章 频率估计和count-minsketch    85

4.1 多数元素     87

4.2 count-min sketch 的工作原理     90

4.2.1 update     90

4.2.2 estimate    91

4.3 用例     92

4.3.1 前k 个睡眠不安者   92

4.3.2 缩放单词的分布相似度    96

4.4 count-min sketch 中的误差与空间   99

4.5 count-min sketch 的简单实现   100

4.5.1 练习     101

4.5.2 公式所蕴含的原理   102

4.6 使用count-min sketch进行范围查询  103

4.6.1 二元区间   104

4.6.2 更新阶段   105

4.6.3 估计阶段   107

4.6.4 计算二元区间     108

4.7 本章小结    110

第5 章 基数估计和HyperLogLog  113

5.1 对数据库中的不同项计数     114

5.2 HyperLogLog 增量设计    116

5.2.1 第一步:概率计数     117

5.2.2 随机平均   119

5.2.3 LogLog    121

5.2.4 HyperLogLog:使用调和平均值进行随机平均   123

5.3 用例:使用HLL 捕捉蠕虫     126

5.4 一个小实验  128

5.5 用例:使用Hyper-LogLog 进行聚合  132

5.6 本章小结   135

第Ⅱ部分实时分析第6 章 流式数据   139

6.1 流式数据系统:元示例   144

6.1.1 Bloom 连接  144

6.1.2 重复数据删除     147

6.1.3 负载平衡和跟踪网络流量   149

6.2 数据流中的实际约束和概念   151

6.2.1 实时     151

6.2.2 小时间和小空间   152

6.2.3 概念转变和概念漂移     152

6.2.4 滑动窗口模型     153

6.3 抽样和估计  155

6.3.1 有偏差抽样策略     157

6.3.2 代表性样本的估计     160

6.4 本章小结    162

第7 章 从数据流中抽样   165

7.1 从地标流中抽样  166

7.1.1 伯努利抽样  166

7.1.2 蓄水池抽样  170

7.1.3 有偏差的蓄水池抽样     176

7.2 从滑动窗口抽样  182

7.2.1 链式抽样   182

7.2.2 优先级抽样  187

7.3 抽样算法比较  191

7.4 本章小结    195

第8 章 数据流上的近似分位数     197

8.1 精确分位数  198

8.2 近似分位数  201

8.2.1 加法误差   201

8.2.2 相对误差   203

8.2.3 数据域中的相对误差     204

8.3 t-digest:工作

原理    204

8.3.1 digest     205

8.3.2 比例函数   207

8.3.3 合并t-digest  211

8.3.4 t-digest 的空间范围    215

8.4 q-digest    215

8.4.1 从头开始构建q-digest    216

8.4.2 合并q-digest    218

8.4.3 q-digest 中的误差和空间注意事项    219

8.4.4 使用q-digest 进行分位数查询  220

8.5 模拟代码和结果  221

8.6 本章小结   226

第Ⅲ部分数据库的数据结构和外部存储器算法

第9 章 外部存储器模型  231

9.1 外部存储器模型初探     233

9.2 示例1:寻找最小值     235

9.3 示例2:二进制搜索     239

9.3.1 生物信息学用例    239

9.3.2 运行时间分析     241

9.4 最优搜索    243

9.5 示例3:合并K 个排序列表   246

9.5.1 合并时间/日期日志     246

9.5.2 外部存储器模型是否过于简单  250

9.6 下一章内容  251

9.7 本章小结    251

第10 章 数据库的数据结构:B 树、Bε 树和LSM 树   253

10.1 索引的工作原理    254

10.2 本章中的数据结构    256

10.3 B 树    258

10.3.1 B 树平衡  259

10.3.2 查找   260

10.3.3 插入   261

10.3.4 删除   263

10.3.5 B+树   266

10.3.6 B+树上的操作有何不同   268

10.3.7 用例:MySQL 等中的B 树   268

10.4 为什么B 树查找在外部存储器中是最佳的   269

10.5 Bε 树    272

10.5.1 Bε 树:工作原理   273

10.5.2 缓冲区机制· 273

10.5.3 插入和删除  275

10.5.4 查找   276

10.5.5 成本分析  277

10.5.6 Bε 树:数据结构的范围  278

10.5.7 用例:TokuDB 中的Bε 树   279

10.5.8 输入/输出之道:欲速则不达  280

10.6 日志结构合并树(LSM 树)    281

10.6.1 LSM 树:工作原理   283

10.6.2 LSM 树成本分析   285

10.6.3 用例:Cassandra 中的LSM 树  286

10.7 本章小结   287

第11 章 外部存储器排序    289

11.1 排序用例   290

11.1.1 机器人运动规划    290

11.1.2 癌症基因组学   291

11.2 外部存储器排序的挑战:示例   293

11.3 外部存储器合并排序    297

11.4 外部快速排序 300

11.4.1 外部存储器双向快速排序  301

11.4.2 外部存储器多向快速排序  302

11.4.3 找到足够的枢轴   303

11.4.4 找到足够好的枢轴   304

11.4.5 将它们重新组合在一起   305

11.5 为什么外部存储器合并排序是最优的   306

11.6 结尾    308

11.7 本章小结   309

参考文献      310