C 是';空出';在开放地址哈希表中只能存储一个变量?
我正在用C学习主算法,在开放地址哈希表程序中,作者定义:C 是';空出';在开放地址哈希表中只能存储一个变量?,c,hashtable,C,Hashtable,我正在用C学习主算法,在开放地址哈希表程序中,作者定义:void*vacked指向哈希表中的空位置。如果我想连续删除哈希表中的2个值。这是真的吗?因为空出的将指向最后一个删除的变量,这是不可能的吗 如果我想连续删除两个具有相同哈希值的变量。我认为这与删除两个散列值不同的变量是不同的 在函数ohtbl\u remove中,我找不到将要删除的变量设置为NULL的语句。如果我想连续删除变量,它是如何删除变量的?谢谢 int ohtbl_remove(OHTbl *htbl, void **data)
void*vacked
指向哈希表中的空位置。如果我想连续删除哈希表中的2个值。这是真的吗?因为空出的
将指向最后一个删除的变量,这是不可能的吗
如果我想连续删除两个具有相同哈希值的变量。我认为这与删除两个散列值不同的变量是不同的
在函数ohtbl\u remove
中,我找不到将要删除的变量设置为NULL的语句。如果我想连续删除变量,它是如何删除变量的?谢谢
int ohtbl_remove(OHTbl *htbl, void **data) {
int position,
i;
/*****************************************************************************
* *
* Use double hashing to hash the key. *
* *
*****************************************************************************/
for (i = 0; i < htbl->positions; i++) {
position = (htbl->h1(*data) + (i * htbl->h2(*data))) % htbl->positions;
if (htbl->table[position] == NULL) {
/***********************************************************************
* *
* Return that the data was not found. *
* *
***********************************************************************/
return -1;
}
else if (htbl->table[position] == htbl->vacated) {
/***********************************************************************
* *
* Search beyond vacated positions. *
* *
***********************************************************************/
continue;
}
else if (htbl->match(htbl->table[position], *data)) {
/***********************************************************************
* *
* Pass back the data from the table. *
* *
***********************************************************************/
*data = htbl->table[position];
htbl->table[position] = htbl->vacated;
htbl->size--;
return 0;
}
}
int ohtbl\u删除(ohtbl*htbl,无效**数据){
int位置,
我
/*****************************************************************************
* *
*使用双哈希对密钥进行哈希*
* *
*****************************************************************************/
对于(i=0;ipositions;i++){
位置=(htbl->h1(*数据)+(i*htbl->h2(*数据)))%htbl->位置;
if(htbl->table[position]==NULL){
/***********************************************************************
* *
*返回未找到数据的消息*
* *
***********************************************************************/
返回-1;
}
else if(htbl->表[位置]==htbl->已空){
/***********************************************************************
* *
*搜索空出的位置以外的位置*
* *
***********************************************************************/
继续;
}
else if(htbl->match(htbl->table[位置],*数据)){
/***********************************************************************
* *
*从表中传回数据*
* *
***********************************************************************/
*数据=htbl->表格[位置];
htbl->表【位置】=htbl->空出;
htbl->尺寸--;
返回0;
}
}
列表中的多个元素可能都指向同一个已空出的
成员-因此,表中不能只有一个空出的插槽。也可以有多个连续的空出插槽。链接将指向下一个条目;数据指针将指向已空出的
,因此您知道这一点有一次,这里有一个元素,你应该继续搜索它。是的,这是我在实现我的元素时犯的第一个错误,如果你看看谷歌是如何做到的,我想我记得,如果他们注意到“删除”标志污染超过50%,他们会调用垃圾压缩功能。