当前位置: 首页 > 面试题库 >

Java hashmap映射真的是O(1)吗?

苏骏
2023-03-14
问题内容

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

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

有人可以解释他们是否为 O(1),如果是,他们如何实现这一目标?


问题答案:

HashMap的一个特殊功能是与平衡树不同,它的行为是概率性的。在这些情况下,就最坏情况发生的可能性而言,谈论复杂性通常是最有帮助的。对于哈希映射,当然是在映射恰好充满的情况下发生冲突的情况。碰撞非常容易估计。

pcollision = n / capacity

因此,即使元素数量很少的哈希图也很可能会经历至少一次碰撞。大O表示法使我们可以做一些更具吸引力的事情。观察任意固定的常数k的情况。

O(n) = O(k * n)

我们可以使用此功能来改善哈希图的性能。我们可以考虑最多发生两次碰撞的可能性。

pcollision x 2 = (n / capacity)2

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

pcollision x k = (n / capacity)k

现在,我们可以忽略任意数量的冲突,并且最终产生的冲突比我们所考虑的要少得多。通过选择正确的k,您可以将概率降低到任意微小的水平,而无需改变算法的实际实现。

我们通过说哈希映射很有可能具有O(1)访问来谈论此问题



 类似资料:
  • 问题内容: 是否真的计算了PHP数组的所有元素,还是将此值缓存在某个地方并被获取? 问题答案: 好吧,我们可以看看源代码: call ,这反过来又需要非递归数组,该数组是通过以下方式实现的: 所以你可以看到,它的。

  • 在Postgresql中,我有一个类型为BIT(1)的列。在JPA映射中,如下所示: 但是,当我执行测试时,出现了这个错误: 错误:列“type”的类型是bit,但表达式的类型是character变化  提示:您将需要重写或强制转换表达式。  排名:117 我尝试过其他Java类型:char、int、Boolean和bitset。但是,同样的错误发生了。 您知道如何将Postgresql类型位(1

  • 问题内容: 我正在尝试使用hibernate创建一个小项目,但出现了错误“类型未映射[从类型o中选择o]”,我在hibernate.cfg.xml中添加了映射,但仍然出错。 Type.java: hibernate.org.xml: hibernateUtil.java: 测试Java 问题答案: 解决了 !问题是我使用的hibernate版本,所以我对其进行了更改,即HibernateUtil中

  • Edit:您可以假设hashtable使用基本链接,其中元素位于相应链表的末尾。我的真正问题是关于概率算法的摊销分析。 编辑2:我在quicksort上发现了这篇文章,“摊销运行时间和预期运行时间之间有一个微妙但重要的差异。使用随机枢轴的quicksort的预期运行时间为O(n log n),但其最坏的运行时间为θ(n^2)。这意味着quicksort的成本很小,但随着n的增加,这种可能性接近于零

  • 我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:

  • 前端将这个json发送到我的API 控制器: