校招必背:从红黑树到布隆过滤器的核心考点全梳理

以下按平衡树类、多路查找树、链表优化、位运算结构、索引结构五大分类,逐一拆解核心原理、性质、操作逻辑、复杂度与典型应用,覆盖后端面试高频考点。


一、平衡二叉搜索树类

二叉搜索树(BST)在极端情况下会退化为链表(O (n) 复杂度),平衡树通过约束树高,将查找 / 插入 / 删除稳定在 O(log n)

1. AVL 树(高度平衡二叉搜索树)

核心定义

AVL 是严格平衡的二叉搜索树,通过平衡因子约束树高:

  • 平衡因子 = 左子树高度 - 右子树高度,任意节点的平衡因子绝对值 ≤ 1。
  • 树高始终保持在 O (log n),是平衡度最高的二叉搜索树。
关键操作:旋转调平

插入 / 删除节点后,若平衡因子被打破,通过四种旋转恢复平衡:

  1. LL 型(左左):根节点左子树的左子节点插入 → 单次右旋。
  2. RR 型(右右):根节点右子树的右子节点插入 → 单次左旋。
  3. LR 型(左右):根节点左子树的右子节点插入 → 先左旋左子树,再右旋根节点。
  4. RL 型(右左):根节点右子树的左子节点插入 → 先右旋右子树,再左旋根节点。
特性与应用
  • 复杂度:查找 O (log n),插入 / 删除最坏 O (log n) 次旋转。
  • 优势:查询效率极高,树高最矮。
  • 劣势:插入删除的平衡调整开销大,严格平衡导致频繁旋转。
  • 适用场景:读多写少、对查询性能要求极高的场景,实际工程中使用较少。

2. 红黑树(近似平衡二叉搜索树)

核心性质

红黑树通过颜色约束实现近似平衡,最长路径长度不超过最短路径的 2 倍,核心五条规则:

  1. 每个节点非红即黑;
  2. 根节点必须是黑色;
  3. 所有叶子节点(空节点 NIL)都是黑色;
  4. 红色节点的两个子节点必须是黑色(不能出现连续红节点);
  5. 任意节点到其所有叶子节点的路径上,黑色节点数量相同(黑高一致)。
关键操作:变色 + 旋转

插入新节点默认红色(对黑高影响最小),若破坏规则则通过变色、左旋、右旋调整:

  • 插入:最多 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 个子节点,核心约束:

  1. 非根节点的子节点数 ≥ ⌈m/2⌉,关键字数 = 子节点数 - 1;
  2. 根节点至少 2 个子节点(非叶子时);
  3. 节点内关键字有序升序排列;
  4. 所有叶子节点在同一层,叶子节点不存储数据指针。
  5. 每个节点同时存储关键字 + 数据 / 数据指针
关键操作
  • 插入:找到对应叶子节点插入,若节点关键字数超过 m-1,则从中间关键字分裂为两个节点,中间关键字上浮到父节点。
  • 删除:删除后若节点关键字数不足 ⌈m/2⌉ - 1,则向兄弟节点借关键字,或与兄弟节点合并。

2. B+ 树(B 树变体,数据库索引核心)

B+ 树是对 B 树的优化,也是 MySQL 等数据库索引的默认实现,核心差异:

  1. 数据分层:非叶子节点仅存索引关键字,不存储数据;所有数据全部存在叶子节点。
  2. 叶子链表:所有叶子节点通过双向链表串联,天然支持有序范围查询。
  3. 关键字数量:非叶子节点的关键字数 = 子节点数,每个关键字对应一个子树的最大值索引。
为什么数据库首选 B+ 树而非 B 树?
  • IO 次数更少:非叶子节点不存数据,同样大小的磁盘页可容纳更多关键字,树更矮,磁盘 IO 次数更少。
  • 范围查询高效:叶子节点链表串联,只需定位起点后遍历链表即可,无需 B 树的中序遍历回溯。
  • 查询性能稳定:所有查询都要走到叶子节点,查询路径长度一致,性能稳定。
  • 扫表更方便:遍历叶子链表即可完成全表扫描,无需遍历整棵树。

【高频对比】B 树 vs B+ 树

表格

