所以我正在使用一个包含400个数据值的文件,所有整数和4到20,000的值。我将所有这些加载到一个大小为400的数组中。还有另一个大小为600的ListNode空数组,我将数据移动到,但是使用自编写的哈希代码(我将在下面发布)。
因为长度为600的数组中的每个索引都有一个ListNode,如果有任何冲突,则数据值将添加到ListNode的后面。我还有一个方法返回数组的百分比。但基本上因为我将400个数据值加载到600大小的数组中,所以我可以拥有的空值百分比最小为33.3%,因为如果没有冲突,则数组中有400个空位,200个为空,但是这个事实并非如此:
return (num+123456789/(num*9365))%600; //num is the value read from the array of 400
hashCode给了我48.3%null的最佳结果,我至少需要它低于47%。提出这个hashCode的任何建议或解决方案?我非常感谢任何帮助。如果您需要更多信息或详细信息,请告诉我们。谢谢!!!
答案 0 :(得分:1)
我做了一些随机数的实验:在[0,599]范围内生成400个均匀分布的随机数,并检查该范围内没有生成多少个值。事实证明,平均51.3%的值未生成。所以你的48.3%已经好于预期。 除非使用某种形式的完美哈希,否则47%的目标似乎是不现实的。
如果你想自己做一些实验,这是程序。
public static void main(String[] args) {
Random r = new Random();
int[] counts = new int[600];
for (int i = 0; i < 400; i++) {
counts[r.nextInt(600)]++;
}
int n = 0;
for (int i = 0; i < 600; i++) {
if (counts[i] == 0) {
n++;
}
}
System.out.println(100.0 * n / 600);
}
答案 1 :(得分:0)
我使用散列算法的JAVA实现:
Hava a look at open-jdk HashMap
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
请注意,您也添加了一个模运算,以确保该值不会大于600
编辑1
>>> is logical shift right
实施例
10000000 >>> 2 = 00100000