2016-11-15 1 views
0

저는 현재 학기말에 가까운 데이터 구조 코스에 있으며 키를 저장하고 검색하기 위해 연결된 해시 테이블을 구현하는 프로젝트가 할당되었습니다. 우리는 해시 테이블 구현을 설계하는 방법에 대해 꽤 많은 자유가 주어졌지만 보너스 포인트에 대해 우리는 전체적으로 균일하게 그리고 무작위 적으로 우리의 키 (고유 한 문자열)를 배포하는 해시 함수를 찾으라고했습니다. 탁자.문자열을 일률적으로 해시하려고하는 해쉬 테이블?

나는 여기에 본의 ELF 해시를 사용하기로 선택한 http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx

다음과 같이 내 질문은 : 정수 반환이 해시 기능으로,하지만 난 문제가 이것이를 지정하는 데 도움이 될 수있는 방법을보고하는 데 문제 내 색인을 해시 테이블에 넣기위한 특정 색인 나는 간단히 할 수있다 : index = ELFhash (String key) % tableSize, 그러나 이것은 ELF 해시를 처음 사용하는 목적을 무효화합니까 ??

또한 충돌 해소 전략을 이중 해싱으로 선택했습니다. 점프를 찾기 위해 적절한 2 차 해싱 함수를 결정하는 좋은 방법이 있습니까? 내 해시 테이블은 일정한 크기가 될 수 없습니다. 문자열 집합이 추가되고 해싱 할 데이터 집합에서 제거되며 추가 및 제거가 반복 될 때마다 반복 계수가 .75가됩니다.) 따라서, k가 n과 같은 것을하기는 어렵다. 여기서 n은 테이블 크기에 비례하는 수이다.

시간을내어 질문을 읽어 주셔서 감사 드리며 귀하의 의견을 알려주세요.

답변

0

"바이어스 감싸기"에 대해 생각하는 것이 맞지만 가장 실용적인 목적으로는 문제가되지 않을 것입니다.

해시 테이블의 크기가 N이고 해시 값이 [0..M] 범위에있는 경우 k = floor(M/N)이라고합시다. [0..k*N) 범위의 모든 해시 값은 mod N을 맵으로 사용하여 각 해시 버킷이 정확히 k 해시 값으로 매핑된다는 점에서 "양호한"것입니다. [k*N..M)의 해시 값은 사용하는 경우 해당하는 M-K*n 최저 해시 버킷이 하나의 추가 해시 값에서 매핑된다는 점에서 "불량"입니다. 해시 함수가 완벽하더라도,이 버킷은 주어진 값을받을 가능성이 더 높습니다.

질문은 "얼마나 더 높습니까?" 그것은 M과 N에 달려 있습니다. 해시 값이 [0..2^32)unsigned int이고 Knuth 및 기타를 읽은 경우 1,000 개 정도의 버킷의 수를 선택하기로 결정합니다 (예 : 1009).

floor(2^32/1009) = 4256657 

"나쁜"값의 개수는 결과적으로, 모든 버킷 4,256,657 "좋은"값과 매핑되는

2^32 - 4256657 * 1009 = 383 

이며, (383), 따라서 4256658. 하나 추가 불필요한 "나쁜"값을 얻기 "bias"는 1/4,256,657입니다.

양동이 사이의 확률 차이가 1 백만 분의 1에 해당하는 해시 함수를 찾을 가능성은 거의 없습니다.

이제 1,000 개가 아닌 백만 개의 버킷으로 계산을 다시 수행하면 상황이 조금 다르게 보입니다. 이 경우 OC가 조금이라면 64 비트 해시로 전환하는 것이 좋습니다.

추가 사항 : Elf 해시는 절대적으로 끔찍한 결과를 내기는 쉽지 않지만 매우 빠르지 만 해시 기능이 훨씬 뛰어납니다. 합리적으로 잘 간주되는 시도는 Murmur 32입니다.(위키 기사에서는 원래의 alg에는 DoS 공격으로 악용 될 수있는 약점이 있지만 응용 프로그램에서는 괜찮을 것이라고 언급하고 있습니다.) 교수님이 코드 복사를 원하시는 것은 아니지만 Wikipedia 페이지에는 완료되었습니다. Elf를 직접 구현하고 Murmur와 비교하여 그들이 어떻게 비교하는지 보는 것은 흥미로울 것입니다.