AVL 树是邪恶的吗? [关闭]

Posted

技术标签:

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

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

【问题讨论】:

OP 代表 666 确认 AVL 树是邪恶的 我不认为我们可以支持这个问题吗? ;) 【参考方案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

那里也有红黑树链接。

【讨论】:

以上是关于AVL 树是邪恶的吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

函数指针是邪恶的吗? [关闭]

数据库触发器是邪恶的吗? [关闭]

为啥全局变量是邪恶的? [关闭]

如果“实用程序”类是邪恶的,我应该把我的通用代码放在哪里? [关闭]

什么是《平衡二叉树》

Django 包括 - 它们是邪恶的吗?