我一直在用这个哈希表强调一段时间但我似乎找不到导致这些无限循环的原因。插入通常在中间点左右停止。密钥由一串64个随机符号组成,这些符号在中间用下划线分隔。需要帮助尝试调试这个!
这是Table构造函数,包括哈希函数和插入方法:
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;
}
答案 0 :(得分:1)
while
中的Insert
循环如果循环回到数组中的相同索引而没有找到空白点,则可能进入无限循环。为了防止出现这个问题,你可以使用&#34扩充双重哈希策略;只需找到下一个可用的空闲空间&#34;策略 - 如果第一个策略失败,则切换到第二个策略。您需要另一个变量来跟踪hash1
的原始值以实现它。