【问题标题】:Are AVL Trees Evil? [closed]AVL 树是邪恶的吗? [关闭]
【发布时间】:2010-11-26 13:13:55
【问题描述】:

我正在阅读来自 Steve Yegge 的关于单身人士的 article。在其中他提到他的老师告诉他 AVL 树是邪恶的。只是红树和黑树是更好的解决方案吗?

【问题讨论】:

  • OP 代表 666 确认 AVL 树是邪恶的
  • 我不认为我们可以支持这个问题吗? ;)

标签: algorithm binary-tree red-black-tree avl-tree


【解决方案1】:

从什么角度来看邪恶?

一如既往:没有坏工具,只有坏工匠。

在我的记忆中,AVL 树的插入/删除速度较慢,但​​检索速度比红/黑树快。主要是因为平衡算法。

【讨论】:

  • 没错。如果您需要一次写入多次读取的映射,AVL 树很难被击败。在我看来,它们也更容易正确实施。
  • 对我来说,一次写入-多次读取的映射听起来更像是一个排序数组... 很少写入-多次读取的映射听起来比 AVL 树更多。但是,即使在这些情况下,也一定要考虑排序数组。恒定成本要低得多,因此在 AVL 树的性能优于红/黑树和排序数组之前,您需要许多条目。
  • AVL 树是高度可理解的。 IME、RB 树的实现者并不理解它们——它们只是遵循规则;从概念上讲,他们并没有真正理解正在发生的事情。
【解决方案2】:

不,AVL 树在任何方面都肯定不是邪恶的。它们是完全有效的自平衡树结构。它们肯定具有与红黑树不同的性能特征,通常这些差异导致人们选择红黑树而不是 AVL 树。但这并不会使他们变得邪恶。

【讨论】:

    【解决方案3】:

    我确信 AVL 树是邪恶的,就像 GOTO 是邪恶的或 BUBBLE SORT 是邪恶的一样。

    算法并不邪恶,但算法也不会跳来跳去告诉你什么时候合适。

    【讨论】:

    • Goto 不是算法,也不是合法的比较。
    • 冒泡排序的问题在于没有真正的权衡可以使它变得更好。对于 AVL 树,你不能这么说。
    • ::snark:: 冒泡排序使用的代码很少,在传统的图灵机中很容易实现。
    • 有(罕见的)冒泡排序是最快排序的情况。
    • @Henk:我什至不会称它们为稀有。当您的输入数据主要进行排序时,冒泡排序本质上是线性时间。
    【解决方案4】:

    这里有很多关于 Red-Black 和 AVL-Trees 之间差异的信息:

    http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=22948

    还有一篇比较不同结构的论文:

    http://www.stanford.edu/~blp/papers/libavl.pdf

    简而言之 - AVL 搜索速度更快,Red-Black 插入速度更快。

    【讨论】:

    • fogcreek 链接不正确。内容具有误导性。 AVL 树不需要 O(log n) 旋转来重新平衡。最多 2 个。
    【解决方案5】:

    Splay Trees 更酷。 :)

    【讨论】:

      【解决方案6】:

      不,它们并不邪恶,只是编程有点棘手。

      AVL 树 http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_avl.aspx

      那里也有红黑树链接。

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 1970-01-01
        • 2014-03-28
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 2010-10-02
        • 2010-11-22
        相关资源
        最近更新 更多