【问题标题】:HashMap vs array performance difference in following approach以下方法中的 HashMap 与数组性能差异
【发布时间】:2017-12-29 04:57:21
【问题描述】:

为了解决动态编程问题,我使用了两种方法来存储表条目,一种使用多维数组 ex:tb[m][n][p][q],另一种使用 hashmap 并使用第一种方法的索引来制作字符串用作“m,n,p,q”中的键。但是在一个输入上,第一个方法在 2 分钟内完成,而另一个则需要 3 分钟以上。 如果 hashmap 和 array 的访问时间都渐近相等,为什么性能差异如此之大?

【问题讨论】:

  • 我们需要一些代码来分析它的性能。
  • 谁能说出投反对票的原因?
  • 虽然我不知道具体原因,但可能是因为您最初的问题没有遵循这些guidelines。作为一般经验法则,问题的编写方式应与向忙碌的同事提问的方式相同。介绍问题,提供上下文,解释您已经尝试过的内容并尝试使其可重现。问题应该尽可能具体,并且答案应该适用于尽可能多的受众。最初缺少代码可能是最好的猜测。
  • @SumiStraessle 我自己说得再好不过了。

标签: java hashmap


【解决方案1】:

点赞mentioned here

HashMap 在下面使用一个数组,所以它永远不会比使用更快 正确的数组。

你是对的,数组和 HashMap 的访问时间是 O(1),但这只是说它与输入大小或集合的当前大小无关。但它没有说明每个动作必须完成的实际工作。

要访问数组的条目,您必须计算条目的内存地址。这很简单,就像array's memory address + (index * size of entity)

要访问 HashMap 的条目,您首先必须对给定的键进行哈希处理(这需要许多 cpu 周期),然后使用包含列表的哈希访问 HashMap 数组的条目(取决于 HashMap 的实现细节),最后你必须线性搜索列表以找到正确的条目(这些列表大部分时间都很短,所以它被视为 O(1))。

所以你看到它更像是 O(10) 的数组和 O(5000) 的哈希映射。或者更精确的T(Array access) 用于数组,T(hashing) + T(Array access) + T(linear search) 用于 HashMaps,T(X) 作为实际操作时间x

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多