2011-02-15 2 views
1

내가 포인터에 문제가 있어요 그 주위 얻을 수 없다 .. 해시 테이블 구현에서포인터을 비교 한 문제

, 나는 각 bucket.The 문제에 주문 노드의 목록이 나는이 글은의이 다음 노드가 현재 노드보다 큰 지 (삽입 된 경우 해당 위치에 삽입하기 위해) 비교하여 삽입 함수를 사용하여 순서를 유지합니다.

당신은이 해시 구현이 이상하다고 생각할 수 있습니다.하지만 이미 많은 수의 조회를 수행 할 수 있어야합니다 (하지만 때로는 거의 없습니다). 그리고 이미 삽입되어 있다면 반복 횟수를 계산해야합니다. 따라서 해쉬 조회가 필요합니다. 따라서 해시 , 나는 AVL 또는 RB 나무와 같은 자기 균형 나무에 대해 생각해 보았습니다. 그러나 저는 그것들을 모릅니다. 따라서 구현 방법을 알고있는 해결책을 찾으러갔습니다 ...이 문제는 더 빠르지 않습니까?) 또한 끝나면 주문에 따라 검색해야합니다. 간단한 목록을 작성하기 전에 배열을 검색 한 다음 QuickSort를 수행하지만 목록을 정렬하여 유지할 수 있다고 생각합니다. Sg에 < < 9 | | SB)를 모두 같은에서하고 내가 뭔가를 27 비트 부호없는 INT (가장 정확히 3 개 9 비트 번호의 매핑해야하지만, 내가하고 27 비트 숫자로 변환 무엇 (SR < < 18

그들의 가치를 hash_value 시간. 만약 당신이 12-13-14 비트 테이블에 그 27 비트 정수를 매핑하는 좋은 기능을 안다면, 지금은 그냥 전형적인 mod 소수 솔루션을 할께.

이것은 내 hash_node 구조체 예 :

이것은 gdb를 보여줍니다 무엇
void hash_table::insert(unsigned int hash_value) { 

unsigned int p = hash_value % tableSize; 
if (table[p]!=0) { //The bucket has some elements already 
hash_node *pred; //node to keep the last valid position on the list 
    for (hash_node *aux=table[p]; aux!=0; aux=aux->next) { 
      pred = aux; //last valid position 
     if (aux->hash_value == hash_value) { 
       //It's already inserted, so we increment it repetition counter 
       aux->repetitions++; 
      } else if (hash_value < (aux->next->hash_value)) { //The problem 
        //If the next one is greater than the one to insert, we 
        //create a node in the middle of both. 
     aux->next = new hash_node(hash_value,aux->next); 
     colisions++; 
        numElem++; 
       } 
    }//We have arrive to the end od the list without luck, so we insert it after 
    //the last valid position 
ant->next = new hash_node(hash_value,0); 
colisions++; 
    numElem++; 
}else { //bucket it's empty, insert it right away. 
    table[p] = new hash_node(hash_value, 0); 
    numElem++; 
} 

}

:

효과적으로 I, 오른쪽 값으로 메모리 ADRESS을 비교하고 있습니다 나타냅니다
Program received signal SIGSEGV, Segmentation fault. 
0x08050b4b in hash_table::insert (this=0x806a310, hash_value=3163181) at ht.cc:132 
132     } else if (hash_value < (aux->next->hash_value)) { 

? 희망 그것은 분명했다. 다시 한 번 감사드립니다!

+0

'aux-> next'가 NULL이 아닌지 확인할 수 있습니까? – chrisaycock

+0

글쎄, 나는이 주제의 강의 중 하나이고이 학생이 참여하고있는 프로그래밍 경진 대회의 주최자이다. 자유롭게 그에게 도움을 줄 수는 있지만 학생들이 직접 콘테스트를 해결하거나 다른 프로그래밍 소스를 읽지 만 커뮤니티에 대한 활성 쿼리를 사용하지 않아야한다고 가정합니다. 어쨌든 나는이 쿼리를 발견 했으므로 다른 참가자가 할 수 있고 사본은 완전히 금지되어 있습니다 ........ –

답변

2
aux->next->hash_value 

"다음"이 NULL인지 확인하지 않습니다.

+0

예, 둘 다 완전히 똑바로 ... 잘 빠릅니다 (그리고 어리석은 !) 또한 데이터의 일부 집합에서이 구현이 더 빠르지 만 대개 느리다는 것을 알게되었습니다. 감사! – asendra

1

aux-> next가 NULL 일 수 있습니까? aux-> next가 NULL인지 여부를 어디에서 확인했는지 알 수 없습니다.

+0

네, 당신은 모두 옳았습니다 ... 잘 빠르며 (어리석은!) 또한이 구현은 일부 데이터 집합에서는 더 빠르지 만 대개 느린 것을 알고 있습니다. 감사! – asendra