2-3树(B树)中的求职面试题

Job interview question in 2-3 trees (B trees)

这是求职面试问题的一部分,在第二部分变得更难了。

给定两棵 2-3 树 T1 和 T2,使得每棵树的 h 已知(h 表示高度)和 m,每棵树的 M 也是已知的( m 表示最小值,M 表示最大值),再加上 T1 中的每个节点 < T2 中的每个节点。 我被要求找到一种算法将它们都连接到 O(|h1-h2|+1)

中的一棵树中

这个很简单,我必须指出这个算法可能会导致 h 比前两个大的树。

现在, 我得到了 k 2-3 棵树(T1、T2、T3...Tk),条件完全相同,而且知道 h_1<=h_2<=...<=h_k没有三棵树具有相同的高度 将它们加入 O(h_k-h_1+k)

起初我考虑过使用之前的算法将前两个连接在一起,然后将第三个连接到结果等等,但我觉得这里出了问题,因为我没有利用“没有三棵树的高度相同。

我在这里缺少什么?

您的解决方案是正确的,但如果您有超过 2 棵相同高度的树,则不会正确。例如,如果你有 k 棵高度相同的树,那么前两棵确实会在 O(h_1 - h_1) = O(1) 时间内合并,但最终的高度可能会变成 h_1 + 1。虽然它可能会变成,也可能不会,但让我证明一切都可能出错。

在一棵高度为 n 的树中,我们可以拥有的最大键数是 3^(n+1)-1。这是因为每个顶点最多有 3 个子树,因此第 i 层有 3^i 个顶点,添加 n 层将导致 (3^(n + 1) - 1)/2 个顶点。因为在这种情况下每个顶点都有 2 个键,所以键的总数是 3^(n + 1) - 1.

因此,如果我们合并4棵这样的最大树,我们肯定会得到一棵高度增加2的树,合并16棵树会得到高度增加3的树,依此类推。因此,虽然前 3 次合并是在恒定时间内完成的,但接下来的 12 次合并慢了两倍,接下来的 48 次合并慢了 3 倍,依此类推。从 1 开始到 log(k).

,每个 i 需要执行 Ω(i) 次操作 Ω(3^(i+1) - 3^i)

因为Ω(3^log(k)) = Ω(k)这个总和肯定是Ω(k log k),因此不适合给定的渐近边界。

当没有3棵树共享相同的高度时,不会出现这个问题,因为每当合并两棵树时,结果高度是max(h_i, h_(i+1)) + 1 = h_(i+1) + 1,而h_(i+3) >= h_(i+1) + 1,因此合并部分的高度永远不会在下一棵树之上,这就是 +k 部分在渐近边界中的来源。