【问题标题】:Keeping avl tree balanced without rotations保持 avl 树平衡而不旋转
【发布时间】:2021-10-31 06:07:41
【问题描述】:

B 树是类似于 AVL 树的自平衡树。 HERE 我们可以看到如何使用左右旋转来保持 AVL 树的平衡。

HERE 是一个解释插入 B 树的链接。如果我没记错的话,这种插入技术不涉及任何旋转,以保持树平衡。因此它看起来更简单。

问题:是否有任何类似的(或任何其他不使用旋转的技术)来保持 avl 树的平衡?

【问题讨论】:

  • B树不是二叉树。
  • (在 geeksforgeeks 的示例中(第二个 HERE,“插入 90 后”的图表似乎不正常。)有 2-3 tree - 看看那里和 B 树中的删除,也是。
  • @greybeard 它们不是二叉树。
  • 定义“看起来更简单”。 B-trees 擅长解决 AVL 树不擅长的一种问题(旋转磁盘存储速度慢),而 AVL 和其他二叉树平衡技术各有优势(例如,无需浪费内存)。预期的应用是什么?

标签: algorithm data-structures b-tree avl-tree tree-balancing


【解决方案1】:

答案是……是也不是。

B-trees 不需要执行旋转,因为它们在可以打包到一个节点中的不同键的数量上有一些松弛。随着您将越来越多的键添加到 B 树中,您可以通过将这些键吸收到节点本身来避免树变得不平衡。

二叉树没有这种奢侈。如果您将一个键插入二叉树,它会在所有情况下将该树中某个分支的高度增加 1,因为该键需要进入它自己的节点。旋转通过确保如果某些树枝长得太多,则该高度会转移到树的其余部分,从而对抗树的整体生长。

大多数平衡 BST 都有某种涉及轮换的再平衡策略,但并非所有人都这样做。一个不直接涉及旋转的策略的一个值得注意的例子是scapegoat tree,它通过从主树中撕下巨大的子树来重新平衡,优化重建它们,然后将子树粘回到主树中。这种方法技术上不涉及任何旋转,并且是实现平衡树的一种非常干净的方法。

也就是说 - 替罪羊树的最节省空间的实现确实使用旋转将不平衡的树转换为完美平衡的树。您不必必须使用旋转来执行此操作,但如果空间有限,这可能是最好的方法。

希望这会有所帮助!

【讨论】:

【解决方案2】:

旋转可以变得简单(如果您只需要简单)。

如果剩下插入流量,余额-1就是红灯。

如果插入流量正确,则余额 1 是红灯。

这是归一化基本 AVL 平衡的(简化的)粗粒度(2-adic 四舍五入):

{left,even,right} ~ {low,even,high} ~ {green,green,red}

走插入路线并旋转每个红灯(插入前)。如果下一个灯是绿色的,您只需将红灯旋转 1 或 2 次。您可能必须在每次旋转之前重新平衡下一个子树,因为内部子树是不变的。这很简单,但需要很长时间。您必须在每次旋转之前向下移动绿灯。您始终可以将绿灯向下移动到根部,并且可以旋转树顶以生成新的绿灯。

红灯旋转自然地向下移动绿灯。

此时,您只有插入的绿灯。

这种朴素方法的成本结构在拓扑上简化为

df(h)/dh=∫f(h)dh

如sin(h)、sinh(h)等

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2014-01-29
    相关资源
    最近更新 更多