HashMap 与数组在以下方法中的性能差异

rai*_*day 4 java hashmap

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

Obe*_*and 8

就像这里提到的

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)HashMap 来说更精确,具有T(X)实际的操作时间x