【问题标题】:Why don't we use AVL tree for hash table's item storage?为什么我们不用AVL树来存储hash表的item呢?
【发布时间】:2015-04-08 07:21:34
【问题描述】:
最近,我正在查看使用链表作为链表的哈希表。我想到了使用“链”作为 AVL 树的可能性。
因此,哈希表中的每个桶都会有很少的 AVL 树的根指针。维基百科说哈希表的最坏情况是 O(n) (http://en.wikipedia.org/wiki/Hash_table)。但是,如果我们使用每个桶的“链”作为 AVL 树,我们可以将其降低到 O(ln n)。
我错过了什么吗?
据我所知,我们可以用 AVL 树替换链表。
这样的 ADT 不会比单个 AVL 树或带有链表链接的哈希表更好吗?
我搜索了互联网,找不到这样的 ADT。
【问题讨论】:
标签:
data-structures
hashtable
avl-tree
【解决方案1】:
这在您引用的维基百科文章中直接讨论:
与其他结构分开链接
可以使用任何其他支持所需操作的数据结构来代替列表。例如,通过使用自平衡树,可以将常见哈希表操作(插入、删除、查找)的理论最坏情况时间降低到 O(log n) 而不是 O( n)。然而,如果必须不惜一切代价避免长时间的延迟(例如,在实时应用程序中),或者如果必须防止许多条目散列到同一个槽(例如,如果人们期望非常不均匀的分布,或者在网站或其他可公开访问的服务的情况下,它们容易受到请求中的恶意密钥分布的影响)。
在Java中,标准HashMap在桶中使用红黑树,如果桶大小超过常数8;如果桶变得小于 6 个条目,它们将线性化回单链表;显然,现实世界的测试表明,由于这种数据结构的一般复杂性和额外的内存占用,对于较小的存储桶,将它们作为树来管理会损失更多(因为树条目应该至少包含对其他条目的 2 个引用,单链接条目只包含一个引用) ,而不是从理论上更好的渐近复杂度中获益。
我还要补充一点,为了获得最佳性能哈希表应该配置为大多数桶只有一个条目(即它们甚至不是列表,只是唯一的条目),稍微少一点应该包含两个条目,并且偶尔只有特殊的桶应该有 3 个或更多条目。因此,与简单的链表相比,在树中保存 1-3 个条目绝对没有意义。