【问题标题】:Is there a fast algorithm to merge sorted B+Trees?有没有一种快速算法来合并排序的 B+树?
【发布时间】:2011-03-07 10:40:01
【问题描述】:

我正在编写一个 dbm 风格的数据库管理器,它使用不可变的 B+Trees 作为存储介质(请参阅http://sf.net/projects/aodbm/)。有没有一种快速的算法来合并两个 B+树(树可能共享节点)?

【问题讨论】:

  • 是不是树A的最大key小于等于树B的最小key。如果是这样,它真的很快,否则我认为你将不得不采用更复杂的算法。
  • @phimuemue,不幸的是,这只是在极度人为的情况下的情况。

标签: algorithm data-structures tree


【解决方案1】:

这是 omega(n) 问题。
证明:假设它具有更好的复杂度 O(d) 和 d
O(n) 解决方案(实际上它当然是 theta(n)):
1.flat T1 和 T2 放入已排序的数组 A1,A2。
2.使用 A 3。用 |T1|+|T2| 构建一棵“几乎满”的空树 T '地方'。
4。用 A 填写 T(按顺序搜索)
5。结果是T。

复杂性:
第 1 步是 O(n)(按顺序搜索)
第 2 步是 O(n) 合并的复杂度(因为 A1、A2 都已排序)
第 3+4 步也是简单的 O(n)

【讨论】:

  • 是的,除了树可以共享节点。在这种情况下,共享节点的子节点不必迭代,因此可能存在O(n) 的算法,其中n 是未共享且父节点有子节点的节点数是共享的。
  • 给定两棵树,你能找到一个共享节点的复杂度是多少?
  • @amit,这是我希望有人能够回答的问题。我有一个想法,可以在两棵树上同时进行广度优先搜索,在这种情况下它是O(n),其中n 是未共享节点的数量。
  • @dan 是共享节点也共享他们所有的孩子吗?因为如果不是这种情况,那么即使您确实设法在 n 是非共享节点的 O(n) 中进行排序,您也需要以某种方式操纵每一个共享节点 - 所以它们的子树也将是排序,这将是 O(|V|-n),你将回到 O(n)。还是我错过了什么?关于找到共享节点 - 我想不出比 BFS 更好的方法(也没有证据)
  • @amit,是的,实际的节点是共享的,因为它是指向同一位置的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2015-04-07
  • 2011-12-22
  • 2020-12-01
相关资源
最近更新 更多