节点不在叶中的 B+树?

B+tree with nodes not in leaf?

我有这个B+tree。据我所知,B+树的所有节点都在叶子中,但在这个 B+树中,一些节点不在叶子节点中(例如 40 和 10)。这是为什么?

如果我插入一个已经在树中的元素会怎样?

从概念上讲,B+Tree由两部分组成:序列集(所有叶子,包含键和实际数据)和索引,索引由所有内部节点组成,仅包含键但不包含数据。索引的唯一目的是将搜索引导至正确的叶页。

索引节点中的键不必对应于实际存储在叶节点中的任何键,因为它们只需要将搜索路由到右叶。也就是说,索引只需要分隔键,不需要记录键。

当需要将新键添加到索引时,应用程序可能会选择以某种方式对其进行修改,以使其在某些方面变得更受欢迎(例如,在字符串的情况下更短),同时仍保留其能力将其左 children 与右 children 分开。例如。 'M' 将 'Lehmann' 与 'Schulze' 分开,就像 'Müller' 一样。例如,在数字键的情况下,应用程序可以选择最大左侧 child 和最小右侧 child 之间的算术平均值。

B+Tree索引层出现key而叶子(sequence set)没有对应的'record'key还有一个原因,就是删除。当要从 B+Tree 中删除一个键时,它只会从序列集中删除,序列集中包含 B+Tree 表示的实际数据。如果索引层中有密钥的副本,那么它将被单独保留,因为路由流量仍然需要它。

如果你插入一个已经存在于序列集中的键,那么你就违反了 B+Tree 的结构不变量。这种损坏的实际后果取决于使用 B+Tree 的代码,但是 production-grade 代码会保护其结构的不变量,并且很可能会在您面前抛出异常。