2009-10-14 17 views
0

난 내 해시 테이블에 중복 항목 방지하기 위해 도움받을 수 있는지 궁금 :방지 중복 된 항목

bool hashmap::put(const stock& s, int& usedIndex, int& hashIndex, int& symbolHash) 
{ 
    hashIndex = this->hashStr(s.m_symbol); // Get remainder, Insert at that index. 
    symbolHash = (int&)s.m_symbol; 
    usedIndex = hashIndex; 

    while (hashTable[hashIndex].m_symbol != NULL) // collision found 
    { 
     ++usedIndex %= maxSize; // if necessary wrap index around 
     if (hashTable[usedIndex].m_symbol == NULL) 
     { 
      hashTable[usedIndex] = s; 
      return true; 
     } 
    } 
    hashTable[hashIndex] = s; // insert if no collision 
    return true; 

} 

이 paramater에있는 HashIndex가에 삽입 할 적절한 인덱스를 생성하기 위해 자바 알고리즘을 사용을 표. usedIndex 매개 변수는 충돌이 발견 될 때 테이블에 삽입하는 곳입니다. symbolHash는 전달 된 이름의 주소를 가져옵니다. stock class는 클래스 객체입니다.

제 질문은 중복 된 항목을 어떻게 방지합니까?

답변

1

해당 색인에 저장중인 객체를 살펴보십시오. 충돌로 인해 색인을 이동해야하는 경우에도 색인을 확인하십시오. 저장하려는 항목과 일치하면 예외 또는 예외를 throw하십시오.

bool hashmap::put(const stock& s, int& usedIndex, int& hashIndex, int& symbolHash) 
{ 
    hashIndex = this->hashStr(s.m_symbol); // Get remainder, Insert at that index. 
    symbolHash = (int&)s.m_symbol; 
    usedIndex = hashIndex; 

    if(hastTable[usedIndex].m_symbol == s.m_symbol){ 
     return false; 
    } 
    while (hashTable[hashIndex].m_symbol != NULL) // collision found 
    { 
      ++usedIndex %= maxSize; // if necessary wrap index around 
      if (hashTable[usedIndex].m_symbol == NULL) 
      { 
        hashTable[usedIndex] = s; 
        return true; 
      }else if(hastTable[usedIndex].m_symbol == s.m_symbol){ 
       return false; 
      } 
    } 
    hashTable[hashIndex] = s; // insert if no collision 
    return true; 

} 
2

당신이 충돌을 감지 나는 그래서 당신의 코드를 추측하고있어

은 ..., 당신은 항목이 동일한 값으로 해시 알고있다.

이 시점에서 삽입하려는 항목을 동일한 해시를 사용하여 저장된 모든 항목과 비교하십시오. 이미 저장된 항목이 삽입하려는 항목과 같으면 삽입하지 마십시오.

+0

정말 필요한가요? 다시 검색하는거야? – user40120

+0

실제로 충돌하는 항목 만 확인하면됩니다. 너무 많으면 어쨌든 해시 테이블의 효율성이 떨어집니다. – jakber

1

동일한 데이터의 해시는 동일합니다. 당신이 그렇지 않으면 (사용하지 않는 색인을 찾아 냄으로써) 당신이 다룰 때까지 똑같은 위치에 삽입 될 것입니다.

삽입 할 데이터의 해시와 기존 데이터의 해시간에 충돌이 발생하면 데이터가 일치하는지 (데이터가 일치하면 해시가 일치하므로) 확인하십시오. 모든 충돌에 대해 점검이 수행되므로 반복하는 동안 데이터를 점검해야합니다. (그래서 교체하거나 예외를 던져, 예를 들어, 당신이 원하는 방법 처리)를 while 루프에서 if

는 경우 hashTable[usedIndex] == s에 대한 검사를 추가하고 해당 조건에 해당하는 경우 중복이있다.

코드가 중복되지 않도록 if의 내부를 break;으로 바꿀 수 있습니다. 또한 무한 루프가 발생할 수 있으므로 usedIndex == hashIndex인지 확인해야합니다.