具有双重哈希冲突解决方案的哈希 table - 无限循环
Hash table with double hashing collision resolution - infinite loop
我已经用这个散列 table 紧张了一段时间,但我似乎无法找到导致这些无限循环的原因。插入通常在中点左右停止。密钥由一串 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;
}
Insert
中的 while
循环如果在没有找到空位的情况下循环回到数组中的相同索引,则可能会进入无限循环。为防止出现此问题,您可以使用 "just find the next available free space" 策略扩充双重哈希策略 - 如果第一个策略失败,则切换到第二个策略。您需要另一个变量来跟踪 hash1
的原始值以实现它。
我已经用这个散列 table 紧张了一段时间,但我似乎无法找到导致这些无限循环的原因。插入通常在中点左右停止。密钥由一串 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;
}
Insert
中的 while
循环如果在没有找到空位的情况下循环回到数组中的相同索引,则可能会进入无限循环。为防止出现此问题,您可以使用 "just find the next available free space" 策略扩充双重哈希策略 - 如果第一个策略失败,则切换到第二个策略。您需要另一个变量来跟踪 hash1
的原始值以实现它。