2012-03-25 2 views
7

해시 테이블 데이터 구조의 기본 원칙을 알고 있습니다. 내가 크기 N의 해시 테이블을 가지고 있다면 가능한 한 균등하게이 N 개의 버킷에 데이터를 분산시켜야합니다.동적 크기 해시 테이블을 구현하는 방법은 무엇입니까?

실제로 대부분의 언어에는 해시 테이블 형식이 내장되어 있습니다. 내가 사용할 때 해시 테이블의 크기를 미리 알 필요가 없습니다. 나는 단지 내가 원하는 것을 넣었다. 예 : Ruby :

h = {} 
10000000.times{ |i| h[i]=rand(10000) } 

어떻게 할 수 있습니까?

답변

3

the Dynamic resizing section of the Hash table article on Wikipedia을 참조하십시오.

일반적으로 접근 방식은 a dynamic array과 같은 논리를 사용합니다. 일부 버킷이 있고 해시 테이블에 너무 많은 항목이있는 경우 더 큰 크기의 새 해시 테이블을 만들고 모든 항목을 새 것으로 이동합니다. 해시 테이블.

해시 테이블의 유형에 따라이 크기 조정은 정확성을 위해 필요하지 않을 수도 있습니다 (즉, 크기 조정 없이도 작동 할 수 있음).하지만 성능을 위해서는 반드시 필요합니다.

+4

테이블의 크기를 두 배로 늘리면 값을 검색 할 때 키를 해시하고 해시 테이블에서 'hash % current_size','hash '로 시작하는 모듈 검색을 수행합니다 % current_size/2' 등이 있습니다. 값을 찾으면 다시 해쉬 할 수 있습니다. 그렇게하면 일반적으로 액세스되는 값이 자동으로 다시 해치워지기 때문에 너무 많은 성능을 잃지 않고 게으른 다시 해싱을 수행 할 수 있습니다. –

+0

@DvirVolk, 게으른 rehash가 좋습니다. 이미 최상위 해시 테이블에 항목을 알고 있고 하위 해시 테이블에서 가져올 위치를 알고 있습니다. 그러나 일부 항목이 빈 버킷의 전체 테이블을 보유 할 상황이있을 수 있습니다. Wiki에서 "Incremental resizing"은 이해할 수있는 데이터 크기에 대한 tradoff 속도의 해법입니다. (N은 최상위 해시 테이블의 크기 인 2 * N 버킷을 보유합니다). 크기를 두 배로 늘리면 이전 버킷의 링크 된 목록을 다시 사용하여 단일 버킷을 두 개로 분할하거나 두 개를 하나로 합쳐야합니다 (해시 재 계산없이). – ony

관련 문제