2012-09-16 15 views
5

私はC++でHashtableクラスを実装しています。 私が使用している衝突解決方法は、レイジー削除による線形プロービングです。 私はこれの実装を見てきましたが、挿入メソッドに関して質問がありました。 ハッシュテーブルの各セルには、状態(アクティブ、削除、空)があります。何らかの理由で、新しい要素を挿入する際に、キーをハッシュしてから、EMPTYセルが見つかるまで(またはすでに同じキーが入っているセルが見つかるまで)、テーブルを調べます。C++でのハッシュテーブルの実装(挿入と遅延の削除)

コード例:

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を返します。それ以外の場合は要素を挿入します。

答えて

3

キーがさらに挿入された可能性があり、後に介在するセルの1つが削除済みとしてマークされている可能性があります。次に、同じキーの複製インスタンスを挿入します。

0

おそらく、参照コードにレイジー削除がなかったか、または既存の実装にDELETED状態が追加された可能性があります。はい、安全にあなたのキーのエントリの "元に戻す"ことができます。しかし、このアルゴリズムが@Thomasの答えに記述されている状況を避けるために一貫して使用されていることを確認してください。

関連する問題