如何最大化每个btree节点的元素数量

时间:2015-04-06 16:16:04

标签: algorithm b-tree

我正在从一些数据构建一个btree。一旦我构造了btree(即插入所有元素),我就不再插入或删除元素。然而,在某种意义上,如果我可以非常频繁地每个节点拥有 n 最大元素,那么得到的btree不是最优的。我的节点包含少于n个元素(问题变得越来越严重 n 是)。这是我的btree中有几百个元素, n 等于5的部分。该部分包含根节点和几个最底层节点 enter image description here

正如您所看到的,很多节点的元素少于5个。我的问题是: 有没有办法去"紧凑"构造之后的btree,以便所有(除了一些最底层节点之外)都包含完全 n 元素。什么将存储在节点中,因为键将是32位值,但我不能保证它们将以任何特定顺序插入。

1 个答案:

答案 0 :(得分:1)

如果获取打包的btree的经典方法不可行,因为键/记录不按键顺序传递,那么基本上有两个选项:

  • 离线:从头开始构建一个新的,打包的btree
  • online:使用与节点拆分相反的过程来就地压缩btree

构建新的btree更简单,更快速,并且可以“几乎”就地完成。唯一的额外空间要求包括每个btree级别的一个页面(或页面缓冲区),以保持正在构建的新btree的右侧脊柱。旧树的页面可以在新树清空后立即回收。

这种方案通常被称为“金字塔”计划或“自下而上打包”。不用说,它要求btree在打包期间完全脱机,或者根据查询的密钥将查询分派给正确的树(旧的或新的)。

在线压缩基本上采用相同的逻辑,只是细节有点不同,因为密钥(记录)是从右邻居而不是从输入中提取的。树必须从底部向上逐级压缩,从最左边的叶子开始:

  • 从父节点
  • 下拉分隔符键
  • 来自右邻居的leech键,直到此节点已满
  • 将右侧邻居的新左侧键向上推送为分隔符
  • 使右邻居成为当前节点,冲洗并重复

两种方案 - 打包建筑和在线压缩 - 都可以使树的右侧脊柱上的节点不足或甚至是空的。如果这不合适,那么可以通过在一个级别的最后两个节点之间重新分配密钥来修复它。这可以通过调用在普通btree操作中使用的相同借用/平衡过程来完成。就像打包和压缩一样,这种脊柱重新平衡必须从下往上完成。即从最右边的叶子到根部。