{T}

大数据与AI时代的算法:工程师必修课

适用范围:后端/数据/算法工程师及技术管理者;适用于系统设计、算法选型、存储引擎理解、推荐/搜索引擎架构与面试准备等场景。

更新摘要(v2 · 2026-08 更新)

  • 结构化升级为 6 节骨架(导言 / 核心方法论 / 关键流程 / 工具与实战 / 常见误区 / 进阶延展)
  • 为全部 9 张 Mermaid 图补充 --- title: ... --- frontmatter 与图后文字解读
  • 将原"参考资料"融入"6. 进阶延展"以便读者顺读
  • 保留 2025 算法生态、Transformer/MoE/RLHF、LSM-Tree 代码、推荐系统分层等核心内容

1. 导言

传统观点认为"大数据优于好算法"——只要数据量足够大,即使算法不够精良也能产出可接受的结果。这一认知在2017年被DeepMind的AlphaGo Zero彻底颠覆:该系统从零知识状态出发,无需任何人类对弈数据,以100:0击败上一代AlphaGo。AlphaGo首席研究员David Silver指出,AlphaGo Zero使用的计算资源比前代少一个数量级,但凭借更优的算法原理实现了更强的性能。

进入2025年,这一趋势更加显著。大语言模型(LLM)的突破性进展表明,算法架构的创新(如Transformer、MoE混合专家模型、RLHF对齐算法)与数据规模同等重要,甚至在某些场景下更为关键。算法不再仅仅是面试筛选工具,而是决定系统性能上限的核心变量。本文按"理论→大数据/ML 流程→工程实战→误区→趋势"组织,帮助工程师建立完整的算法认知地图。

2. 核心方法论

2.1 2025年算法生态概览

当前算法生态呈现三大特征:

  • 规模驱动与效率驱动的双轨演进:一方面,大规模分布式算法处理PB级数据;另一方面,端侧推理算法追求极致的参数效率与推理延迟
  • 传统算法与AI算法的深度融合:数据库查询优化器引入学习型索引(Learned Index),推荐系统将协同过滤与深度学习模型协同部署
  • 算法即基础设施:从搜索引擎到推荐系统,从自动驾驶到金融风控,算法已成为技术基础设施的核心组件
图表渲染中…

生态全景图将算法划分为经典、大数据、机器学习/深度学习、前沿四大类。工程师应按所在领域选择深耕方向,但需意识到四类算法在现代系统中往往协同工作(如推荐系统同时使用经典数据结构、分布式计算与深度学习模型)。

2.2 复杂度分析基础

算法复杂度是评估算法效率的数学框架,是算法选型的理论依据。

复杂度类记号典型算法数据规模上限(1s时限)
常数O(1)哈希查找无限制
对数O(log n)二分查找、B+树查询~2^10^7
线性O(n)线性扫描、计数排序~10^8
线性对数O(n log n)归并排序、快速排序~4×10^7
平方O(n²)冒泡排序、朴素最近邻~10^4
指数O(2^n)子集枚举、精确TSP~30
阶乘O(n!)全排列、精确TSP~12

实际工程中需同时关注:

  • 时间复杂度:决定算法能否在可接受时间内完成计算
  • 空间复杂度:决定内存占用,在嵌入式与端侧场景尤为关键
  • I/O复杂度:在外存算法(如外部排序、B树操作)中起决定性作用
  • 缓存友好性:算法的局部性特征对现代CPU缓存命中率影响显著

2.3 算法设计范式

图表渲染中…

分治法将问题分解为独立子问题,分别求解后合并。核心在于分解策略与合并代价。典型应用:归并排序(O(n log n))、快速排序(平均O(n log n))、大整数乘法(Karatsuba算法)。

动态规划适用于具有最优子结构和重叠子问题特征的问题。状态定义与状态转移方程是设计关键。空间优化(滚动数组、状态压缩)是工程实践中的常见需求。典型应用:0-1背包、编辑距离、区间DP。

贪心算法通过局部最优选择期望达到全局最优。需严格证明贪心选择性质。典型应用:活动选择、Huffman编码、Dijkstra算法。

回溯法系统搜索解空间树,通过剪枝减少无效搜索。典型应用:组合优化、约束满足问题。

