【发布时间】:2013-10-05 18:57:54
【问题描述】:
我正在研究 Java 集合性能特征、Big O 表示法和复杂性等。有一个我无法理解的真实部分,这就是为什么 HashMap 和其他哈希容器被认为是 O(1),这应该意味着在 1,000 个条目的表中通过键查找条目应该与 1,000,000 个条目的表所用的时间大致相同。
假设你有一个 HashMap myHashMap,用名字 + 姓氏的键存储。如果调用 myHashMap.get("FredFlinstone"),它如何能立即找到 Fred Flinstone 的 Person 对象?它怎么可能不必遍历存储在 HashMap 中的一组键来找到指向对象的指针?如果 HashMap 中有 1,000,000 个条目,则键列表也将是 1,000,000 长(假设没有冲突),即使它已排序,它也必须比 1.000 的列表花费更多的时间。那么 get() 或 containsKey() 时间怎么能不随 n 而变化呢?
注意:我认为我的问题会在Is a Java hashmap really O(1)? 中得到回答,但答案并没有真正解决这一点。我的问题也与碰撞无关。
【问题讨论】:
-
他们不是真的。最坏的情况,他们仍然是
O(n)。 -
顺便说一句,它不是您所说的键列表。它是一个数组,其中索引与对象的哈希码相关。
-
您忘记了“HashMap”的“Hash”部分。你得到对象的哈希码,模 (
%) 它是你的数组的大小"HashBuckets",然后一旦你在桶中,你就可以进行线性搜索。 -
对于那些说我的问题重复的人,请阅读我帖子的最后一行,然后告诉我在那篇帖子的哪个位置回答了我的问题
标签: java performance hashmap big-o