Хеш-таблица с двойным разрешением коллизий - бесконечный цикл
Некоторое время я напряженно работал с этой хэш-таблицей, но пока не могу найти причину этих бесконечных циклов. Вставка обычно заканчивается примерно на половине пути. Ключ состоит из 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
реализовать это.