【问题标题】:Maximum length of linkedlist bucket in a hash set?哈希集中链表桶的最大长度?
【发布时间】:2019-03-18 03:21:51
【问题描述】:

HashSet 中 LinkedList 的最大大小是多少?当达到最大大小时会发生什么(如果有)?如果所有 n 个输入元素都具有将值存储在哈希映射的同一节点数组中的哈希码。即当由于特定的输入,桶 0 继续增长而其余的桶未填充时会发生什么。在这种情况下是否进行了重新散列或者是否有特定的方法来避免这个问题?

【问题讨论】:

  • 在 Java 无限制。在 Java 8+ 中,链表将被转换为平衡树,尽管即使在那里,它实际上也可能是一个无限链表。
  • @Andreas ,那么它如何在无限链表中获取 O(1) 中的元素?
  • 它实际上是 amortized O(1),在树内搜索时你仍然会得到 O(logn)
  • 它没有,不是真的。但是在足够的散列函数下,散列桶碰撞的概率足够小,摊销复杂度可以被认为是O(1)。使用非常糟糕的哈希函数,所有对象可能最终都在同一个桶中,复杂度将是 O(n)。但是,对于散列集合,我们假设有足够的散列函数,因此 O(1),否则我们不会使用它们。
  • 那是一个链表而不是LinkedList。真正的问题不是糟糕的散列函数,而是恶意选择的键(或HashSet 的元素)。仅当所有键都正确实现 Comparable 时才有效。

标签: java hashmap hashtable hashset hashcode


【解决方案1】:

该策略在某种程度上是特定于实现的,但一般来说,当 HashMap(和 HashSet 基于此)达到 64 个条目总体和单个存储桶中的 8 个条目时,它将是转换为Tree。直到resize 发生之前,当一个桶的大小翻倍时,会考虑一个额外的位来考虑放置条目的位置 - 这称为rehash - 这样做是为了尝试将条目移动到不同的桶。

有关一些实现细节,请参阅 thisthis

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2014-06-02
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多