我正在进行一项任务,我必须将10,000个数字哈希到一个负载大小为.1,.2 .3 ....到.9的哈希表中。我的问题是我的散列函数给了我一些溢出或类似的东西。如果我正在为负载因子为.5的表做散列,如36077(mod)20,000,它会给我16070作为关键。这仅发生在高于负载系数的数字上。这是我的散列函数的代码。
public int linearHash(int in){
int hashKey = in%hashTableArray.length;
while(this.hashTableArray[hashKey] != 0){
hashKey += 1;
}
return hashKey;
}
谢谢。
答案 0 :(得分:0)
您没有检查是否超出了hashTableArray
循环中while
的索引范围。你可以这样做:
while (hashKey < hashTableArray.length && this.hashTableArray[hashKey] != 0){
答案 1 :(得分:0)
Reimeus指出OutOfBound问题并给出了解决方案。我只是想补充一下你处理碰撞的方法。
您的功能看起来像开放式寻址方法。也许您可以考虑增加hashKey += 1;
in
public int linearHash(int in){
int hashKey = in%hashTableArray.length;
while(this.hashTableArray[hashKey] != 0){
in ++;
hashKey = in%hashTableArray.length;
}
return hashKey;
}
上面的示例代码没有检查哈希表溢出。自动增量不应超过hashTableArray.length
次。否则你的程序会陷入死循环
请注意,通过检查hashTableArray[hashKey] != 0
确定广告位是否免费是不安全的。例如,您的元素中有0
和20000
个数字。