上图展示的五大范式覆盖了绝大多数经典问题。选型关键在于判断问题是否具备"最优子结构"(动态规划)、"贪心选择性质"(贪心)或"解空间可剪枝"(回溯)。

2.4 NP问题与近似算法

工程中大量问题属于NP-hard范畴,无法在多项式时间内精确求解,需采用近似算法或启发式方法:

策略方法适用场景
近似算法贪心近似、LP松弛+舍入可证明近似比的问题
启发式搜索模拟退火、遗传算法、蚁群算法组合优化、调度问题
随机化算法Las Vegas/Monte Carlo大规模图计算、素性测试
参数化算法固定参数可解(FPT)实例中存在小参数的NP-hard问题

2.5 核心数据结构

数据结构时间复杂度(查找/插入/删除)空间开销核心适用场景
数组O(1)/O(n)/O(n)O(n)随机访问密集、大小已知
链表O(n)/O(1)/O(1)O(n)频繁插入删除、大小动态
哈希表O(1)均摊O(n) + 开销键值查找、去重、缓存
二叉搜索树O(log n)~O(n)O(n)有序遍历、范围查询
AVL/红黑树O(log n)O(n)需要严格平衡的有序操作
O(n)/O(log n)/O(log n)O(n)优先队列、Top-K、调度
跳表O(log n)均摊O(n)×因子有序集合、并发友好(Redis ZSet)
B+树O(log n)(低高度)O(n)磁盘索引、数据库查询
LSM-TreeO(1)写入均摊O(n) + compaction高吞吐写入、时序数据
图(邻接表)O(deg)查找邻居O(V+E)社交网络、路径规划
字典树(Trie)O(L)(L为键长)O(总字符数)前缀匹配、自动补全
布隆过滤器O(k)(k为哈希数)O(m)(bit数组)存在性过滤、防缓存穿透

2.6 工程中高频使用的数据结构

B+树:数据库索引的事实标准。所有数据存储在叶子节点,叶子节点通过指针串联,支持高效范围查询。树高度通常为3-4层即可管理亿级记录,每层对应一次磁盘I/O。

LSM-Tree(Log-Structured Merge-Tree):写优化存储引擎的核心数据结构。写入先进入内存表(MemTable),达到阈值后刷写为磁盘上的SSTable(Sorted String Table),后台通过Compaction合并排序。LevelDB、RocksDB、Cassandra、HBase均基于此架构。

跳表:通过多层索引实现O(log n)查找,实现简单且天然支持并发。Redis的有序集合(ZSET)在元素数量超过128或元素长度超过64字节时从压缩列表切换为跳表+哈希表实现。

布隆过滤器:空间效率极高的概率型数据结构,判断元素"一定不存在"或"可能存在"。在缓存穿透防护、爬虫URL去重、邮箱垃圾邮件过滤中广泛使用。误判率可通过增加bit数组长度和哈希函数数量控制。

3. 关键流程

3.1 分布式计算范式

图表渲染中…

MapReduce:将计算抽象为Map(映射)和Reduce(归约)两阶段,中间通过Shuffle按Key分组。适用于批处理场景,但每次Shuffle涉及磁盘I/O,迭代计算效率低。

Spark:基于RDD(弹性分布式数据集)的内存计算框架。通过DAG调度器优化执行计划,窄依赖(narrow dependency)在流水线中执行不触发Shuffle,宽依赖(wide dependency)才需Shuffle。支持SQL、Streaming、MLlib、GraphX多范式。

流处理算法:Flink等流处理框架支持事件时间(Event Time)语义下的窗口计算,包括滚动窗口、滑动窗口、会话窗口。Watermark机制处理乱序事件,允许设置允许延迟(Allowed Lateness)控制结果完整性。

上图对比了批处理(MapReduce)、内存计算(Spark)与流处理三种范式的差异:MapReduce 每阶段落盘,Spark 通过 DAG 优化避免不必要的 Shuffle,流处理则以事件时间窗口为核心抽象。

3.2 Sketch近似算法

当数据规模远超内存容量时,精确计算代价过高,Sketch算法以可控的精度损失换取数量级的资源节省:

