2014-09-03 7 views
1

해시 테이블에서 키가 충돌하는 경우 자유 위치 (항상 같은 소금을 사용)를 찾을 때까지 반복적으로 키를 염색하여 다른 위치를 찾고 싶습니다. 예를 들어소금을 사용하여 해시 테이블 충돌을 피하는 방법은 무엇입니까?

:

  1. "벌"와 "개미"해시 나는 표에 "벌"을 삽입
  2. 7.
  3. 그런 다음 "ant"를 삽입하면 충돌합니다. "ant"와 "! 23"("! 23ant"가 발생 함)을 삽입하고 다시 삽입합니다. 원래 키를 저장하지만 소금 키를 사용하면 색인).

이 방법으로 해시 테이블을 검색했지만 해당 자료를 찾지 못했습니다.

이 충돌 해결 방법의 단점은 무엇입니까?

+0

충돌을 해결하기 위해 고정 소금을 사용하고 있습니까? 아니면 매번 새로운 소금을 선택합니까? – templatetypedef

+0

고정 된 소금. 예제에서 항상 "! 23"문자열 – ijverig

+0

두 번째 충돌이 발생하면 어떻게해야합니까? (그런데, 당신이 기술하고있는 기술은 다른 해싱 전략과 관련이 있습니다.하지만 들어가기 전에 시스템을 이해하고 있는지 확인하고 싶습니다.) – templatetypedef

답변

0

성능 측면에서 볼 때 해시 충돌마다 새로운 문자열을 작성해야하므로 입력 문자열이 길면 오래 걸릴 수 있습니다. 또한 해시 충돌이 점점 더 많을수록이 문자열을 만드는 데 드는 비용이 증가하므로 성공적인 조회의 가격은 얼마나 많은 충돌이 발생했는지에 따라 2 차적으로 달라집니다.

다른 해싱 접근법과 비교할 때,이 추가 비용으로 인해 선형 탐색이나 이중 해싱과 같은 다른 기법보다 시스템 속도가 느려질 수 있습니다. 해시 코드를 계산하고 보조 문자열을 구성하는 데 많은 작업을 수행 할 필요는 없습니다.

0

이것이 어떻게 문제를 해결하는지 알 수 없습니다. 의이 같은 충돌로 조금 놀자 : "23bug"

// Here you would store "bee" and "bug" with the hashes 7 and 8: 
"bee" = 7 
"bug" = 8 

// Here you get a collision and add a "salt": 
"bee" = 7 
"ant" = 7 -> "!23ant" -> 8 

// Depending on the adding order, you can end up with "bug"=8 or with "!23bug=9" 
"bee" = 7 
"!23ant" = 8 
"bug" = 8 -> "!23bug" -> 9 

이 어떻게 당신이 해시를 얻을 "버그"또는와 함께 검색 할 수 있는지 여부를 알 것이다. 이 정보를 저장하면 빠른 해시 맵의 이점이 무효화됩니다.