我在SO re Java hashmaps及其O(1)次查找时间上看到了一些有趣的说法.有人能解释为什么会这样吗?除非这些散列图与我购买的任何散列算法有很大的不同,否则一定存在一个包含冲突的数据集.

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

谁能解释一下他们是否are O(1),如果是的话,他们是如何做到这一点的?

推荐答案

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

p碰撞=n/容量

因此,一个包含少量元素的哈希映射很可能至少会遇到一次冲突.大O符号允许我们做一些更有说服力的事情.观察任意固定常数k.

O(n)=O(k*n)

我们可以使用此功能来提高哈希映射的性能.我们可以考虑最多两次碰撞的概率.

p碰撞x2=(n/容量)2

这要低得多.由于处理一次额外冲突的成本与Big O性能无关,我们找到了一种在不改变算法的情况下提高性能的方法!我们一般可以把这个

p碰撞xk=(n/容量)k

现在我们可以忽略一些任意数量的碰撞,最终得到比我们所考虑的更多碰撞的可能性微乎其微.通过 Select 正确的k,可以将概率提高到任意微小的水平,而无需改变算法的实际实现.

我们说散列映射有O(1)access with high probability

Java相关问答推荐

无法从Spring Boot应用程序连接到SQL Docker服务器

长音符

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

表格栏上的事件过滤器在PFA中不起作用

Java 8中的多个字段和计数

缩小画布比例后更改滚动窗格的内部大小

Hibernate 6支持Joda DateTime吗?

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

Kotlin内联互操作:强制装箱

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

基于接口的投影、原生查询和枚举

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

在Java中将int[]矩阵添加到ArrayList中,但出现错误

使用正则表达式从字符串中提取多个值

try 使用Spring集成和MySQL实现发件箱模式时,锁定等待超时

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

Java返回生成器的实现

java21预览未命名的符号用于try-with-resources