2011-08-20 5 views
2

HashTable에서 동일한 키를 여러 값에 매핑 할 수 있음을 읽었습니다. 그것이 바로 충돌입니다. 왜 내 HashTable에서 키 충돌을 허용하지 않습니까?

지금 나는이 같은 프로그램을 실행 :

Dictionary<String,String> hTable = new Hashtable<String,String>(); 
hTable.put("a", "aa"); 
hTable.put("a", "ab"); 
System.out.println(""+hTable.get("a")); 

나의 생각은 내가 aaab을 받아야했다.

그러나 실제 출력은 왜 그렇게이다 ab

입니까? 그러면 충돌은 어디에 있습니까?

+0

충돌은 내부 구현 세부 사항이며 동일한 키가 여러 번 사용되는 경우가 아니라 두 키가 같은 방식으로 해시 될 때 수행해야합니다. @Mehrdad가 지적했듯이, 그들은 당신을 위해 투명하게 해결됩니다 (모듈로 성능 저하). 일치하지 않는다면 하나의 키에 대해 여러 개의 값을 나타내지 않고 다른 키로 겹쳐 쓰여지는 일부 키 (같은 테이블 셀에 해시 된 것)가 표시됩니다. –

+0

@Lauenece : 1) 두 개의 키가 동일한 방식으로 해시 될 때해야하는 작업 2) 단일 키에 대해 여러 값을 표시하지 않는 동작이 있지만 다른 키로 신비하게 덮어 쓰게되는 키 . 그것에 대해 좀 더 설명해주십시오. – user900721

+0

나는 코멘트의 공간에서 그것을 더 명확하게 설명 할 수 없다. 좋은 알고리즘 책 또는 해설 표에 대한 해시 테이블을 읽으십시오 (http://en.wikipedia.org/wiki/Hash_table). 이들은 구현 세부 사항입니다. 'Hashtable' 클래스를 * 사용하고 싶다면이 세부 사항을 알 필요가 없습니다. 단지 인터페이스/계약을 이해하십시오. 'Hashtable'은'Dictionary'를 확장하여'Dictionary'의 계약을 따르고'Dictionary'의 문서는 "어느 하나의'Dictionary 객체에서 모든 키는 하나의 값과 관련이 있습니다"라고 말합니다. –

답변

3

충돌이 없습니다. HashTable 항목은 키를 하나의 값으로 매핑합니다.

샘플에서 세 번째 줄 :

hTable.put("a", "ab"); 

a에서 ab에 매핑 aaa에서 매핑을 대체합니다.

코드 실행을 완료 한 후 hTable에는 a에서 ab까지의 매핑이 하나만 있습니다.

3

내부적으로 만 충돌이 발생합니다.입니다. 사용자으로 이 투명하게 해결되었습니다.

해시 테이블이 사전이 될 수있는 이유입니다. 각 키를 정확하게 1 값으로 매핑합니다. 이 값이 1보다 큰 값으로 매핑되면 사전이 아닙니다.

+0

+1은 충돌이 내부 문제라는 것을 지적합니다. 두 번째 단락의 말씨는 약간 이상해 보입니다. 그것은 충돌을 투명하게 해결하기 때문에 * 사전이 아닙니다. –

+0

@Laurence : 동의합니다. 1 초를 말합니다. – Mehrdad

2

Hashtable은 동일한 키를 여러 값으로 매핑하지 않습니다. 충돌은 개의 키가 동일한 해시 값에 매핑 될 수 있습니다. 그것은 당신에게 투명한 데이터 구조 자체에 의해 해결됩니다.

htable.get ("a")로 aa와 ab를 가져 오려면 Dictionary<String,List<String>>을 만들고 같은 키 값으로 목록을 추가해야합니다. 코드

hTable.put("a", "aa"); 
hTable.put("a", "ab"); 

에서

는 키는 동일합니다. 따라서 두 번째 작업에서는 "ab"를 사용하여 "aa"를 재정의했습니다. 그래서 "ab"만 얻습니다.

+0

좋아, 그 의미 : "여러 키가 동일한 해시 값에 매핑 될 수 있습니다."키가 동일하고 해시 값이 같다고 생각했습니다. 내가 맞습니까? – user900721

+0

네가 맞습니다. 그러나 키가 동일하지 않더라도 해시 값은 동일 할 수 있습니다. 이것이 바로 "충돌"입니다. –

+0

괜찮음. 나는 이해했다. 감사 ! 다음 일 다음 충돌의 경우 어떤 값을 검색해야하는지 어떻게 알 수 있습니까? – user900721

2

HashTable은 키 - 값 매핑입니다. 즉 하나 이상의 키에 대해 여러 값을 가질 수 없습니다. 두 개의 데이터 구조를 결합하여 여러 값을 하나의 키로 저장해야합니다.

예를 들어, 당신은 HashTable 안에 linkList를 넣을 수 있습니다. 예를 들어 지금

HashTable<String,LinkedList<String>> table = new HashTable(); 
LinkedList<String> list = new LinkedList(); 
list.add("aa"); 
list.add("ab"); 
table.add("a",list); 

를 들어 당신이 AAAB 값을 취득 할 수있다;

table.get("a").get(0); // returns aa 
table.get("a").get(1); // returns ab 

데이터 구조 및 알고리즘의 기본 정보를 확인하시기 바랍니다.

1

키를 사용하여 값을 검색하려고합니다. 배열은이 목적을 수행하지만 정수 키를 사용하는 것으로 제한되며 너무 많은 공간을 사용할 수 있습니다 (0과 1000 위치에만 값을 저장하면 2 개의 요소에 대해 전체 배열을 할당해야 함).

  • 바이트의 고정 길이의 배열에서, 가변 길이의 바이트 배열을 변환하는 분산 비 단사 함수 :

    해시 테이블은 이러한 문제를 모두 해결한다. 즉, 해시 (bytes_1) == hash (bytes_2)가 발생하지만 발생하지 않습니다. 이 너무 자주이고 bytes_1 ~ bytes_2가 해시가 다른 경우,

  • 중고 해시 인덱스. 함수가 10 바이트의 배열을 반환하면 2^80 가지 가능성이 있으므로 이미 발생한 해시의 정렬 된 목록을 유지해야합니다.
  • 링크드리스트의 배열. 해시 인덱스는 해시를 배열의 위치와 매핑합니다.

충돌은 두 개의 키가 동일한 해시를 가짐을 의미합니다. map.put("key1", "value1"); map.put("key2", "value2") key1과 key2가 동일한 연결 목록에 포함될 수 있습니다.

관련 문제