Sketch算法功能空间复杂度误差界典型应用
Count-Min Sketch频率估计O(ε⁻¹log δ⁻¹)ε·‖f‖₁ w.p. 1-δ热点统计、流量监控
HyperLogLog基数估计O(ε⁻² log log n)标准误差~1.04/√mUV统计、去重计数
Bloom Filter存在性判断O(n·log(1/ε))假阳性率ε缓存穿透防护
Heavy Hitters频繁项检测O(k·log n)误差εDDoS检测、热门内容
T-Digest分位数估计O(ε⁻¹)δ-quantile误差P99延迟监控
Count-Min Sketch +关联频率O(ε⁻¹log δ⁻¹)ε·‖f‖₁共现统计

3.3 存储引擎算法:从BigTable到RocksDB

存储引擎是算法在工程中深度应用的典型领域。以下梳理LSM-Tree存储引擎的算法体系:

图表渲染中…

技术谱系:BigTable(2004,Google内部)→ LevelDB(2011,Jeff Dean & Sanjay Ghemawat开源重写)→ RocksDB(Facebook基于LevelDB增强多CPU支持)→ CockroachDB(基于RocksDB的分布式SQL数据库,Spanner开源实现)。

核心算法要点

  • SSTable:不可变的有序键值对文件,支持二分查找与布隆过滤器加速
  • Compaction:合并多层SSTable,消除过期与删除标记,分为Leveled Compaction(LevelDB/RocksDB默认)与Tiered Compaction(写放大更小)
  • Bloom Filter:每SSTable一个,快速排除不包含目标Key的文件,减少磁盘I/O
  • Block Cache:LRU策略缓存热点数据块,减少重复磁盘读取

上图清晰呈现了 LSM-Tree 的写入路径(MemTable→WAL→SSTable 多层 Compaction)与读取路径(MemTable→Bloom Filter→Block Cache→磁盘)。Bloom Filter 在读路径上承担了"快速排除"的关键职责,避免对不相关 SSTable 的无效磁盘访问。

3.4 机器学习学习范式分类

图表渲染中…

3.5 监督学习核心算法

算法类型核心思想适用场景复杂度
线性/逻辑回归线性模型线性决策边界+正则化高维稀疏特征、基线模型O(nd)训练
决策树树模型信息增益/基尼系数递归分裂可解释性要求高O(n·d·log n)
随机森林集成-Bagging多棵决策树投票/平均通用分类回归、特征重要性O(T·n·d·log n)
XGBoost/LightGBM集成-Boosting梯度提升+正则化+直方图加速结构化数据竞赛与工业场景O(T·n·d)
SVM核方法最大间隔超平面+核技巧中小规模非线性分类O(n²~n³)
神经网络深度学习多层非线性变换+反向传播图像/文本/语音等非结构化数据取决于架构

3.6 深度学习基础架构

卷积神经网络(CNN):通过局部感受野与权值共享提取空间局部特征。ResNet引入残差连接解决深层网络退化问题,是计算机视觉领域的里程碑架构。

循环神经网络(RNN):处理序列数据,LSTM/GRU通过门控机制缓解长程依赖问题。在Transformer出现前是NLP主流架构,现主要用于时序预测等场景。

Transformer架构:2017年提出的自注意力机制架构,已成为2025年AI领域的主导范式:

图表渲染中…

Transformer核心公式

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$

关键变体与演进

  • BERT(2018):双向编码器,掩码语言模型预训练
  • GPT系列(2019-2025):自回归解码器,规模定律(Scaling Law)驱动
  • MoE(Mixture of Experts):稀疏激活,以较少计算量实现更大参数容量
  • Flash Attention(2022-2024):I/O感知的精确注意力算法,显著降低内存访问开销
  • Ring Attention(2024):支持超长序列的分布式注意力计算

上图右侧的注意力计算揭示了 Transformer 的核心:通过 Q·K^T 计算查询与键的相关性,softmax 归一化后加权聚合 V。缩放因子 √d_k 用于防止点积过大导致 softmax 梯度消失。

3.7 强化学习与对齐算法

AlphaGo Zero的突破本质上是强化学习算法的胜利。其核心流程:

  1. 自我对弈(Self-Play):当前策略网络与自身对弈生成训练数据
  2. 蒙特卡洛树搜索(MCTS):在推理阶段进行前瞻搜索,提升决策质量
  3. 策略迭代:用MCTS的搜索结果作为监督信号训练策略网络

