मैं सी ++ में हैशटेबल क्लास को कार्यान्वित कर रहा हूं। टकराव समाधान विधि जो मैं उपयोग कर रहा हूं वह आलसी हटाने के साथ रैखिक जांच है। मैंने इसके कार्यान्वयन को देखा है लेकिन सम्मिलित विधि के संबंध में एक प्रश्न था। हैशटेबल के प्रत्येक कक्ष में एक राज्य (सक्रिय, हटाया गया, खाली) है। एक नया तत्व डालने के दौरान मैंने देखा है कि कार्यान्वयन में किसी कारण के लिए, उन्होंने कुंजी को हैश किया है और तब तक तालिका की जांच करें जब तक कि एक ईएमपीटीई सेल नहीं मिलता है (या जब तक कि पहले से ही एक ही कुंजी वाला सेल नहीं मिलता है)।सी ++ (सम्मिलन और आलसी हटाने) में हैशटेबल लागू करना
उदाहरण कोड:
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(data[currentPos].state==ACTIVE && data[currentPos].key!=key)
पर परिवर्तित न करें ताकि लूप समाप्त हो जाए जब हमें कुंजी या पहले हटाए गए/खाली सेल के साथ सेल मिल जाए। फिर सम्मिलित करें, सेल की स्थिति का परीक्षण करें। अगर सक्रिय प्रविष्टि पहले से मौजूद है, तो झूठी वापसी; अन्य तत्व डालें।