搜索二叉树的应用:K 模型以及 KV 模型
1. 从 BST 到 K/KV 模型
我们之前讲过,搜索二叉树(BST)的本质是:
- 节点按 有序规则存储;
- 查找/插入/删除操作在 O(log n) 的复杂度下完成(理想平衡情况下)。
这种特性让它非常适合做索引结构。
而在实际应用中,搜索二叉树经常被改造并用来支撑两种典型模型:
- K 模型(Key-Only Model)
- KV 模型(Key-Value Model)
这两者其实就是数据存储方式的差别。
接下来分别介绍~
2. K 模型(Key-Only Model)
在介绍这两个模型之前,我们首先需要知道键值对的含义。这个称为字典的结构,由索引键和具体值组成,当我们需要寻找获取某一个具体值时,我们就需要先找到它的索引键,这样的结构就像我们现实生活中的字典。
而在K模型和KV模型中,实际上树的作用就是用来加快查找key的速度,那么只不过是查找的方式不一样了。
K 模型的特点是:
- 树中存储的只有 键(Key) ;
- 具体的值(Value)存放在外部数据区(比如数组、磁盘块、数据文件);
- 树的作用是加速查找 Key,找到位置后,再去外部取 Value。
举个例子:
假设你有一本字典,BST 里存的只是单词(Key),而单词的解释(Value)存在另一本书里。
当你要查某个单词时:
- 先在 BST 中找到这个 Key;
- 拿到一个指针/索引;
- 跳到外部存储里把 Value 取回来。
这种方式的典型应用:
- 数据库索引(B 树 / B+ 树) :索引文件存 Key,Value 存在数据表里。
- 搜索引擎的倒排索引:树里存储关键词(Key),对应的文档列表在外部(Value)。
优点:
- 树节点更小,能在内存里放更多 Key;
- Value 部分可独立存放,支持大对象。
缺点:
- 每次查询 Key 后都要再走一步“跳转取值”,需要额外的 IO 或访问。
3. KV 模型(Key-Value Model)
KV 模型则是:
- 树中直接存储 键值对(Key, Value) ;
- 查找到 Key 的同时,Value 就在节点里,不需要额外跳转。
简单来说就是键与值都在一本字典里。
这种方式的典型应用:
- 内存数据库(Redis、Memcached) :通常用更高效的数据结构,但 KV 的思想是一致的。
- 编程语言容器(map / set) :比如 C++ STL 的
map就是红黑树(BST 的改进版),直接存 Key 和 Value。
优点:
- 查找一步到位,读性能更好。
- 数据紧密存放,代码逻辑更直接。
缺点:
- 节点更大,占用内存多;
- 如果 Value 很大,会影响树结构的存储效率(树高增加,缓存命中率降低)。
4. 它俩怎么选?
- Key 较多,Value 较大,读写时不总需要 Value
→ 适合 K 模型(比如数据库索引,先找到 Key,再按需取 Value)。 - Key 和 Value 都不大,查找时几乎总要用 Value
→ 适合 KV 模型(比如 map、缓存系统)。
这就是为什么数据库和语言容器设计上会不一样:
- 数据库需要高效存放海量 Key,Value 往往是独立的行数据 。所以使用 K 模型;
- C++
map/ JavaTreeMap每次查 Key 时一定要用到 Value 。所以使用 KV 模型。