【发布时间】:2012-02-08 23:48:14
【问题描述】:
更具体地说,如果使用 AVL 树而不是哈希表,是否可以更有效地执行任何操作?
【问题讨论】:
-
这个问题有点模糊,无法详尽回答。它很大程度上取决于哈希表的实现,但是在树中的查找操作很可能比在哈希表中快得多。此外,保证在任何类型的树上查找具有公共前缀的多个键都比在哈希表(--> 处理器缓存)上快得多。由于高度限制和重新平衡,插入/删除操作很可能不会更有效,但是哈希表可能还需要执行不平凡的操作,直到重建整个哈希(-->实现?)。跨度>
-
没有。除非您考虑哈希表无法支持的操作。就像保持秩序和支持重复键一样。不必这样做是使哈希表从根本上快速的原因。
-
谢谢大家,这些点正是我想要的。抱歉,如果问题措辞不当。
-
@HansPassant:哈希表不是“基本快”,不是一般的。它们基本上具有 O(1) 复杂度(加上 O(N)),但这并不能保证它们在每种情况下都更快。特别是对于大型数据集,哈希表是两个保证的缓存未命中(更多具有开放寻址,超出一定负载)。另一方面,一棵树有合理的机会在缓存中拥有大部分(如果不是全部)节点,尤其是在查找相关键时,并且不需要最终比较。添加到 O(N) 时间以计算哈希。它真的取决于实现、数据集和访问模式。
-
“哈希表”是一个不完整的解决方案。预期键的“正确”散列函数是什么?如何处理哈希冲突?在最坏情况下的哈希冲突场景中使用了多少(或多少)可用存储? AVL 树总是可以实现 100% 的利用率。
标签: performance data-structures hashmap hashtable avl-tree