双重散列HashTable重新散列问题

时间:2018-10-17 17:37:53

标签: java hashtable double-hashing

我需要为学校项目实现带有开放式寻址和双哈希的哈希表。我最多可以添加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 {

主要方法类(由于主要方法希望每个函数都是静态的,所以一切都崩溃了

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)。我无法弄清楚这是怎么回事。任何帮助将不胜感激。我已经坚持了两天。

编辑:所以现在问题出在doubleHash()方法上,它在100个条目后给我一个负数-27。有人可以验证公式是否正确吗?

1 个答案:

答案 0 :(得分:2)

现在您所要做的就是用自定义mod替换%操作,以避免产生负面结果。当我这样做时,我不再在输出中看到任何可疑的东西。

public static int mod2(int p, int q) {
    int m = p%q;
    if (m<0) return m+q;
    return m;
}