java - Java hashmap 搜索真的是 O(1) 吗?

标签 java hashmap big-o time-complexity

我已经看到一些关于 SO re Java hashmap 及其 O(1) 查找时间的有趣声明。有人可以解释为什么会这样吗?除非这些 HashMap 与我购买的任何哈希算法大不相同,否则必须始终存在包含冲突的数据集。

在这种情况下,查找将是 O(n) 而不是 O(1)

谁能解释他们是否 O(1),如果是,他们是如何做到的?

最佳答案

HashMap 的一个特殊特性是与平衡树不同,它的行为是概率性的。在这些情况下,根据最坏情况事件发生的概率来讨论复杂性通常是最有帮助的。对于 HashMap ,这当然是关于映射恰好有多满的冲突的情况。碰撞很容易估计。

pcollision = n / capacity

因此,即使元素数量不多的 HashMap 也很可能至少会发生一次冲突。大 O 表示法允许我们做一些更有说服力的事情。观察任意的固定常数 k。

O(n) = O(k * n)

我们可以使用这个特性来提高 HashMap 的性能。相反,我们可以考虑最多 2 次碰撞的概率。

pcollision x 2 = (n / capacity)2

这要低得多。由于处理一次额外碰撞的成本与 Big O 性能无关,因此我们找到了一种无需实际更改算法即可提高性能的方法!我们可以将其概括为

pcollision x k = (n / capacity)k

现在我们可以忽略任意数量的碰撞,最终得到比我们所考虑的更多碰撞的可能性微乎其微。您可以通过选择正确的 k 将概率提高到任意微小的水平,而所有这些都不会改变算法的实际实现。

我们通过说 HashMap 具有 O(1) 访问权限来讨论这个问题很有可能

关于java - Java hashmap 搜索真的是 O(1) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055243/

相关文章:

java - 已为此响应调用 getOutputStream()

java - Java 编译器是否优化了不必要的三元运算符?

java - 从 HashMap 中获取具有最大值的键?

java - 使用流收集 HashMap 中的事件

Java 设置 MIDI Out 接收器

java - 当任何人达到 100 时,骰子游戏不会停止。我的代码有什么问题吗?

java - 如何从 ArrayList<HashMap<String, String>> android 中获取所有元素

algorithm - 证明 n^2 + 5 log(n) = O(n^2)

arrays - 如何制定 O(N) 算法解决方案?

algorithm - 实现需要最少内存的算法