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

Algorithm 如何最大化每个btree节点的元素数,algorithm,b-tree,Algorithm,B Tree,我正在根据一些数据构建一个btree。一旦我构建了btree(即插入所有元素),我就不再插入或删除元素。然而,从某种意义上说,如果每个节点可以有n最大元素,那么生成的btree不是最优的,因为我的节点包含的元素少于n个(问题越严重n越大)。这是我的btree中的一个部分,包含数百个元素,n等于5。该部分包含根节点和几个最底部的节点 如您所见,相当多的节点的元素少于5个。我的问题是: 是否有一种方法可以在构建btree之后“压缩”它,以便所有(可能除了最底部的一些节点)都包含n元素。作为密钥存储

我正在根据一些数据构建一个btree。一旦我构建了btree(即插入所有元素),我就不再插入或删除元素。然而,从某种意义上说,如果每个节点可以有n最大元素,那么生成的btree不是最优的,因为我的节点包含的元素少于n个(问题越严重n越大)。这是我的btree中的一个部分,包含数百个元素,n等于5。该部分包含根节点和几个最底部的节点

如您所见,相当多的节点的元素少于5个。我的问题是:
是否有一种方法可以在构建btree之后“压缩”它,以便所有(可能除了最底部的一些节点)都包含n元素。作为密钥存储在节点中的是32位的值,但我不能保证它们会以任何特定的顺序插入。

如果由于密钥/记录不是按密钥顺序交付的,因此获取打包数据树的经典方法不可行,那么基本上有两种选择:

  • 离线:从头开始构建一个新的打包btree
  • 联机:使用与节点拆分相反的过程就地压缩btree
构建一个新的btree更简单、更快,而且几乎可以就地完成。唯一的额外空间要求是每层btree需要一个页面(或页面缓冲区),以容纳正在构建的新btree的右脊椎。老树的书页一清空,就可以为新树回收

这种方案通常被称为“金字塔”方案或“自下而上的包装”。不用说,它要求在打包过程中使btree完全脱机,或者根据查询的键将查询分派到正确的树(旧的或新的)的函数

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

  • 从父节点下拉分隔符键
  • 从右邻居处提取关键帧,直到该节点已满
  • 向上按右邻座最左边的新键作为分隔符
  • 将右邻接节点设为当前节点,冲洗并重复

这两种方案——压缩建筑和在线压缩——都会使树右侧脊椎上的节点处于填充状态,甚至是空的状态。如果不需要这样做,则可以通过在级别的最后两个节点之间重新分配关键点来修复。这可以通过调用正常btree操作中使用的相同借用/平衡过程来实现。就像包装和压实一样,脊椎的再平衡必须自下而上进行。例如,从最右边的叶子向上到根部。

我没有时间读这篇文章,但是你能改变构建btree的方式,使其在构建过程中紧凑吗?这表明你可以在线性时间内从头开始构建一个紧凑的btree(在顶部的摘要中):那些论文讨论的是“按顺序”插入键,我不能保证。我想我可以在第一个之后重建我的btree(因为我知道顺序),但是这会占用很多内存。。。如果没有其他方法,我会这样做…您的数据来自哪里?问题是我有多个同时获取密钥的btree。密钥在btree之间共享,但我只能保证第一个btree的顺序。其余的都没有,因为假设恰好插入到我的第一个btree中的第一个键(将是0)可能是我的第二个btree中的第25个键(它仍然是零,但我已经有25个其他值了…),谢谢你的回答!你能给我指一些关于在线方法的文献吗?我真的找不到任何东西,也没有编写类似的代码,在非饱和节点的任何子节点上使用拆分过程(并重复,直到树不再改变)。关于离线方法,经典方法是在我的问题评论中的两篇文章中描述的方法?谷歌搜索“B-tree批量加载”应该会给你很多关于离线方法背后思想的信息,比如。LinkedByMisse包含了详细的描述和伪代码,但它使事情变得非常复杂(以至于根本没有什么帮助)。关键的一点是,更改btree节点可能会产生在树中向上冒泡的影响,这就是为什么您必须自下而上逐级工作,以便保护完成的页面不受冒泡更改的影响,并保持与打包页面完全相同的状态。构建打包树和一般批量加载之间的唯一区别是,您将所需的页面利用率设置为100%。该算法的核心是:尝试将传入密钥附加到最右边的叶页面(在验证它是否大于树的当前最大密钥之后);如果最右边的页面已经满了,添加一个空页面作为新的最右边的页面,并尝试以完全相同的方式将键添加到下一个更高的级别。我从未在任何地方见过描述的在线方法,可能是因为这是批量加载背后思想的简单扩展,并且因为它没有什么学术兴趣。我之所以编写它,是因为我发现,与我在帖子中暗示的“老树+新树+调度程序”方案相比,在压缩过程中,它是一种更简单的继续提供查找功能的方法。后者在一些论文中有描述,但主要是作为一种手段,为需要对树结构进行周期重建的算法获得良好的摊销复杂性边界。我接受你的答案,因为就我所知,根据你的答案和你给出的指针