해싱 함수에서 소수를 mod로 사용하는 것이 가장 좋은 이유는 무엇입니까?


57

1에서 100 사이의 키 값 목록이 있고 11 버킷 배열로 구성하려는 경우 mod 함수를 형성하도록 배웠습니다.

H=kmod 11

이제 모든 값이 9 행으로 차례로 배치됩니다. 예를 들어 첫 번째 버킷에는 0,11,22 있습니다. 두 번째에는 1,12,23 등이 있습니다.

내가 나쁜 소년으로 결정하고 프라이밍이 아닌 것을 내 해싱 함수로 사용한다고 가정 해 봅시다. 12를 사용하십시오. 해싱 함수 사용

H=kmod 12

첫 번째 버킷 에는 값 0,12,24 , 두 번째 버킷에는 1,13,25 등 의 해시 테이블이 생성 됩니다.

본질적으로 그들은 같은 것입니다. 나는 충돌을 줄이지 않았고 소수 해시 코드를 사용하여 더 잘 퍼 뜨리지 않았으며 그것이 어떻게 유익한 지 알 수 없었습니다.


우리는 해시 함수에 XOR을 사용하는 이유 관련 질문, stackoverflow.com/questions/5889238/...
shuva

답변:


62

키 세트 와 버킷 수가 해시 테이블을 고려하십시오 . 이후 배이다 의 배수 키 의 배수 인 해시 버킷 것 :K={0,1,...,100}m=1231233

  • 키 는 버킷 해시됩니다 .{0,12,24,36,...}0
  • 키 는 버킷 해시됩니다 .{3,15,27,39,...}3
  • 키 는 버킷 해시됩니다 .{6,18,30,42,...}6
  • 키 는 버킷 해시됩니다 .{9,21,33,45,...}9

경우 균일하게 분포되어있다 (즉, 모든 키 동일하게 발생하기 쉬운), 다음의 선택 그다지 중요하지 않습니다. 그러나 가 균일하게 분포되지 않으면 어떻게됩니까 ? 발생할 가능성이 가장 높은 키가 의 배수라고 가정하십시오 . 이 경우 배수가 아닌 모든 버킷은 확률이 높아 비어있을 것입니다 (해시 테이블 성능 측면에서 실제로는 나쁩니다).KKmK33

이 상황은 더 흔하게 보일 수 있습니다. 예를 들어, 메모리에 저장된 위치를 기준으로 객체를 추적한다고 가정합니다. 컴퓨터의 워드 크기가 4 바이트이면 배수 인 해시 키가됩니다 . 도없이 선택하는 것을 말할 의 배수에 당신이 가진 것 : 끔찍한 선택이 될 것입니다 완전히 비어 버킷을, 나머지에 충돌하여 모든 키 버킷.4m43m/4m/4

일반적으로 :

버킷 수 과 공통 요소를 공유하는 모든 키 는이 요소의 배수 인 버킷에 해시됩니다.Km

따라서 충돌을 최소화하려면 과 요소 사이의 공통 요소 수를 줄이는 것이 중요합니다 . 이것이 어떻게 달성 될 수 있습니까? 을 소수의 요소가 적은 숫자 로 선택 : 소수 .mKm


방금 내 쿼리 가 귀하의 답변과 일치하는 것을 보았습니다 . 내 쿼리의 해시 함수가 양호하다고 생각하십니까?
overexchange

@ overexchange : 귀하의 질문에 대답 했습니다. 답변은 귀하에게 흥미로울 수도 있습니다.
Mario Cervera

K가 기울어 진 경우에만 m의 선택이 중요한 이유는 무엇입니까? K가 균일하게 분포되어 있어도 나쁜 m으로 성능이 더 나빠진다는 것이 사실이 아닙니까?
vorou ​​December

"bad "의 의미에 따라 다릅니다 . "해시 테이블의 요소 수에 비해 작음"(즉, 높은 부하 계수 )을 의미하면 성능이 저하됩니다. 그러나 "프라임이 아님"을 의미하는 경우, 모든 키가 해시 테이블에 균등하게 분배되기 때문에 모든 키가 똑같이 가능성이있는 경우이 사실은 중요하지 않습니다. 질문 자체가 예를 제공합니다. m
Mario Cervera

16

소수를 사용하여 충돌 가능성이 적은지 여부는 키 분포에 따라 다릅니다.

많은 키의 형식이 이고 해시 함수가 인 경우 이러한 키는 버킷의 작은 하위 집합으로 이동합니다 . iff 는 나눕니다 . 따라서 소수를 선택하여 달성 할 수있는 의 수를 최소화해야합니다 .a+kbH(n)=nmodmbnb

반면에 ~ 버킷을 원하고 배수 인 차이가 와 배수 인 차이보다 더 높다는 것을 알고 있다면 매우 특수한 용도로 를 선택할 수 있습니다 .1112112312


1
그러나 내 키가 형식 이 아닌 경우 은 중요하지 않습니다. 맞습니까? a+k×bm
CodyBugstein

1
@lmray, 키가 고르게 분포되어 있다면 은 중요하지 않습니다. 그렇지 않은 경우 의 중요도 분포에 따라 달라집니다 . mm
AProgrammer

방금 마지막 편집을 되돌 렸으므로 잊어 버렸습니다 . 12>11
frafl

3
" 가 나누면 버킷의 작은 하위 집합으로 이동"을 의미 했습니까 ? bm
Mikhail Dubov

8

이것이 영향을 미치는지 여부는 충돌을 처리하는 방법에 따라 다릅니다. 오픈 해싱 의 일부 변형을 사용할 때 소수를 사용하면 테이블이 충분히 비어있는 한 빈 슬롯을 찾을 수 있습니다.

예를 들어 다음을 표시하십시오.

우리가 해결하기 위해 해시 요소 삽입 할 가정 하고 위치를 시도하여 충돌을 해결 위해 계속해서 .aa+i2i=1,2,

해시 테이블의 크기가 이고 가 보다 큰 소수 이고 모든 위치의 적어도 절반이 비어있는 경우이 프로시 저는 항상 빈 위치를 생성 함을 보여줍니다 .pp3

힌트 : 가 소수이고 에 최대 솔루션 이있는 경우 잔기 클래스 링 모듈로 는 필드 라는 사실을 사용하십시오 .ppi2=c2


2

해시 함수의 형식이 여기서 은 소수이고 는 임의로 선택됨) 인 경우, 동일한 버킷에 대해 2 개의 개별 키가 해시 될 확률은 입니다. 따라서 경우 로 매우 작습니다.h(k)=a×kmodmma1mm=1009Pr{h(x)=h(y),xy}=0.00099108027

이 체계는 범용 해싱으로 알려져 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.