java - 现实世界中曾经使用过线性和/或二次探测吗?

标签 java hash hashmap

<分区>

我在学校,我们一直在学习哈希。对于开放寻址,我们了解了三种探测方法:线性探测、二次探测和双重哈希。

在此处的类似问题上,Jim Mischel 回答说: “[...]您还应该注意,在实践中,只要负载因子合理并且您具有良好的散列函数,这些(线性、二次、双散列)的性能几乎没有真正的区别,并且其他开放寻址方案,如布谷鸟哈希等”。

据我所知,Java 的 HashMap 是使用带有链表的单独链接实现的。 人们使用线性/二次探测而不是使用 Java 的默认实现来编写自己的实现是否很常见?考虑到 Jim 所说的,如果如果他们想要开放寻址?

最佳答案

As far as I know, Java's HashMap is implemented using separate chaining with a linked list.

这是正确的。但是,Java 有 another hash map implementation * 调用了 IdentityHashMap<K,V> ,它使用线性探测代替:

Implementation note: This is a simple linear-probe hash table, as described for example in texts by Sedgewick and Knuth. The array alternates holding keys and values. (This has better locality for large tables than does using separate arrays.) For many JRE implementations and operation mixes, this class will yield better performance than HashMap (which uses chaining rather than linear-probing).

我不知 Prop 有二次探测的哈希表的框架实现。对我来说,在我自己的实现中进行二次探测的最明显的原因是当彼此相邻的散列桶充满数据而桶数组的其他连续区域保持空时避免“散列簇”。不过,归根结底,这是对原始对象上不太理想的哈希函数的补偿,因为理论上不应发生聚类。

* 严格来说,IdentityHashMap不是 HashMap 的正确实现,因为它通过使用标识而不是相等比较来破坏契约。

关于java - 现实世界中曾经使用过线性和/或二次探测吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21510082/

相关文章:

python - 用于收集 numpy 数组的高效查找表

java - 当我尝试删除队列时出现异常,例如 Activemq 中的 InstanceNotFoundException

ruby-on-rails - 无法访问哈希值

ruby - 将哈希合并到哈希子类 - 确保嵌套哈希具有子类属性

java - 当字符串在 Java 8 中没有分隔符时,根据提供的键从字符串创建映射

java - 是否有任何类似于 HashMap 的数据结构,我可以在其中添加重复键

java - 等待设置是监视器的一部分还是它们是两个独立的东西?

java - 我连接 MySQL 时做错了什么? java

java - 没有得到java程序的输出

java - 将表 Guava 用于 hashbasedTable