在C+中实现哈希表+;(插入和延迟删除) 我在C++中实现了一个哈希表类。 我使用的冲突解决方法是延迟删除的线性探测。 我已经看到了这种方法的实现,但是对于insert方法有一个问题。 哈希表的每个单元格都有一个状态(活动、删除、空)。由于我在插入新元素时看到的实现中的某些原因,它们散列键,然后探测表,直到找到一个空单元格(或者直到找到一个已经包含相同键的单元格)

在C+中实现哈希表+;(插入和延迟删除) 我在C++中实现了一个哈希表类。 我使用的冲突解决方法是延迟删除的线性探测。 我已经看到了这种方法的实现,但是对于insert方法有一个问题。 哈希表的每个单元格都有一个状态(活动、删除、空)。由于我在插入新元素时看到的实现中的某些原因,它们散列键,然后探测表,直到找到一个空单元格(或者直到找到一个已经包含相同键的单元格),c++,insert,hashtable,hash-collision,C++,Insert,Hashtable,Hash Collision,示例代码: 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

示例代码:

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;否则,请插入元素。

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

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