Проблема двойного хеширования в HashTable - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно реализовать хеш-таблицу с открытой адресацией и двойным хешированием для школьного проекта.Я могу добавить до 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));

    }

output:

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).Я не могу понять, что с ним не так.Любая помощь будет принята с благодарностью.Я застрял с ним в течение 2 дней.

Редактировать: Итак, проблема в методе doubleHash (), который дает мне отрицательное число -27 после 100 записей.Может кто-нибудь проверить, верна ли формула?

1 Ответ

0 голосов
/ 17 октября 2018

Теперь все, что вам нужно сделать, это заменить% операций пользовательским модом, который позволит избежать отрицательных результатов.Когда я это делаю, я больше не вижу ничего подозрительного в выводе.

public static int mod2(int p, int q) {
    int m = p%q;
    if (m<0) return m+q;
    return m;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...