C 哈希表:冲突时双探测
我目前正在研究哈希表,对双重哈希有点困惑。让我先从我得到的信息开始 首先创建一个数组,该数组将保存所有数据,并按键进行排序。我使用公式K%size来查找该键在数组中的位置。如果将关键点提交到已存在关键点的位置,则称为碰撞。这就是替身的用武之地。我使用公式max(1,(K/size)%size)得到一个从该位置递减的数字 所以我提出了这些函数:C 哈希表:冲突时双探测,c,logic,hashtable,double-hashing,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-&
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;
}
}
所以我使用这两个公式来移动关键点。现在,我很困惑,如果我减量并降落在另一个已经放置钥匙的位置,会发生什么。在我找到一个地方之前,我会再减少那么多吗
现在我很困惑,如果我减量并降落到另一个上会发生什么
已放置钥匙的位置。我是不是又减少了
在我找到一个地方之前要多久
对。如果您的哈希表大小为prime,并且该表未满,您最终将为新条目找到一个可用空间
您不仅要检查条目是否为NULL
。您还需要检查它是否包含与插入的密钥不同的密钥。将密钥存储在哈希表中非常重要,因此可以确保搜索的密钥就是找到的密钥
注意在不强制表索引位于数组边界的情况下修改表索引。例如,如果项
为0
,然后减去1
,则将有一个越界索引
您可以这样更正此问题:
item = (item - dec + hash->size) % hash->size;
谢谢你的评论!我会做一个while循环来不断减去这个值吗?你提供的那条线可以防止它出界?是的。为了安全起见,您可能希望保存原始索引并循环,直到您再次点击它或找到一个空闲的位置。我应该在您答案的底部添加行吗?这会进入while循环吗?是的。您将看到,这是一行通过减去
dec
来修改item
。所以,既然你想在循环中减去dec,那么这行就进入了循环。