2025年,强化学习在LLM对齐中发挥关键作用:

对齐算法类型核心机制特点
RLHF基于奖励模型的RL训练奖励模型→PPO优化策略效果好但训练不稳定
DPO直接偏好优化将偏好学习转化为分类问题无需奖励模型,训练更稳定
GRPO组相对策略优化组内相对排名作为奖励DeepSeek-R1使用的对齐方法
Constitutional AI宪法式AI基于原则的自我修正Anthropic提出

3.8 大语言模型训练算法管线

图表渲染中…

训练管线图展示了 LLM 从预训练到部署的四阶段:预训练注入世界知识,SFT 学习指令跟随,对齐训练对齐人类偏好,部署阶段通过量化/蒸馏/剪枝压缩模型。每阶段对应不同的数据类型与算法目标。

4. 工具与实战

4.1 算法在存储系统中的应用

存储系统是算法密集型基础设施,以下以RocksDB为例说明:

写入路径

  1. 请求写入WAL(Write-Ahead Log)保证持久性
  2. 写入MemTable(内存中的跳表/红黑树)
  3. MemTable达到阈值后变为Immutable MemTable
  4. 后台线程将Immutable MemTable刷写为Level 0 SSTable
  5. 后台Compaction将低层SSTable合并到高层

读取路径

  1. 查询MemTable → Immutable MemTable
  2. 查询Block Cache(LRU缓存)
  3. 对每层SSTable查询Bloom Filter排除不相关文件
  4. 在可能包含Key的SSTable中进行二分查找
  5. 解压数据块并返回结果

代码示例——LSM-Tree写入流程伪代码

python
class LSMTree:
    def __init__(self, memtable_limit=4 * 1024 * 1024):
        self.memtable = SkipList()
        self.wal = WriteAheadLog()
        self.immutable_memtables = []
        self.levels = [SSTableLevel(i) for i in range(7)]
        self.block_cache = LRUCache(capacity=8 * 1024 * 1024)
        self.memtable_limit = memtable_limit
 
    def put(self, key, value):
        self.wal.append(WriteOp(key, value))
        self.memtable.insert(key, value)
        if self.memtable.size >= self.memtable_limit:
            self._flush_memtable()
 
    def get(self, key):
        result = self.memtable.get(key)
        if result is not None:
            return result if not result.is_deleted else None
        for imm in self.immutable_memtables:
            result = imm.get(key)
            if result is not None:
                return result if not result.is_deleted else None
        for level in self.levels:
            sstable = level.find_sstable_may_contain(key)
            if sstable and sstable.bloom_filter.may_contain(key):
                cached = self.block_cache.get(sstable, key)
                if cached is not None:
                    return cached
                result = sstable.get_from_disk(key)
                if result is not None:
                    self.block_cache.put(sstable, key, result)
                    return result if not result.is_deleted else None
        return None
 
    def _flush_memtable(self):
        self.immutable_memtables.append(self.memtable)
        self.memtable = SkipList()
        self.wal.rotate()
        self._trigger_compaction()
 
    def _trigger_compaction(self):
        imm = self.immutable_memtables.pop(0)
        sstable = SSTable.from_memtable(imm)
        self.levels[0].add(sstable)
        for i in range(len(self.levels) - 1):
            if self.levels[i].size_exceeds_limit():
                self._compact_level(i)

4.2 推荐系统算法架构

推荐系统是算法在工业界最广泛的应用之一,涉及多种算法协同工作:

图表渲染中…

各层算法选型

层级目标候选集规模延迟要求典型算法
召回高覆盖率千级→万级<50ms协同过滤、向量检索(HNSW/IVF-PQ)、多路召回
粗排初步过滤千级→百级<20ms轻量DSSM、FM、简化版排序模型
精排精准排序百级→十级<30msDeepFM/DIN/DIEN/多目标学习
重排多样性与业务约束十级<10msMMR、业务规则引擎、List-wise排序

推荐系统的"召回→粗排→精排→重排"漏斗是工程化算法选型的典型范例:每层在候选集规模与延迟约束下选择最合适的算法,体现了"在正确的层级用正确的算法"的工程思想。

4.3 搜索引擎算法

