以下按平衡树类、多路查找树、链表优化、位运算结构、索引结构五大分类,逐一拆解核心原理、性质、操作逻辑、复杂度与典型应用,覆盖后端面试高频考点。
一、平衡二叉搜索树类
二叉搜索树(BST)在极端情况下会退化为链表(O (n) 复杂度),平衡树通过约束树高,将查找 / 插入 / 删除稳定在 O(log n)。
1. AVL 树(高度平衡二叉搜索树)
核心定义
AVL 是严格平衡的二叉搜索树,通过平衡因子约束树高:
- 平衡因子 = 左子树高度 - 右子树高度,任意节点的平衡因子绝对值 ≤ 1。
- 树高始终保持在 O (log n),是平衡度最高的二叉搜索树。
关键操作:旋转调平
插入 / 删除节点后,若平衡因子被打破,通过四种旋转恢复平衡:
- LL 型(左左):根节点左子树的左子节点插入 → 单次右旋。
- RR 型(右右):根节点右子树的右子节点插入 → 单次左旋。
- LR 型(左右):根节点左子树的右子节点插入 → 先左旋左子树,再右旋根节点。
- RL 型(右左):根节点右子树的左子节点插入 → 先右旋右子树,再左旋根节点。
特性与应用
- 复杂度:查找 O (log n),插入 / 删除最坏 O (log n) 次旋转。
- 优势:查询效率极高,树高最矮。
- 劣势:插入删除的平衡调整开销大,严格平衡导致频繁旋转。
- 适用场景:读多写少、对查询性能要求极高的场景,实际工程中使用较少。
2. 红黑树(近似平衡二叉搜索树)
核心性质
红黑树通过颜色约束实现近似平衡,最长路径长度不超过最短路径的 2 倍,核心五条规则:
- 每个节点非红即黑;
- 根节点必须是黑色;
- 所有叶子节点(空节点 NIL)都是黑色;
- 红色节点的两个子节点必须是黑色(不能出现连续红节点);
- 任意节点到其所有叶子节点的路径上,黑色节点数量相同(黑高一致)。
关键操作:变色 + 旋转
插入新节点默认红色(对黑高影响最小),若破坏规则则通过变色、左旋、右旋调整:
- 插入:最多 2 次旋转即可恢复平衡;
- 删除:最多 3 次旋转即可恢复平衡。
特性与应用
- 复杂度:查找 / 插入 / 删除均为稳定 O (log n)。
- 优势:平衡要求松弛,插入删除的调整开销远小于 AVL,综合性能更优。
- 适用场景:工程主流平衡树,如 C++ STL map/set、Java TreeMap、Linux 进程调度 CFS 红黑树。
【高频对比】AVL 树 vs 红黑树
表格
| 维度 | AVL 树 | 红黑树 |
|---|---|---|
| 平衡程度 | 严格平衡,树高更矮 | 近似平衡,树高略高 |
| 查询性能 | 更快 | 略慢(仍为 O (log n)) |
| 插入删除开销 | 大,最多 O (log n) 旋转 | 小,最多常数次旋转 |
| 维护成本 | 高 | 低 |
| 适用场景 | 读密集、写极少 | 读写均衡,通用场景 |
二、多路平衡查找树:B 树 & B+ 树
二叉平衡树在磁盘存储场景下,树高仍会导致过多磁盘 IO。B 树系列是多路平衡树,通过降低树高大幅减少 IO 次数,是数据库、文件系统索引的核心。
1. B 树(B - 树)
核心定义(m 阶 B 树)
m 阶表示每个节点最多有 m 个子节点,核心约束:
- 非根节点的子节点数 ≥ ⌈m/2⌉,关键字数 = 子节点数 - 1;
- 根节点至少 2 个子节点(非叶子时);
- 节点内关键字有序升序排列;
- 所有叶子节点在同一层,叶子节点不存储数据指针。
- 每个节点同时存储关键字 + 数据 / 数据指针。
关键操作
- 插入:找到对应叶子节点插入,若节点关键字数超过 m-1,则从中间关键字分裂为两个节点,中间关键字上浮到父节点。
- 删除:删除后若节点关键字数不足 ⌈m/2⌉ - 1,则向兄弟节点借关键字,或与兄弟节点合并。
2. B+ 树(B 树变体,数据库索引核心)
B+ 树是对 B 树的优化,也是 MySQL 等数据库索引的默认实现,核心差异:
- 数据分层:非叶子节点仅存索引关键字,不存储数据;所有数据全部存在叶子节点。
- 叶子链表:所有叶子节点通过双向链表串联,天然支持有序范围查询。
- 关键字数量:非叶子节点的关键字数 = 子节点数,每个关键字对应一个子树的最大值索引。
为什么数据库首选 B+ 树而非 B 树?
- IO 次数更少:非叶子节点不存数据,同样大小的磁盘页可容纳更多关键字,树更矮,磁盘 IO 次数更少。
- 范围查询高效:叶子节点链表串联,只需定位起点后遍历链表即可,无需 B 树的中序遍历回溯。
- 查询性能稳定:所有查询都要走到叶子节点,查询路径长度一致,性能稳定。
- 扫表更方便:遍历叶子链表即可完成全表扫描,无需遍历整棵树。
【高频对比】B 树 vs B+ 树
表格
| 维度 | B 树 | B+ 树 |
|---|---|---|
| 数据存储 | 所有节点都存数据 | 仅叶子节点存数据 |
| 范围查询 | 需中序遍历,效率低 | 叶子链表直接遍历,效率高 |
| 查询稳定性 | 不稳定,可能非叶子命中 | 稳定,必须走到叶子 |
| 节点关键字数 | 关键字数 = 子节点数 - 1 | 关键字数 = 子节点数 |
| 磁盘 IO 开销 | 略高 | 更低 |
| 典型应用 | 文件系统部分索引 | MySQL 索引、数据库索引 |
三、跳表(Skip List)
跳表是基于有序链表的多层索引结构,用空间换时间,将有序链表的查找复杂度从 O (n) 优化到平均 O (log n),是红黑树的经典替代方案。
核心原理
- 多层索引结构:
- 最底层(第 0 层)是完整的有序链表,包含所有元素;
- 上层是下层的稀疏索引,每个节点按随机概率决定是否晋升到上一层(理想情况下第 i 层节点数是第 i-1 层的 1/2)。
- 查找逻辑:从最高层开始,向右查找直到下一个节点大于目标值,再向下一层继续,直到底层找到目标或确定不存在。
- 插入 / 删除:先找到插入位置,随机生成新节点的层数,再在每一层对应位置插入 / 删除节点,仅修改相邻节点指针。
特性与应用
- 复杂度:平均查找 / 插入 / 删除 O (log n),最坏 O (n)。
- 优势:
- 实现简单,无需复杂的旋转变色逻辑;
- 天然支持范围查询,结果有序;
- 并发友好:修改仅影响局部节点,加锁粒度远小于红黑树。
- 劣势:有额外索引空间开销,内存占用略高。
- 典型应用:Redis ZSet、LevelDB / RocksDB 内存表 MemTable、Lucene 倒排索引跳跃表。
四、位运算型数据结构
1. 位图(Bitmap)
核心原理
用一个 bit 位表示一个元素的布尔状态(0 = 不存在 / 未标记,1 = 存在 / 已标记),通过数组承载 bit 位,利用位运算实现高效操作。
例如用 32 位整型数组存储:
- 元素
x对应数组下标:index = x / 32 - 对应 bit 位偏移:
offset = x % 32 - 置位:
arr[index] |= 1 << offset - 清零:
arr[index] &= ~(1 << offset) - 判断:
arr[index] & (1 << offset)
特性与应用
- 空间效率极高:1 亿个整数的存在性标记仅需约 12 MB(1 亿 bit ≈ 12.5 MB)。
- 优势:运算速度极快,空间占用极小,支持批量与或运算。
- 劣势:只能表示布尔状态,元素范围不能过大,否则空间爆炸。
- 典型场景:海量数据去重、整数排序、用户在线状态标记、权限位控制、布隆过滤器底层基础。
2. 布隆过滤器(Bloom Filter)
核心原理
布隆过滤器是基于位图的概率型数据结构,用于判断「元素一定不存在」或「元素可能存在」,核心是空间换时间、容忍少量假阳性。
- 底层是一个 m 位的位图 + k 个独立哈希函数;
- 插入元素:用 k 个哈希函数计算出 k 个不同的位图下标,将对应 bit 位置 1;
- 查询元素:同样计算 k 个下标,若任意一个 bit 位为 0,则元素一定不存在;若全为 1,则元素可能存在。
核心特性
- 无漏判:存在的元素一定能被检测到(不会出现假阴性)。
- 有误判:不存在的元素可能因哈希位重叠被误判为存在(假阳性)。
- 普通布隆过滤器不支持删除:多个元素共享 bit 位,直接清零会影响其他元素;计数布隆过滤器用计数器替代 bit 位可支持删除,但空间开销大幅上升。
影响误判率的因素
- 位图越大、哈希函数数量越合理、元素越少,误判率越低。
- 最优哈希函数个数:
k = (m/n) * ln2(m 为位图大小,n 为元素数)。
典型应用
- 缓存穿透防护:先过滤不存在的 key,避免请求打到数据库;
- 爬虫 URL 去重、邮箱黑名单过滤;
- 数据库前置查询过滤:快速排除不存在的数据,减少磁盘 IO。
五、倒排索引(Inverted Index)
倒排索引是全文搜索引擎的核心数据结构,本质是「关键词 → 文档列表」的映射,与正排索引(文档 → 关键词)互为反向。
核心结构
倒排索引由两部分组成:
- 词典(Term Dictionary):存储所有出现过的关键词,以及指向对应倒排列表的指针,通常用 B+ 树或哈希表实现快速查找。
- 倒排列表(Posting List):每个关键词对应一个有序列表,存储包含该词的所有文档 ID,以及词频(TF)、位置、偏移量等信息,用于相关性排序。
工作流程
- 构建索引:对所有文档分词,遍历每个关键词,将文档 ID 追加到对应倒排列表中。
- 查询检索:
- 对查询语句分词,得到多个关键词;
- 分别取出每个关键词的倒排列表;
- 对多个倒排列表求交集 / 并集,得到最终文档集合;
- 根据词频、位置等信息计算相关性得分,排序返回。
典型应用
- 全文搜索引擎:Elasticsearch、Lucene、Solr;
- 站内搜索、电商商品搜索;
- 日志检索系统。
六、核心选型总结
表格
| 数据结构 | 核心优势 | 典型适用场景 |
|---|---|---|
| 红黑树 | 读写均衡、性能稳定、有序 | 通用有序键值存储、语言标准库 |
| B+ 树 | 低树高、范围查询强、IO 友好 | 数据库索引、磁盘存储索引 |
| 跳表 | 实现简单、并发友好、范围查询 | Redis ZSet、KV 存储引擎内存表 |
| 位图 | 空间极小、运算极快 | 海量布尔状态标记、整数去重排序 |
| 布隆过滤器 | 超小空间、快速判存 | 缓存穿透防护、去重前置过滤 |
| 倒排索引 | 全文关键词快速检索 | 搜索引擎、全文检索系统 |

366

被折叠的 条评论
为什么被折叠?



