C++でHashtableクラスを実装しています。私が使用している衝突解決方法は、レイジー削除を使用した線形プロービングです。私はこれの実装を見てきましたが、insertメソッドに関して質問がありました。ハッシュテーブルの各セルには、状態(アクティブ、削除済み、空)があります。何らかの理由で、新しい要素を挿入するときに見た実装では、キーをハッシュしてから、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を返します。それ以外の場合は、要素を挿入します。