Хеш-таблица с двойным разрешением коллизий - бесконечный цикл

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

Вот конструктор таблицы, как хэш-функции, так и метод вставки:

        private int maxsize;
        private int size;
        private TableEntry[] table;
        private int primeSize;

        public HashTable(int ts)
        {
            size = 0;
            maxsize = ts;
            table = new TableEntry[maxsize];
            for (int i = 0; i < maxsize; i++)
                table[i] = null;
            primeSize = getPrime();
        }

        public int getPrime()
        {
            for (int i = maxsize - 1; i >= 1; i--)
            {
                int fact = 0;
                for (int j = 2; j <= (int)Math.Sqrt(i); j++)
                    if (i % j == 0)
                        fact++;
                if (fact == 0)
                    return i;
            }

            return 3;
        }

        public void Insert(string key, double value)
        {
            if (size == maxsize)
            {
                Console.WriteLine("Table full");
                return;
            }
            int hash1 = myhash1(key);
            int hash2 = myhash2(key);
            Console.WriteLine(" Hashed keys: {0}, {1}", hash1, hash2);
            while (table[hash1] != null)
            {
                hash1 += hash2;
                hash1 %= maxsize;
            }
            table[hash1] = new TableEntry(key, value);
            size++;
        }

        private int myhash1(string key)
        {
            int hashVal = key.GetHashCode();
            hashVal %= maxsize;
            if (hashVal < 0)
                hashVal += maxsize;
            return hashVal;
        }

        private int myhash2(string key)
        {
            int hashVal = key.GetHashCode();
            hashVal %= maxsize;
            if (hashVal < 0)
                hashVal += maxsize;
            return primeSize - hashVal % primeSize;
        }

1 ответ

Решение

while зациклиться Insert может попасть в бесконечный цикл, если он возвращается к тому же индексу в массиве, не находя пустого места. Чтобы предотвратить эту проблему, вы можете дополнить стратегию двойного хеширования стратегией "просто найдите следующий доступный свободный объем" - переключиться на вторую стратегию, если первая стратегия не удалась. Вам понадобится другая переменная, чтобы отслеживать исходное значение hash1 реализовать это.

Другие вопросы по тегам