【问题标题】: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 个条目绝对没有意义。

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多