b树和b +树只能在他们的叶子上存储数据吗?我假设他们使用内部节点来搜索所需的数据。
是这种情况还是在每个节点中存储数据?
答案 0 :(得分:7)
非叶节点“记录”包含
这些非叶子“记录”按密钥顺序列出,以便通过扫描(或在其中进行二进制搜索)非叶子节点,可以知道下一级中哪个节点可能包含搜索值。
叶节点记录包含完整的数据记录:键值和其他任何内容。
因此“真实”数据仅包含在叶节点中,非叶节点仅包含[值的副本]。 对于一小部分数据 (此比例取决于叶节点中创建的平均数据记录数)。
Wikipedia article on B+ Trees的下图显示了这一点。
顶部的非叶节点(此简化树中唯一的一个)仅包含两个非叶节点记录,每个记录都有一个键值(蓝色)的副本和指向相应节点的指针(灰色)。该树恰好只有两个级别,因此根节点中的“记录”指向叶节点。可以想象还有其他级别(在下面显示的最顶层树之上,称之为“3-5节点”);如果是这种情况,上面的节点将包含(以及其他类似的记录),键值为3的记录带有指向“3-5”节点的指针。
另请注意,只有键值3和5包含在非叶节点中(即,甚至所有键值都在非叶节点中重现)。
BTW在这个例子中,非叶子节点包含下一个节点中 last 记录的密钥(如果使用 first 记录,它也会起作用,在然后实现搜索逻辑。)
叶子节点包含键值(蓝色)和相应的数据记录(d1,d2 ......以灰色显示)。在每个叶子节点的末尾显示的红色指针指向下一个叶子节点,即按键顺序包含下一个数据记录的叶子节点;这些指针对于“扫描”一系列数据记录非常有用。
答案 1 :(得分:1)
所有数据都在树叶中。
答案 2 :(得分:0)
BTrees和B + Trees存在一些混淆。 B + Trees仅将叶节点上的数据存储为指针。这意味着数据必须存储在其他地方。 BTrees可以在每个节点上存储数据。每个都有优点和缺点。我注意到有些网站显示BTree与B + Trees完全相同。一般来说,BTrees更擅长保持实际数据,而B + Trees作为索引效率更高。