我正在编写一个类似dbm的数据库管理程序,使用不可变的B+树作为存储介质(请参见http://sf.net/projects/aodbm/)。是否有一种快速算法可以合并两个B+树(其中树可能共享节点)?
我正在编写一个类似dbm的数据库管理程序,使用不可变的B+树作为存储介质(请参见http://sf.net/projects/aodbm/)。是否有一种快速算法可以合并两个B+树(其中树可能共享节点)?
这是一个O(n)问题。
证明:假设它的复杂度更好,为O(d),其中d < n。你可以将B+树排列成一个数组,然后合并两个树就相当于合并两个数组。如果是这样,你可以在O(d)时间内执行merge(A1,A2),使用归并排序可以达到O(dlog(n)) - 矛盾。
一个O(n)解决方案(实际上当然是theta(n)):
1.将T1和T2展平成排序数组A1、A2。
2.使用A <- merge(A1,A2)。
3.用恰好有|T1|+|T2|个“几乎满”的位置构建一个空树T。
4.用A填充T(中序搜索)。
5.结果是T。
复杂度:
步骤1是O(n)(按顺序搜索)。
步骤2是O(n)合并的复杂度(因为A1、A2都是排序的)。
步骤3+4也很容易达到O(n)。
O(n)
,其中n
是未共享且具有具有共享子节点的父节点的子节点数。 - dan_waterworthO(c log n)
,其中c是更改数量,n是树的大小。 - dan_waterworth