【问题标题】:Hash tables: double probe when collision哈希表:碰撞时的双重探测
【发布时间】:2013-11-26 03:53:43
【问题描述】:

我目前正在研究哈希表,对双重哈希有点困惑。让我首先从我得到的信息开始。

您首先创建一个数组来保存所有数据,并按键对它们进行排序。我使用公式 K % size 在数组中找到键所在的位置。如果您将密钥提交到已经存在密钥的位置,则称为冲突。这是 double 的来源。我使用公式 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;
   }

}

所以我使用这两个公式来移动键。现在我很困惑如果我递减并降落在另一个已经放置密钥的位置上会发生什么。我会再减少那么多直到找到一个地方吗?

【问题讨论】:

    标签: c logic hashtable double-hashing


    【解决方案1】:

    现在我很困惑如果我递减并降落在另一个上会发生什么 已放置钥匙的位置。我是否会再次减量 直到我找到一个地方?

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

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

    注意修改表索引而不强制它位于数组边界内。例如,如果item0,然后减去1,就会得到一个越界索引。

    你可以这样改正:

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

    【讨论】:

    • 感谢您的评论!那么我会做一个while循环来继续减去这个值吗?你提供的那条线让它不会越界?
    • 是的。为了安全起见,您可能希望保存原始索引并循环,直到您再次点击它或找到空闲槽。
    • 我会在你的答案底部添加哪一行?那会进入while循环吗?
    • 是的。您会看到它是通过减去dec 来修改item 的行。所以,既然你想在一个循环中减去dec,那么这条线就进入了循环。
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2012-06-01
    相关资源
    最近更新 更多