搜索二叉树的应用:K 模型以及 KV 模型

107 阅读3分钟

搜索二叉树的应用: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)存在另一本书里。
当你要查某个单词时:

  1. 先在 BST 中找到这个 Key;
  2. 拿到一个指针/索引;
  3. 跳到外部存储里把 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 / Java TreeMap 每次查 Key 时一定要用到 Value 。所以使用 KV 模型