哈希表:碰撞时双探测

时间:2013-11-26 03:53:43

标签: c logic hashtable double-hashing

我目前正在处理哈希表,并且对双哈希有点困惑。首先让我先介绍一下我所获得的信息。

首先创建一个包含所有数据的数组,然后按键对它们进行排序。我使用公式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;
   }

}

所以我用两个公式来移动键。现在我很困惑,如果我减少并降落在另一个已放置钥匙的位置,会发生什么。在我找到一个地方之前,我会再次减少这么多吗?

1 个答案:

答案 0 :(得分:0)

  

现在我很困惑,如果我减少并落在另一个上,会发生什么   已放置密钥的位置。我再次减少了吗?   直到我找到一个地方?

是。如果您的哈希表大小为素数并且表格未满,您最终会为新条目找到一个可用空间。

您不只是检查条目是否为NULL。您还需要检查它是否包含与插入的密钥相同的密钥。将密钥存储在哈希表中是必不可少的,因此您可以确保搜索到的密钥是您找到的密钥。

注意修改表索引而不强制它在数组边界内。例如,如果item0,然后您减去1,则会有一个越界索引。

您可以这样更正:

item = (item - dec + hash->size) % hash->size;