我目前正在处理哈希表,并且对双哈希有点困惑。首先让我先介绍一下我所获得的信息。
首先创建一个包含所有数据的数组,然后按键对它们进行排序。我使用公式K%size来找到数组中键的位置。如果您将密钥提交到已存在密钥的位置,则称为冲突。这是双进来的地方。我使用公式max(1,(K / size)%size)得到一个从该位置递减的数字。
所以我提出了这些功能:
int hashing(table_t *hash, hashkey_t K)
{
int item;
item = K % hash->size;
return item;
}
int double_hashing(table_t *hash, hashkey_t K)
{
int item;
item = K/hash->size % hash->size);
return item;
}
//This is part of another function which involves the double.
else if(hash->probing_type == 2)
{
int dec, item;
item = hashing(hash,K);
if(hash->table[item] == NULL)
{
hash->table[item]->K == K;
hash->table[item]->I == I;
}
else
{
dec = double_hashing(hash,K);
hash->table[item-dec]->K == K;
hash->table[item-dec]->I == I;
}
}
所以我用两个公式来移动键。现在我很困惑,如果我减少并降落在另一个已放置钥匙的位置,会发生什么。在我找到一个地方之前,我会再次减少这么多吗?
答案 0 :(得分:0)
现在我很困惑,如果我减少并落在另一个上,会发生什么 已放置密钥的位置。我再次减少了吗? 直到我找到一个地方?
是。如果您的哈希表大小为素数并且表格未满,您最终会为新条目找到一个可用空间。
您不只是检查条目是否为NULL
。您还需要检查它是否包含与插入的密钥相同的密钥。将密钥存储在哈希表中是必不可少的,因此您可以确保搜索到的密钥是您找到的密钥。
注意修改表索引而不强制它在数组边界内。例如,如果item
为0
,然后您减去1
,则会有一个越界索引。
您可以这样更正:
item = (item - dec + hash->size) % hash->size;