搜索引擎涉及信息检索的核心算法栈:

  • 倒排索引:Term → Document列表的映射,支持O(1)文档检索
  • TF-IDF/BM25:词项权重计算,BM25是工业标准排序函数
  • 向量检索:基于语义嵌入的近似最近邻搜索(ANN),算法包括HNSW、IVF-PQ、ScaNN
  • 页面排序:PageRank算法基于链接结构的图算法,计算节点重要性

BM25评分公式

$$\text{BM25}(D, Q) = \sum_{i=1}^{|Q|} \text{IDF}(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{|D|}{\text{avgdl}})}$$

4.4 支付领域的压缩编码算法

在支付系统中,信用卡BIN(Bank Identification Number)参数需从服务端同步至移动App,数据传输量直接影响用户体验。核心挑战:

  • 各国信用卡前缀格式差异大(中国16位、韩国15-16位、墨西哥16位等)
  • 需在压缩率与客户端解码复杂度间取得平衡
  • 客户端代码复杂度过高易引入Bug,影响支付可靠性

典型方案:采用前缀树(Trie)编码BIN范围,对Trie进行路径压缩(Patricia Trie),再对序列化结果进行变长整数编码(Varint)+ Snappy压缩。相比直接传输JSON,压缩率可达10:1以上,且客户端解码逻辑仅需标准Trie遍历,复杂度可控。

4.5 算法学习路径

图表渲染中…

学习路径图将算法学习分为基础、进阶、工程应用三阶段。第三阶段尤其重要——它将面试中的"算法题"与真实系统中的算法使用连接起来,避免"会刷题但不会做系统设计"的脱节。

4.6 推荐学习资源

类别资源说明
经典教材《算法导论》(CLRS)理论基础,适合系统学习
经典教材《算法设计手册》(Skiena)工程导向,实战性强
经典教材《算法》(Sedgewick)Java实现,图示丰富
在线课程MIT 6.006/6.046算法导论/高级算法,免费公开课
在线课程Stanford CS161/CS261算法设计与分析
刷题平台LeetCode面试准备首选,按专题分类
刷题平台Codeforces竞赛向,提升算法思维
工程实践读LevelDB/RocksDB源码存储引擎算法实战
工程实践读Redis源码数据结构与网络算法实战

4.7 面试准备策略

技术面试中算法考察仍是核心环节,尤其在头部科技公司。准备要点:

  1. 按专题系统刷题:不要随机刷,按数据结构和算法范式分类练习
  2. 重视模式识别:多数面试题可归入有限模式(滑动窗口、双指针、单调栈、拓扑排序等)
  3. 训练白板编码:在无IDE环境下写出可运行代码,边写边沟通思路
  4. 复杂度分析习惯:每道题必须分析时间/空间复杂度,讨论优化空间
  5. 系统设计中的算法:高级面试常考算法在系统设计中的应用(如设计限流器需令牌桶/漏桶算法)

5. 常见误区

5.1 "大数据优于好算法"的迷信

如导言所述,AlphaGo Zero 已证明在算法原理更优时,即使数据更少、算力更省也能取得压倒性优势。工程中应避免"先堆数据再谈算法"的惰性思维——当数据规模带来边际收益递减时,算法架构创新往往是突破瓶颈的关键。

5.2 唯复杂度论

时间复杂度是选型依据之一,但不是全部。低复杂度算法若常数因子过大(如hash map 在小数据量下不如线性扫描)、缓存不友好(如链表遍历破坏空间局部性)或实现复杂易出错,在实际场景中可能劣于"理论复杂度更高"的简单算法。工程选型必须结合数据规模、I/O 模式与可维护性综合判断。

5.3 忽视 I/O 与缓存友好性

在分析阶段只看时间复杂度,忽略 I/O 复杂度与缓存命中率,是数据库与存储系统性能问题的常见根源。例如 B+树之所以成为数据库索引事实标准,正是因为它针对磁盘 I/O 进行了优化(低树高、大节点),而非因为它在 CPU 时间上最优。

5.4 面试刷题与工程脱节

仅靠刷题掌握的算法往往是" isolated 片段",缺乏与真实系统的联系。常见表现:能写出 Dijkstra 但不理解其在路由协议中的作用,能写出 LRU 但不知道 MySQL Buffer Pool 如何使用改进版 LRU。建议结合源码阅读(LevelDB/RocksDB/Redis)将算法放回工程语境。

