2012-09-16 14 views
5

मैं सी ++ में हैशटेबल क्लास को कार्यान्वित कर रहा हूं। टकराव समाधान विधि जो मैं उपयोग कर रहा हूं वह आलसी हटाने के साथ रैखिक जांच है। मैंने इसके कार्यान्वयन को देखा है लेकिन सम्मिलित विधि के संबंध में एक प्रश्न था। हैशटेबल के प्रत्येक कक्ष में एक राज्य (सक्रिय, हटाया गया, खाली) है। एक नया तत्व डालने के दौरान मैंने देखा है कि कार्यान्वयन में किसी कारण के लिए, उन्होंने कुंजी को हैश किया है और तब तक तालिका की जांच करें जब तक कि एक ईएमपीटीई सेल नहीं मिलता है (या जब तक कि पहले से ही एक ही कुंजी वाला सेल नहीं मिलता है)।सी ++ (सम्मिलन और आलसी हटाने) में हैशटेबल लागू करना

उदाहरण कोड:

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) पर परिवर्तित न करें ताकि लूप समाप्त हो जाए जब हमें कुंजी या पहले हटाए गए/खाली सेल के साथ सेल मिल जाए। फिर सम्मिलित करें, सेल की स्थिति का परीक्षण करें। अगर सक्रिय प्रविष्टि पहले से मौजूद है, तो झूठी वापसी; अन्य तत्व डालें।

उत्तर

3

कुंजी को आगे डाला जा सकता था, और बाद में हस्तक्षेप करने वाली कोशिकाओं में से एक को हटाए गए के रूप में चिह्नित किया जा सकता था। फिर आप एक ही कुंजी का एक डुप्लिकेट आवृत्ति डालेंगे।

0

शायद आपके संदर्भ कोड में आलसी डिलीट नहीं है, या हटाए गए राज्य को मौजूदा कार्यान्वयन में जोड़ा गया था। हां आप अपनी कुंजी के लिए एक प्रविष्टि को सुरक्षित रूप से "अनावृत" कर सकते हैं। लेकिन यह सुनिश्चित करें कि @ थॉमस के उत्तर में वर्णित स्थिति से बचने के लिए, इस एल्गोरिदम का लगातार उपयोग किया जाता है।