【问题标题】:Binary search tree over AVL treeAVL树上的二叉搜索树
【发布时间】:2013-01-18 05:02:15
【问题描述】:

据我所知,AVL 树和Binary Search Trees 之间的时间复杂度在平均情况下是相同的,在最坏的情况下 AVL 会击败 BST。这给了我一个提示,AVL 在与它们交互的所有可能方式上总是优于 BST,在平衡实现方面可能会增加一点复杂性。

有什么理由应该首先使用 BST 而不是 AVL?

【问题讨论】:

  • AVL 树已经过时了,现在已经被红黑树取代了。
  • @starblue 不是真的。 RB 树的插入性能更快,但查找性能更慢。在处理大量节点时,AVL 即使在插入时也更快。来源:stackoverflow.com/a/28846533/6872717

标签: performance data-structures tree binary-search-tree avl-tree


【解决方案1】:

由于检查和更新平衡因子和旋转节点会增加开销,因此与非平衡 BST 相比,AVL 树中的插入和删除可能会非常慢。

由于紧密平衡,搜索永远不会花费类似线性的时间,因此您可能希望在搜索操作比更新树更频繁的情况下使用 AVL 树。

【讨论】:

    【解决方案2】:

    AVL 树也是一个 BST,但它可以重新平衡自己。这种行为使它在最坏的情况下更快。它不断地重新平衡自己,所以在最坏的情况下,当普通 BST 需要 O(n) 时,它将消耗 O(log n) 时间。因此,您的问题的答案是:实现 AVL 树总是比简单的 BST 更好。

    【讨论】:

      【解决方案3】:

      首先,获得最佳性能不是编程的最终目标。因此,即使选项 B 总是比 A 更快并且消耗的内存更少,但这并不意味着它总是更好的选项,如果它更复杂的话。更复杂的代码需要更长的时间来编写,更难理解并且更有可能包含错误。因此,如果更简单但效率较低的选项 A 对您来说足够好,那么这意味着它是更好的选择。

      现在,如果你想在没有平衡的情况下将 AVL 树与简单的二叉搜索树 (BST) 进行比较,那么 AVL 会消耗更多的内存(每个节点都必须记住它的平衡因子)并且每个操作可能会更慢(因为你需要保持平衡因子,有时进行旋转)。

      正如你所说,没有平衡的 BST 有一个非常糟糕的(线性)最坏情况。但是如果你知道这种最坏的情况不会发生在你身上,或者如果在极少数情况下操作很慢你还可以,那么没有平衡的 BST 可能比 AVL 更好。

      【讨论】:

      • 正是我在等待的原因。谢谢并接受。
      【解决方案4】:

      我的假设是:当你提到 BST 时,你的意思是没有平衡的 BST。

      有人可能会说,如果您需要一个可导航的数据结构,并且您知道您的数据不会是最坏情况(已排序)并且有点小,那么 BST(不平衡)就足够了。

      但这很可能是一种罕见的情况。

      【讨论】:

        猜你喜欢
        • 2016-01-07
        • 2016-11-06
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多