我正在进行数据结构分配,我尝试增加双哈希函数会陷入无限循环。
我的书定义了将哈希加倍的策略
h'(k)= q-(k mod q),对于某些素数q <1。 N.另外,N 应该是一个素数。
我已经确定双重哈希增量导致问题,因为切换到线性探测运行正常。
private int findSlot(int h, K k) {
totalProbes = 0;
int avail = -1; // no slot available (thus far)
int j = h; // index while scanning table
do {
totalProbes++;
if (totalProbes > maxProbes) maxProbes = totalProbes;
if (isAvailable(j)) { // may be either empty or defunct
if (avail == -1) avail = j; // this is the first available slot!
if (table[j] == null) {
break;
} // if empty, search fails immediately
} else if (table[j].getKey().equals(k))
return j; // successful match
//j = (j + 1) % capacity; // keep looking (cyclically)
j = hashTwo(k); //increment using double hash
} while (j != h); // stop if we return to the start
return -(avail + 1); // search has failed
}
private int hashTwo(K key) {
String keyString = key.toString(); //convert generic -> string -> int
int keyInt = Integer.parseInt(keyString);
return 7 - (keyInt % 7);
}
哈希2函数有一些丑陋 - 即从泛型转换为整数,但除此之外,它遵循与本书相同的指令。
答案 0 :(得分:0)
1.代码中的错误:它必须是&#34; j = hashTwo(j)&#34;
2.公式中的误差:对于k = q 0&gt; h'(k)= q-(k mod q)= q-0 = q = k (你最好看https://en.wikipedia.org/wiki/Double_hashing获得有效的公式)
而不是&#34; Integer.parseInt&#34;你应该用
开始迭代private int findSlot(K k,int size){ return findSlot(hashTwo(k.hashCode()),size); }
private int findSlot(int h,int size){...}