好的,这是关于计算机科学领域理论方面的又一个问题。
在90年代,我在实现二叉搜索树方面表现得相当不错。但是唯一让我困扰的是平衡二叉树(AVL)的算法复杂性。
你们能帮我解决这个问题吗?
好的,这是关于计算机科学领域理论方面的又一个问题。
在90年代,我在实现二叉搜索树方面表现得相当不错。但是唯一让我困扰的是平衡二叉树(AVL)的算法复杂性。
你们能帮我解决这个问题吗?
然后,就有了将其全部翻译成代码的业务。
我认为仅仅通过查看代码清单,并不能非常有效地帮助任何阶段,因此请忽略它们。即使在最好的情况下,代码明确编写,它看起来也像是过程的教科书描述,但却没有图表。在更典型的情况下,它是一堆C结构操作的混乱。因此,请坚持参考书籍。
最近我一直在做AVL树相关的工作。
我在谷歌上搜索到了关于如何平衡AVL树最好的帮助。
我只是按照这个伪代码编写了代码(如果你理解如何进行旋转,那么实现起来就很容易)。
IF tree is right heavy
{
IF tree's right subtree is left heavy
{
Perform Double Left rotation
}
ELSE
{
Perform Single Left rotation
}
}
ELSE IF tree is left heavy
{
IF tree's left subtree is right heavy
{
Perform Double Right rotation
}
ELSE
{
Perform Single Right rotation
}
}
我同意,完整的程序可能不太合适。
虽然传统的AVL和RB树使用确定性方法,但我建议看一下 "随机二叉搜索树",它们更少地花费来保持平衡,并保证良好的平衡,无论键的统计分布如何。
为了平衡AVL树,我刚刚编写了一堆函数,想与大家分享。我认为这个实现是完美无缺的。当然,如果有任何疑问/问题/批评,欢迎提出:
http://uploading.com/files/5883f1c7/AVL_Balance.cpp/
作为 Stackoverflow 的新手,我尝试在这里发布我的代码,但遇到了糟糕的格式问题。因此,我在上面的链接上载了文件。
谢谢。
这里有一个完整的自平衡AVL树实现 @ http://code.google.com/p/self-balancing-avl-tree/。它还实现了对数时间的连接和分割操作,以及映射/多映射集合。
AVL树效率低下,因为每次插入/删除可能需要进行多次旋转。
红黑树可能是更好的选择,因为插入/删除更加高效。该结构保证到叶子节点的最长路径不超过最短路径的两倍。因此,虽然比AVL树不太平衡,但避免了最坏的不平衡情况。
如果您的树将被多次读取,并且在创建后不会被修改,则完全平衡的AVL树可能值得额外的开销。此外,红黑树需要为每个节点提供一个额外的存储位,用于表示节点的“颜色”。