【问题标题】:What makes hashmaps faster?是什么让哈希图更快?
【发布时间】:2016-12-31 22:06:20
【问题描述】:

所以我知道哈希映射使用存储桶和哈希码,什么不是。根据我的经验,Java 哈希码并不小,但通常是很大的数字,所以我假设它没有在内部编制索引。除非哈希码质量很差,导致桶长度和桶数量大致相等,否则是什么让哈希图比名称->值对列表更快?

【问题讨论】:

  • Hashmaps使用key的hashcode直接访问存储entry的bucket。这是一个 O(1) 访问。如果由于相同或相似的哈希码而导致该存储桶中有多个元素,那么您需要进行更多检查,但它仍然比遍历列表和搜索元素要快得多。
  • 因为不是哈希码本身被用作数组索引。 hashmap 内部的数组要小得多(取决于你如何初始化它以及它有多少元素),hashmap 会进行另一次计算以从 hashcode 中计算出真正的数组索引。
  • 如今 int 已经不是很大的数了...
  • 很抱歉,但这个问题显示出明显缺乏研究。将有数百个网站解释哈希表的基本原理。更不用说每本值得购买/借阅的关于数据结构和算法的介绍性教科书了。

标签: java hashmap


【解决方案1】:

哈希映射通过使用哈希函数将元素映射到“桶”来工作。当有人试图插入一个元素时,会计算一个哈希码,并对哈希码进行模运算,以获得应该插入该元素的桶索引(这就是为什么哈希码有多大并不重要)。比如你有4个bucket,你的hashcode是40,就会插入bucket 0,因为40 mod 4就是0。

当两个元素映射到同一个桶时,会发生“冲突”,通常该元素存储在同一个桶下的列表中。

如果您尝试获取元素,则使用哈希函数再次映射键。如果存储桶包含元素列表,则使用 equals() 函数来识别哪个元素是正确的(这就是为什么您必须实现 equals() 和 hashcode() 以将自定义对象插入到 hashmap )。

因此,如果您搜索一个元素,并且您的 hashmap 在存储桶上没有任何列表,则您的成本为 O(1)。最坏的情况是当你只有 1 个桶和一个包含所有元素的列表时,获取一个元素与在列表中搜索 O(N) 相同。

【讨论】:

  • OP 是在问一个初级问题,所以也许应该指出 order-1 在绝对意义上对执行速度没有任何说明。 O(1) 算法可能需要 8 年才能完成,并且仍然是 O(1)。它的用途是对比类似目标和特定技术的算法。
【解决方案2】:

我查看了 Java 实现,发现它按位执行,类似于模数,这对于减小数组大小很有意义。这允许 O(1) 访问,这使得 HashMaps 很好。

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 2016-11-16
    • 2016-01-03
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多