在C ++中实现哈希表(插入和延迟删除)

时间:2012-09-16 16:40:46

标签: c++ insert hashtable hash-collision

我正在用C ++实现一个Hashtable类。 我使用的冲突解决方法是使用延迟删除进行线性探测。 我已经看到了这个的实现,但有一个关于插入方法的问题。 哈希表的每个单元都有一个状态(活动,删除,空)。出于某种原因,我在插入新元素时看到了实现,他们对密钥进行散列,然后探测表,直到找到EMPTY单元格(或直到找到已包含相同密钥的单元格为止)。

示例代码:

int findPos(const string &key){
     int currentPos=hash(key);
     while(data[currentPos].state!=EMPTY && data[currentPos].key!=key){
         currentPos++;
         if (currentPos>=data.size())
            currentPos-=data.size()
         }
      return currentPos;
}

bool insert(const string &key){
     int currentPos=findPos(key);
     if (isActive(currentPos))
          return false; //already exists
     data[currentPos]=hashEntry(key,ACTIVE);
     if (++currentSize>data.size()/2)
          rehash();
     return true;   //element inserted
}

我的问题是:是否有理由不停止并插入已标记为已删除的单元格?换句话说,在findPos方法中,为什么不将while语句更改为while(data[currentPos].state==ACTIVE && data[currentPos].key!=key),以便在我们找到带有键的单元格或第一个已删除/空单元格时循环结束。然后在插入中,测试细胞的状态。如果激活该条目已存在,则返回false;否则插入元素。

2 个答案:

答案 0 :(得分:3)

密钥可能已被进一步插入,之后其中一个插入的单元格可能已被标记为已删除。然后,您将插入相同密钥的重复实例。

答案 1 :(得分:0)

可能您的参考代码没有延迟删除,或者DELETED状态已添加到现有实现中。是的,您可以安全地“取消删除”您的密钥条目。但请确保一致地使用此算法,以避免@Thomas的答案中描述的情况。