Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 哈希表:冲突时双探测_C_Logic_Hashtable_Double Hashing - Fatal编程技术网

C 哈希表:冲突时双探测

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-&

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

首先创建一个数组,该数组将保存所有数据,并按键进行排序。我使用公式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;
   }

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

现在我很困惑,如果我减量并降落到另一个上会发生什么 已放置钥匙的位置。我是不是又减少了 在我找到一个地方之前要多久

对。如果您的哈希表大小为prime,并且该表未满,您最终将为新条目找到一个可用空间

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

注意在不强制表索引位于数组边界的情况下修改表索引。例如,如果
0
,然后减去
1
,则将有一个越界索引

您可以这样更正此问题:

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

谢谢你的评论!我会做一个while循环来不断减去这个值吗?你提供的那条线可以防止它出界?是的。为了安全起见,您可能希望保存原始索引并循环,直到您再次点击它或找到一个空闲的位置。我应该在您答案的底部添加行吗?这会进入while循环吗?是的。您将看到,这是一行通过减去
dec
来修改
item
。所以,既然你想在循环中减去dec,那么这行就进入了循环。