5.5 过度工程化算法选型

在数据量尚未达到瓶颈时过早引入复杂算法(如百万级数据就用分布式计算、千级文档就上 HNSW 向量索引),会带来不必要的运维复杂度与故障面。应遵循"先用简单算法验证,再按瓶颈优化"的渐进式原则。

5.6 忽略近似算法的可控精度

Sketch 类近似算法(Count-Min Sketch、HyperLogLog)在工程中常被误用为"精确算法"或被拒绝采用。正确做法是明确误差界与置信度,并在监控中追踪实际误差,而非一刀切地追求精确或放弃使用。

6. 进阶延展

6.1 AI驱动的算法优化

机器学习正在重塑传统算法的设计与优化方式:

  • 学习型索引(Learned Index):用神经网络替代B+树索引结构,在特定数据分布下可减少50%以上的I/O次数
  • 学习型排序(Learned Sort):利用数据分布先验优化排序策略,在近乎有序数据上接近O(n)
  • 学习型查询优化:用强化学习替代基于规则的查询计划选择,Google已在大规模SQL引擎中实践
  • AI辅助调度:用深度强化学习优化数据中心任务调度、网络路由

6.2 AutoML与神经架构搜索

AutoML旨在自动化机器学习管线中的算法选择与超参优化:

  • NAS(Neural Architecture Search):自动搜索最优网络架构,DARTS、ENAS等方法将搜索时间从GPU年降至GPU天
  • 超参优化:贝叶斯优化(Bayesian Optimization)、HyperBand、BOHB等方法自动调优
  • 模型压缩自动化:自动搜索最优的剪枝率、量化位宽与蒸馏策略组合

6.3 量子算法

量子计算为特定问题类别提供多项式甚至指数级加速:

量子算法加速类型适用问题当前状态
Shor算法指数加速大数分解(RSA破解)理论验证,需大规模量子比特
Grover算法平方加速无序数据库搜索小规模验证
VQE启发式量子化学模拟NISQ时代可用
QAOA启发式组合优化小规模验证
量子机器学习待定线性代数子程序理论研究阶段

6.4 联邦学习与隐私计算

数据隐私法规趋严背景下,联邦学习算法使多方在不共享原始数据的前提下协同训练模型:

  • FedAvg:客户端本地训练→服务端聚合模型参数,最基础的联邦学习算法
  • FedProx:引入近端项解决客户端数据异构性问题
  • 差分隐私(DP):通过添加校准噪声提供数学可证明的隐私保障
  • 安全多方计算(MPC):在加密数据上直接计算,不泄露原始输入

6.5 算法公平性与可解释性

算法的社会影响日益受到关注:

  • 公平性:检测和缓解算法中的偏见(如招聘、信贷场景中的性别/种族偏见)
  • 可解释性:SHAP、LIME等工具提供模型决策的局部与全局解释
  • 可审计性:算法决策过程需可追溯、可审计,满足监管要求

6.6 延伸阅读

  • Cormen T H, et al. Introduction to Algorithms (CLRS), 4th Edition, MIT Press, 2022. —— 算法理论权威教材。
  • Sedgewick R, Wayne K. Algorithms, 4th Edition, Addison-Wesley, 2011.
  • Skiena S S. The Algorithm Design Manual, 3rd Edition, Springer, 2020. —— 工程导向。
  • Dean J, Ghemawat S. MapReduce: Simplified Data Processing on Large Clusters, OSDI, 2004.
  • Vaswani A, et al. Attention Is All You Need, NeurIPS, 2017. —— Transformer 原始论文。
  • Ouyang L, et al. Training language models to follow instructions with human feedback, NeurIPS, 2022. —— RLHF。
  • Rafailov R, et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model, NeurIPS, 2023. —— DPO。
  • Krizhevsky A, Sutskever I, Hinton G E. ImageNet Classification with Deep Convolutional Neural Networks, NeurIPS, 2012.
  • He K, et al. Deep Residual Learning for Image Recognition, CVPR, 2016. —— ResNet。
  • Silver D, et al. Mastering the Game of Go without Human Knowledge, Nature, 2017. —— AlphaGo Zero。
  • O'Neil C. Weapons of Math Destruction, Crown, 2016. —— 算法公平性。
  • SSTable与Log-Structured存储: https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/