双散列哈希表重新散列问题
Double hashed HashTable rehashing problem
我需要为学校项目实现一个具有开放寻址和双重哈希的哈希 table。我最多可以添加 56 个条目,但是当它尝试添加第 57 个条目并重新散列时,它说这个词存在(来自 addWord() 方法),而它不应该存在。
for (int k = 0; k < 57; ++k) {
word = "s" + k;
h.addWord(word);
System.out.println("Word = " + word + " KEY = " + h.hash(word));
}
输出:
Word = s0 KEY = 0
...
Rehashing the table!
Word = s4 KEY = 11
...
Rehashing the table!
Word = s7 KEY = 14
...
...
...
Word = s55 KEY = 45
Rehashing the table!
F28DA_CW1.WException: Word exist!
at F28DA_CW1.HTableWords.addWord(HTableWords.java:124)
at F28DA_CW1.HTableWords.rehash(HTableWords.java:178)
at F28DA_CW1.HTableWords.addWord(HTableWords.java:96)
at F28DA_CW1.test.main(test.java:17)
这是我的代码:
import java.util.Arrays;
public class test {
main 方法 class(一切都坏了,因为 main 方法需要每个函数都是静态的)
public class test {
public static void main(String[] args) {
test t = new test((float) 0.5);
String word = "";
for (int k = 0; k < 2000; ++k) {
word = "s" + k;
try {
t.addWord(word);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
错误似乎在tempTable[j] = hTable[i];第 (166) 行。我无法弄清楚它有什么问题。任何帮助将不胜感激。我已经坚持了2天了。
编辑:所以现在问题出在 doubleHash() 方法,该方法在 100 个条目后给我一个负数 -27。有人可以验证公式是否正确吗?
现在您需要做的就是用自定义 mod 替换 % 操作,这样可以避免负面结果。当我这样做时,我不再在输出中看到任何可疑的东西。
public static int mod2(int p, int q) {
int m = p%q;
if (m<0) return m+q;
return m;
}
我需要为学校项目实现一个具有开放寻址和双重哈希的哈希 table。我最多可以添加 56 个条目,但是当它尝试添加第 57 个条目并重新散列时,它说这个词存在(来自 addWord() 方法),而它不应该存在。
for (int k = 0; k < 57; ++k) {
word = "s" + k;
h.addWord(word);
System.out.println("Word = " + word + " KEY = " + h.hash(word));
}
输出:
Word = s0 KEY = 0
...
Rehashing the table!
Word = s4 KEY = 11
...
Rehashing the table!
Word = s7 KEY = 14
...
...
...
Word = s55 KEY = 45
Rehashing the table!
F28DA_CW1.WException: Word exist!
at F28DA_CW1.HTableWords.addWord(HTableWords.java:124)
at F28DA_CW1.HTableWords.rehash(HTableWords.java:178)
at F28DA_CW1.HTableWords.addWord(HTableWords.java:96)
at F28DA_CW1.test.main(test.java:17)
这是我的代码:
import java.util.Arrays;
public class test {
main 方法 class(一切都坏了,因为 main 方法需要每个函数都是静态的)
public class test {
public static void main(String[] args) {
test t = new test((float) 0.5);
String word = "";
for (int k = 0; k < 2000; ++k) {
word = "s" + k;
try {
t.addWord(word);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
错误似乎在tempTable[j] = hTable[i];第 (166) 行。我无法弄清楚它有什么问题。任何帮助将不胜感激。我已经坚持了2天了。
编辑:所以现在问题出在 doubleHash() 方法,该方法在 100 个条目后给我一个负数 -27。有人可以验证公式是否正确吗?
现在您需要做的就是用自定义 mod 替换 % 操作,这样可以避免负面结果。当我这样做时,我不再在输出中看到任何可疑的东西。
public static int mod2(int p, int q) {
int m = p%q;
if (m<0) return m+q;
return m;
}