Performance 什么时候AVL树比哈希表更好?

Performance 什么时候AVL树比哈希表更好?,performance,data-structures,hashmap,hashtable,avl-tree,Performance,Data Structures,Hashmap,Hashtable,Avl Tree,更具体地说,如果使用AVL树而不是哈希表,是否有任何操作可以更有效地执行?我通常更喜欢AVL树而不是哈希表。我知道哈希表的预期时间O(1)复杂度超过了AVL树的保证时间O(logn)复杂度,但在实践中,常数因子使这两种数据结构通常具有竞争性,而且对于一些引起不良行为的意外数据,也不必担心。此外,我经常发现,在程序维护期间的某个时候,在最初选择哈希表似乎正确时无法预见的情况下,我需要按排序顺序排列数据,因此我最终重写程序以使用AVL树而不是哈希表;这样做足够多的时间,你就会知道你也可以从AVL树开

更具体地说,如果使用AVL树而不是哈希表,是否有任何操作可以更有效地执行?

我通常更喜欢AVL树而不是哈希表。我知道哈希表的预期时间O(1)复杂度超过了AVL树的保证时间O(logn)复杂度,但在实践中,常数因子使这两种数据结构通常具有竞争性,而且对于一些引起不良行为的意外数据,也不必担心。此外,我经常发现,在程序维护期间的某个时候,在最初选择哈希表似乎正确时无法预见的情况下,我需要按排序顺序排列数据,因此我最终重写程序以使用AVL树而不是哈希表;这样做足够多的时间,你就会知道你也可以从AVL树开始


如果您的键是字符串,则三元搜索尝试提供了AVL树或哈希表的合理替代方案。

当然,一个明显的区别是,使用AVL树(和其他平衡树),您可以具有持久性:您可以在O(log N)空间和时间内从树中插入/删除元素,并最终得到的不仅仅是新树,而且还要保留这棵老树

对于哈希表,通常不能在少于O(N)的时间和空间内完成


另一个重要的区别是键上需要的操作:AVL tress需要一个
,这个问题太模糊了,无法详尽地回答。这在很大程度上取决于哈希表的实现,但是查找操作在树中可能比在哈希表中快得多。此外,在任何类型的树上查找具有公共前缀的多个键都要比在哈希表(->处理器缓存)上快得多。由于高度限制和重新平衡,插入/删除操作很可能效率不高,但哈希表可能也需要执行非平凡操作,直到重新生成整个哈希(->实现?)。否。除非考虑哈希表不能支持的操作。像维持秩序和支持重复的钥匙。不必这样做是使哈希表从根本上快速的原因。谢谢大家,这些点正是我想要的。如果这个问题的措辞很糟糕,很抱歉。@HansPassant:哈希表不是“基本上快速的”,不是一般的。它们基本上具有O(1)复杂度(加上O(N)),但这并不保证它们在任何情况下都更快。特别是对于大型数据集,哈希表是两种有保证的缓存未命中(更多的是开放寻址,超过一定的负载)。另一方面,一棵树有可能在缓存中拥有大部分(如果不是全部的话)节点,特别是在查找相关键时,并且不需要进行最终比较。加上O(N)时间计算散列。这实际上取决于实现、数据集和访问模式。“哈希表”是一个不完整的解决方案。对于预期的键,“适当的”哈希函数是什么?如何处理散列冲突?在最坏的哈希冲突场景中,所有可用存储中有多少(或只有多少)被利用?AVL树始终可以实现100%的利用率。这不是全部。存在许多具有对数复杂性的持久散列表结构的实现。例如,请注意clojure和scala是如何实现其默认映射类型的。@OscarBoykin:事实上,HAMT可以被视为哈希表和二叉树的混合体。