重新平衡算法

重新平衡算法可以通过以下方式执行-

Day-Stout-Warren算法

我们可以使用Day-Stout-Warren算法实现实际的重新平衡方法,它的节点数是线性的。

以下是伪代码中基本DSW算法的介绍。

  • 分配了一个节点,称为“伪根”,并将树的实际根作为伪根的右子节点。

  • 调用tree-to-vine函数将树转换为以伪根为参数的排序链表。

  • 调用vine-to-tree函数,使用伪根和树的大小(元素数)作为参数,将排序后的链表再次转换为树。

  • 树的实际根应该等于伪根的右子。

  • 最后,应该处理伪根。

“写时复制”树

如果我们可以忍受缺乏线性化(即我们写一个值,但是当我们在找不到它之后立即搜索它;它将最终在100ms-10s之后找到),则可以应用“写时复制”树:所有写入操作均由一个线程执行(具有重新平衡功能),并且我们定期将树复制到只读副本中,该副本可以通过读取线程来实现,而无需任何并发控制,因此我们需要以原子方式进行发布。

并发跳过列表

另一个选择是实现并发跳过列表:它提供对数平均个案搜索/删除/插入时间,并且更容易并行化。如果您碰巧要实现Java,则有一个标准的无锁实现。我们可以在此处获取有关并发跳过列表和平衡搜索树的更多信息。特别是,我们可以在那里获得色度树的提及,该色度树表示为针对并发重新平衡进行了优化的二进制搜索树。