先训练 模式 。
再到 LeetCode 上练习 。
我们不是另一个题库。我们要把从 读题 到 看出门道 的距离从几小时压缩到几分钟 —— 用交互式动画讲清楚 思维模型,而不是语法。
双 指针
两个下标在同一序列上移动以维持不变式 — 包含对向、快慢、滑动窗口三种子模式。
对向 · 快慢 · 滑动
二分查找 变体
边界条件是这一领域最大的、尚未被讲透的教学难点。
3 种变体 · O(log n)
回溯
决策树式展开 — 这种结构天然适合用动画来理解。
分支状态机
单调 栈
栈状态的迁移在代码里看不出来,在动画里却充满戏剧性 —— 栈本身就是主角。
下一个更大元素 · 直方图
网格上的 BFS / DFS
队列给出广度,栈给出深度 —— 同一种算法,两种遍历顺序。
队列 · 栈 · 洪水填充
堆与 优先队列
廉价拿到极值 —— 最小或最大 —— 其余元素保持松散有序。共 3 个子模式:Top-K、双堆、合并 K 路。
Top-K · 双堆 · 合并 K 路
树的 遍历
每种遍历都会访问每个节点一次 —— 差别只在于相对子节点递归的时机不同。
前序 · 中序 · 后序 · 层序
链表的 就地操作
三个指针 —— prev、curr、next —— 让你在不丢失尾部的前提下原地重写一条链表。
翻转 · 合并 · 重排
动态 规划
一张表格逐格填充,每一格由常数个先前的格子组合而来。共 7 个子模式。
一维 · 二维 · 背包 · 区间 · 状态机 · 树形 · 位掩码
并 查集
维护 N 个元素的不相交划分 —— 在近常数时间内合并两个分量,森林会在每次查询时自我扁平化。
连通分量 · O(α(N))
字典树
把一组字符串存储在字符构成的树上 —— 共前缀的单词共享路径,一个 “end-of-word” 标志把已存单词和中途的前缀区分开。
前缀查询 · 自动补全 · 单词搜索
拓扑 排序
把有向无环图线性化,使每条边都从左指向右 —— 每个节点只在所有前置都已离开后才进入序列。
Kahn 算法 · O(V + E) · 环检测
前缀 和
前置花一次 O(N),让每次区间查询摊销到 O(1) —— 反过来用,又能实现廉价的区间更新。共 4 个子模式。
一维 · 二维 · 差分 · 哈希
最短 路径
从源点出发到所有节点的最短距离 —— 机制按「边能携带什么」分叉。等权用 BFS,非负权用 Dijkstra,允许负权用 Bellman-Ford,全源用 Floyd-Warshall。
BFS · Dijkstra · Bellman-Ford · Floyd-Warshall
区间 合并
先按起点排序,然后线性扫一遍 —— 每个区间要么把当前合并区间向右扩,要么把它提交后另起一段。整个模式就是这一次比较。
排序 + 线性扫描 · O(N log N)
位 运算
把整数当作它的二进制位看,而不是它的数值 —— 一个数对自己异或得 0,对 0 异或保持不变。难点在于看出问题里隐藏的位级结构。
XOR · 位掩码 · O(N)
循环 排序
当取值落在 [0, N] 或 [1, N] 时,下标本身就是指针 —— 换回家或翻符号标记已见。缺失 / 重复一族问题坍缩到 O(N) 时间、O(1) 空间。
下标即指针 · O(N)
扫描 线
把每个区间拆成起点 +1、终点 −1 两个事件,按位置排序后扫一遍。运行的活跃数随事件升降 —— 它的峰值就是「同时最多」类问题的答案。
端点事件 · 运行峰值 · O(N log N)
贪心
每一步取局部最优,并能证明这次提交后续不会被推翻。没有回溯、没有 DP 表。
区间调度 · 跳跃游戏 · 加油站
线段 树
平衡二叉树的每个节点持有一段区间的聚合值。任意区间都能拆成 O(log N) 个已存在的节点片段 —— 区间查询、点更新都是 O(log N)。
区间查询 · 点更新 · O(log N)
树状 数组
用最低位 1 编织出来的隐式树 —— O(log N) 的点更新和前缀和,十行代码,完全不必分配一棵树。
隐式树 · lowbit · O(log N)
字符串 匹配
在文本 T 中找模式 P,从 O(N·M) 压到 O(N + M)。三个子模式只是预处理的对象不同:失败函数、滚动哈希、或 Z 数组。
KMP · Rabin-Karp · Z 算法
矩阵
矩阵是一片二维坐标空间,关键在于走的顺序 —— 转置加行翻转、四边向内收缩、或从单调角出发的阶梯。
旋转 · 螺旋 · 阶梯搜索
数论
认出题目底下的数论结构(整除、取模、乘性),O(N) 的循环就坍缩成 O(log N) 或 O(N log log N)。
GCD · 快速幂 · 素数筛
最小 生成树
把一张带权无向图所有节点连起来的最便宜方式 —— 恰好 N−1 条边、无环、总权重最小。
Kruskal · Prim
缓存 淘汰
容量固定的存储,get 和 put 都要 O(1)。每种淘汰策略都是同一个问题的不同答案:满了之后该丢哪个?
LRU · LFU · O(1) get/put
单调 双端队列
两端各司其职 —— 队首在窗口滑过时弹出过期下标,队尾把被新值压制的丢掉。队首始终是当前窗口的最大值,O(1) 取到。
滑窗最值 · O(N)
双向 BFS
从源点和目标点同时跑 BFS,在中点相遇。当两端都已知时,把最短路搜索从 O(b^d) 降到 O(b^(d/2))。
中点相遇 · O(b^(d/2))
线性代数 入门文章
读懂任何 Transformer 图示前所需的最少线性代数 —— 向量、点积、矩阵乘法、余弦相似度、范数、转置。9 个短小主题,图形化讲解。
概率与统计 入门文章
读懂任何 LLM 训练论文前所需的最少概率 —— 概率到底是什么、概率分布、条件概率、期望与方差、对数概率。5 个短小主题,文字优先。
微积分 入门文章
读懂任何深度学习论文前所需的最少微积分 —— 导数、偏导数、链式法则(= 反向传播)、驱动每个优化器的梯度。不讲积分。
数据 基础文章
每条 ML 流水线绕不过的最少数据管道 —— 样本、特征 vs 标签、训练 / 验证 / 测试划分、ASCII / UTF-8(LLM 真正吃的字节)、标准化与清洗。
监督学习 入门文章
读懂任何 ML 论文前所需的最少「学习理论」—— 输入到输出的映射、损失函数、基于梯度的优化、过拟合 vs 泛化、把模型从陷阱里拽出来的正则化。
梯度下降 入门文章
训练每个现代模型的优化器 —— 一行更新规则、调得最多的超参数(学习率)、基于小批量的 SGD、epoch / iteration / step 词汇,以及跑几百万次的训练循环。
神经网络 入门文章
每个深度模型的积木 —— 单个神经元、让非线性成为可能的激活函数、层(共享输入的一排神经元),以及把输入过遍每一层的前向传播。
反向传播 入门文章
把「算每个参数的梯度」从「不可能」变成「一遍反向就够」的算法 —— 用链式法则的反向传播、为啥权重不能全初始化为 0、梯度消失 / 梯度爆炸,以及躲在每个 Transformer 块里的 MLP。
损失与稳定性 入门文章
每篇深度学习论文都默认你会的 4 件工具 —— softmax(分数 → 分布)、cross-entropy(配套的损失)、dropout(最粗暴的正则化器),以及 BatchNorm / LayerNorm(把激活按住的归一化层)。
LLM 中的文本 入门文章
文本是 ML 最难处理的数据类型,也正是 Transformer 要解的问题 —— 变长、顺序会翻转意义、每个 token 的意思都依赖上下文,以及 Transformer 之前那些「各搞定一部分,从来没全搞定」的方案。
RNN 与 LSTM 入门文章
Transformer 之前那段历史(可以跳)—— 一次看一个 token 的基础 RNN、带门控解决长程依赖的 LSTM / GRU,以及让循环时代落幕的三个结构性优势(并行、长距离记忆、无瓶颈)。
硬件与张量 入门文章
深度学习的物理层 —— 为什么 GPU 吃下所有工作(几千个又笨又并行的核)、为什么 VRAM 是「能跑多大 LLM」最硬的约束、张量到底是什么,以及批量 / 填充 / 掩码怎么把变长文本打包成 GPU 友好的矩形。
框架与自动微分 入门文章
深度学习的软件层 —— PyTorch、JAX、TensorFlow 的一览,自动微分(你写前向、框架免费把所有梯度还你),以及让这个魔法成立的计算图。
优化器与训练技巧 入门文章
LLM 训练的实战机械装置 —— SGD → Adam → AdamW(LLM 默认)、学习率调度(warmup + 余弦衰减)、混合精度训练(fp16 / bf16),以及让万亿参数训练成立的三种分布式并行(data / tensor / pipeline)。
词嵌入 入门文章
文本 → 数字:从稀疏 one-hot 到稠密词嵌入(Word2Vec、GloVe)的旅程、著名的 king − man + woman ≈ queen 类比,以及静态词嵌入为什么仍然不够 —— 没有上下文。
分词 入门文章
文本怎么变成 LLM 的输入 —— 字符 / 单词 / 子词的取舍、BPE(GPT 用的算法)、WordPiece / SentencePiece / Unigram,以及现代 LLM 词表为什么坐落在 5 万 – 20 万。
自注意力 入门文章
每个 Transformer 的核心机制 —— Query / Key / Value、分数矩阵 Q · Kᵀ、带 √d_k 和 softmax 的缩放点积、以及 value 的加权和。一个完整的小例子,从头走到尾。
多头注意力 入门文章
一个 attention 头为啥不够 —— 拆、并行、合。Q/K/V 在 h 个头上切分,每个头学一种不同的关系,最后用 W_O 投影把各头的输出混回来。
位置编码 入门文章
自注意力不知道顺序。Transformer 通过给每个 token 注入位置信息来解决这个问题 —— 正弦余弦图样(原论文)、学习式嵌入(GPT-2)、或 RoPE(现代标准,Llama、Qwen、DeepSeek 都用)。
Transformer Block 入门文章
一个 Transformer 块的完整结构 —— LayerNorm / RMSNorm、残差连接、position-wise FFN —— 以及 N 个这样的块怎么堆成一个完整模型。AI 前置知识栈的收官之作。
Transformer 前向传播即将上线
把一段 prompt 从头走一遍 LLM —— 切分、编码位置、注意、解码下一个 token、缓存复用。五个有序阶段,每个都是独立模式。
切分 · 编码 · 注意 · 解码 · 缓存
二进制与数制 入门文章
你程序里的每个字节,本质上都只是 8 位 —— 整数靠补码、浮点靠 IEEE-754、内存布局靠大端 / 小端。上面所有层都默认你懂的衬底。
CPU 体系结构 入门文章
一颗 CPU 核心里到底有什么 —— 寄存器、ALU、控制单元、流水线、分支预测器、乱序执行。为什么你那段紧凑循环比汇编看起来快了 20 倍。
内存层级 入门文章
L1 缓存(1 ns)到磁盘(10 ms),中间隔了整整 6 个数量级。局部性原理是决定你代码「快」还是「慢」的唯一规则。
缓存一致性 入门文章
MESI 协议让多核缓存保持一致 —— 而一条 64 字节缓存行上的伪共享(false sharing),能悄悄把多线程吞吐砍半。
汇编与指令集 入门文章
编译器到底吐出了什么 —— x86 vs ARM、寄存器 vs 内存、syscall 为什么特殊。把你的代码和硅片黏起来的那一薄层。
进程与线程 入门文章
进程 = 地址空间 + PCB;线程 = 进程里一个可调度的上下文。用户态 vs 内核态,以及每次系统调用都得付的 1–2 微秒上下文切换。
CPU 调度 入门文章
Linux CFS 怎么决定下一个跑谁 —— 虚拟运行时间、nice 值、抢占、实时策略。「为啥我延迟敏感的任务被饿死了」的答案就在这里。
虚拟内存 入门文章
页表、TLB、缺页中断、mmap、写时复制、swap。你每解引用一个指针,都隔着一次地址翻译才到物理内存。
内存分配 入门文章
栈 vs 堆、malloc / free、碎片化、jemalloc / tcmalloc / mimalloc。为什么换一个分配器,多线程服务器的吞吐能翻倍。
系统调用与中断 入门文章
控制权穿越用户 / 内核界限的两条路 —— 你的代码主动请求(syscall),或硬件强迫(中断)。每一次 I/O 都依赖的管道。
文件系统 入门文章
inode、目录、日志(journaling)、page cache,以及 fsync 的残酷诚实。「我写完了」和「它能扛住断电」是两句不一样的话。
I/O 模型 入门文章
阻塞 / 非阻塞 / select / poll / epoll / kqueue / io_uring,加上零拷贝。把 1K 连接和 1M 连接区分开来的架构选择。
并发原语 入门文章
Mutex、信号量、condvar、futex、atomics、内存序。每个 lock-free 或 lock-based 算法都用这几样搭出来 —— 而其中(内存序)所有人都会写错。
网络栈 入门文章
OSI 实用版:一个 packet 怎么从你的 socket 走到网卡 —— 以太网帧、IP 头、TCP / UDP 段,层层套在 14 + 20 + 20 字节里。
TCP 深入 入门文章
三次握手、滑动窗口、拥塞控制(Reno → CUBIC → BBR)、TIME_WAIT、Nagle。「我连接为啥这么慢」的答案,八成藏在这里。
DNS 与 HTTP 入门文章
域名怎么变成 IP;HTTP/1.1 vs HTTP/2 vs HTTP/3 (QUIC);keep-alive、headers、body framing。所有 web 栈都坐着的应用层。
TLS 与安全 入门文章
TLS 1.3 握手、X.509 证书、PKI 信任链、mTLS。那把绿色小锁到底是怎么工作的 —— 以及它失效时坏在哪里。
磁盘存储 入门文章
HDD 寻道时间 vs SSD 随机读、IOPS vs 吞吐、写放大、RAID 级别。每个数据库底下都坐着的物理学。
数据库存储 入门文章
B 树(Postgres / MySQL)vs LSM 树(RocksDB / Cassandra)、WAL、页管理、缓冲池。决定写吞吐 vs 读延迟的两组数据结构。
事务 入门文章
ACID、四个隔离级别各自挡住了什么、MVCC、两阶段提交。为啥不同数据库说「一致」时,指的根本不是一回事。
Web 请求全链路 入门文章
跟着一次 `curl https://api.example.com/user/42` 从头走到尾 —— 键盘敲击、系统调用、TCP、TLS、DNS、内核调度、page cache、B 树查找,再原路返回。串起本栈所有 primer 的收官之作。