【发布时间】:2020-08-14 15:31:00
【问题描述】:
我正在解决一个问题,我想在数据结构(例如 hashmap)中存储由两个相等长度的整数数组(例如 int a[] ={1,2,3,4} 和 int b[] ={1,2,2,6})组成的对象。但是,对于不同的对象,两个数组的长度可能会有所不同。两个数组都由给定区间(例如 0-200 之间)的整数组成。
为了使用两个数组存储对象,我想分配一个计算速度快、保留两个序列并且将导致冲突最小化的哈希键。
我第一次尝试使用Arrays.deepHashCode(int[][]),但很快就发现了冲突。其次,我尝试通过将 a[i] 和 b[i] 更改为新值来更平均地分配数组中的值,以便 a_new[i] = Math.pow(31,a[i]) % Math.pow(2,16)(实际上使用 BigInteger 以避免溢出:BigInteger.valueOf(31).modPow(BigInteger.valueOf(a[i]), BigInteger.valueOf(Math.pow(2,16)));使用 BigInteger。由于值的间隔是有限的,我可以为每个可能的值预先计算它。结果我想出了以下解决方案:
int result = 31;
for (int i = 0; i < a.length; i++) {
result = result * 31 * a_new[i];
result = result * 31 * b_new[i];
}
当只有较小的数组时,此解决方案似乎有效,但是一旦 a[] 和 b[] 最多可以包含 10 个值,它也会导致冲突。现在我想知道,是否有更好的方法来实现我想要的更少的碰撞。
编辑:我修复了它以使用适当的 Java 代码来获得权力
【问题讨论】:
-
那不是真正的 Java。 Java 中没有“mod”运算符,而且......不清楚
^是什么意思。你的意思是取幂还是按位或?向我们展示您实际使用的代码。 -
@stephen C:我想它象征着“^”的力量,而不是双星号。如果是这样,则结果 int 溢出。应该使用 Long 而不是 int(eger)
-
@StephenC:我修复了代码以使用实际的 java 代码。是的,我将“power of”与 BigInteger 结合使用来处理结果的大幂的模数。
-
你能澄清一下你认为什么类型的对象是等价的吗?
标签: java arrays hash computation-theory hash-function