维度B 树B+ 树
数据存储所有节点都存数据仅叶子节点存数据
范围查询需中序遍历,效率低叶子链表直接遍历,效率高
查询稳定性不稳定,可能非叶子命中稳定,必须走到叶子
节点关键字数关键字数 = 子节点数 - 1关键字数 = 子节点数
磁盘 IO 开销略高更低
典型应用文件系统部分索引MySQL 索引、数据库索引

三、跳表(Skip List)

跳表是基于有序链表的多层索引结构,用空间换时间,将有序链表的查找复杂度从 O (n) 优化到平均 O (log n),是红黑树的经典替代方案。

核心原理
  1. 多层索引结构
    • 最底层(第 0 层)是完整的有序链表,包含所有元素;
    • 上层是下层的稀疏索引,每个节点按随机概率决定是否晋升到上一层(理想情况下第 i 层节点数是第 i-1 层的 1/2)。
  2. 查找逻辑:从最高层开始,向右查找直到下一个节点大于目标值,再向下一层继续,直到底层找到目标或确定不存在。
  3. 插入 / 删除:先找到插入位置,随机生成新节点的层数,再在每一层对应位置插入 / 删除节点,仅修改相邻节点指针。
特性与应用
  • 复杂度:平均查找 / 插入 / 删除 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)

核心原理

布隆过滤器是基于位图的概率型数据结构,用于判断「元素一定不存在」或「元素可能存在」,核心是空间换时间、容忍少量假阳性。

  1. 底层是一个 m 位的位图 + k 个独立哈希函数;
  2. 插入元素:用 k 个哈希函数计算出 k 个不同的位图下标,将对应 bit 位置 1;
  3. 查询元素:同样计算 k 个下标,若任意一个 bit 位为 0,则元素一定不存在;若全为 1,则元素可能存在
核心特性
  • 无漏判:存在的元素一定能被检测到(不会出现假阴性)。
  • 有误判:不存在的元素可能因哈希位重叠被误判为存在(假阳性)。
  • 普通布隆过滤器不支持删除:多个元素共享 bit 位,直接清零会影响其他元素;计数布隆过滤器用计数器替代 bit 位可支持删除,但空间开销大幅上升。
影响误判率的因素
  • 位图越大、哈希函数数量越合理、元素越少,误判率越低。
  • 最优哈希函数个数:k = (m/n) * ln2(m 为位图大小,n 为元素数)。
典型应用
  • 缓存穿透防护:先过滤不存在的 key,避免请求打到数据库;
  • 爬虫 URL 去重、邮箱黑名单过滤;
  • 数据库前置查询过滤:快速排除不存在的数据,减少磁盘 IO。

五、倒排索引(Inverted Index)

倒排索引是全文搜索引擎的核心数据结构,本质是「关键词 → 文档列表」的映射,与正排索引(文档 → 关键词)互为反向。

核心结构

倒排索引由两部分组成:

  1. 词典(Term Dictionary):存储所有出现过的关键词,以及指向对应倒排列表的指针,通常用 B+ 树或哈希表实现快速查找。
  2. 倒排列表(Posting List):每个关键词对应一个有序列表,存储包含该词的所有文档 ID,以及词频(TF)、位置、偏移量等信息,用于相关性排序。

工作流程

  1. 构建索引:对所有文档分词,遍历每个关键词,将文档 ID 追加到对应倒排列表中。
  2. 查询检索
    • 对查询语句分词,得到多个关键词;
    • 分别取出每个关键词的倒排列表;
    • 对多个倒排列表求交集 / 并集,得到最终文档集合;
    • 根据词频、位置等信息计算相关性得分,排序返回。

典型应用

  • 全文搜索引擎:Elasticsearch、Lucene、Solr;
  • 站内搜索、电商商品搜索;
  • 日志检索系统。

六、核心选型总结

表格

数据结构核心优势典型适用场景
红黑树读写均衡、性能稳定、有序通用有序键值存储、语言标准库
B+ 树低树高、范围查询强、IO 友好数据库索引、磁盘存储索引
跳表实现简单、并发友好、范围查询Redis ZSet、KV 存储引擎内存表
位图空间极小、运算极快海量布尔状态标记、整数去重排序
布隆过滤器超小空间、快速判存缓存穿透防护、去重前置过滤
倒排索引全文关键词快速检索搜索引擎、全文检索系统
谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c23856

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值