해시 테이블 데이터 구조의 기본 원칙을 알고 있습니다. 내가 크기 N의 해시 테이블을 가지고 있다면 가능한 한 균등하게이 N 개의 버킷에 데이터를 분산시켜야합니다.동적 크기 해시 테이블을 구현하는 방법은 무엇입니까?
실제로 대부분의 언어에는 해시 테이블 형식이 내장되어 있습니다. 내가 사용할 때 해시 테이블의 크기를 미리 알 필요가 없습니다. 나는 단지 내가 원하는 것을 넣었다. 예 : Ruby
:
h = {}
10000000.times{ |i| h[i]=rand(10000) }
어떻게 할 수 있습니까?
테이블의 크기를 두 배로 늘리면 값을 검색 할 때 키를 해시하고 해시 테이블에서 'hash % current_size','hash '로 시작하는 모듈 검색을 수행합니다 % current_size/2' 등이 있습니다. 값을 찾으면 다시 해쉬 할 수 있습니다. 그렇게하면 일반적으로 액세스되는 값이 자동으로 다시 해치워지기 때문에 너무 많은 성능을 잃지 않고 게으른 다시 해싱을 수행 할 수 있습니다. –
@DvirVolk, 게으른 rehash가 좋습니다. 이미 최상위 해시 테이블에 항목을 알고 있고 하위 해시 테이블에서 가져올 위치를 알고 있습니다. 그러나 일부 항목이 빈 버킷의 전체 테이블을 보유 할 상황이있을 수 있습니다. Wiki에서 "Incremental resizing"은 이해할 수있는 데이터 크기에 대한 tradoff 속도의 해법입니다. (N은 최상위 해시 테이블의 크기 인 2 * N 버킷을 보유합니다). 크기를 두 배로 늘리면 이전 버킷의 링크 된 목록을 다시 사용하여 단일 버킷을 두 개로 분할하거나 두 개를 하나로 합쳐야합니다 (해시 재 계산없이). – ony