이론적 보증이 좋은 정수 컬렉션 (즉, 다중 집합)에 대한 해시 함수가 있습니까?


36

이상적으로 다음과 같은 속성을 갖는 여러 정수 세트의 해시를 저장하는 방법이 있는지 궁금합니다.

  1. O (1) 공간을 사용합니다
  2. O (1) 시간에 삽입 또는 삭제를 반영하도록 업데이트 할 수 있습니다.
  3. 두 개의 동일한 콜렉션 (즉, 동일한 다중성을 갖는 동일한 요소를 갖는 콜렉션)은 항상 동일한 값으로 해시해야하며, 두 개의 고유 한 콜렉션은 확률이 높은 다른 값으로 해시해야합니다 (즉, 함수는 독립적이거나 쌍으로 독립적입니다)

이에 대한 첫 번째 시도는 개별 모듈의 해시 소수를 곱하여 모듈로 제품 모듈로를 저장하는 것입니다. 이것은 1과 2를 만족 시키지만, 또는 가까운 변형이 3을 만족 시킬지는 확실하지 않습니다.

나는 원래 이것을 StackOverflow에 게시했습니다 .

* 속성 1과 2는 O (log n) 또는 작은 하위 선형 다항식으로 약간 완화 될 수 있습니다. 요점은 요소 자체를 저장하지 않고도 다중 집합을 식별하고 동등성을 안정적으로 테스트 할 수 있는지 여부를 확인하는 것입니다.


다중 집합의 표현은 무엇입니까? 즉, 다중 집합을 비트 문자열로 어떻게 인코딩합니까? 시간 연산 (멀티 세트의 크기와 독립적으로 을 실제로 얻으려면 인코딩을 명시 적으로 만들어야한다고 생각합니다. O(1)
— Jukka Suomela

세트의 인코딩은 중요하지 않습니다. 해시 함수는 세트의 표현과 독립적이어야합니다. 해시 세트의 표준 표현을 사용하는 경우 세트의 비트 표현에 대한 표준 해시는 3을 만족하지만 1은 만족하지만 2는 아닙니다. 두 개의 동일한 콜렉션이 항상 동일한 값으로 해시되어야한다고 추가해야합니다.
— jonderry

2가 정확히 무엇을 의미합니까? 이전 세트, 이전 해시 코드 및 새 요소를 가져오고 새 해시 코드를 계산 하시겠습니까? 아니면 오래된 해시 코드와 새로운 요소를 얻습니까?
— Mihai

이상적으로는 이전 세트가 필요하지 않습니다. 공간 제한이 주어지면 멤버 쿼리 (중요한 공간을 고려할 때)를 수행 할 필요도없고, 오 탐지 확률이 낮은 해시 값을 비교하여 동등성 테스트 만 수행 할 수도 있습니다.
— jonderry

답변:


17

집합이 우주에 사는 것으로 생각하면 업데이트 시간으로 문제를 해결하는 것이 매우 쉽습니다 . 빠른 "로컬 업데이트"와 함께 숫자 의 벡터에 대한 빠른 해시 함수 만 있으면됩니다 .[u]O(lg⁡u)u

위키 / 유니버설 해시 시사 , 충분히 큰 소수이고 에서 균일하게 그려집니다 . 요소 를 추가하거나 제거 할 때 해시 코드에서 를 더하거나 빼야 .이 경우 지수를 나누고 정복 하는 데 시간 이 걸립니다 . 차수 의 다항식 에는 루트 만있을 수 있으므로 두 개의 서로 다른 세트에 대한 충돌 확률은 입니다. 를 충분히 크게하여 매우 작게 만들 수 있습니다 (예 :h(x→)=(∑i=1uxiai)modppa[p]iaiO(lg⁡i)uuO(u/p)pp=u2"배정 밀도"로 작업합니다.) 집합이 보다 훨씬 작은 경우 에는 물론 유니버스를 더 작은 유니버스로 해싱하여 시작할 수 있습니다.[u]

범위 해싱 할 때 충돌 확률 이있는 솔루션을 아는 사람이 있습니까? 가능해야합니다.O(1/p)[p]


0

Carter와 Wegman은 새로운 해시 함수와 인증 및 동등성 설정에서 이를 다루고 있습니다 . 그것은 당신이 묘사 한 것과 매우 유사합니다. 본질적으로 정류 해시 함수는 O (1)에서 삽입 및 삭제 및 높은 확률 일치를 위해 한 번에 한 요소 씩 업데이트 할 수 있습니다.


나는 이것이 멀티 세트가 아닌 세트에서만 작동한다고 생각합니다 (질문이 요구 한대로). 274 페이지 맨 아래 섹션 5에서 : "ADD (x, S)-요소 x를 S라는 집합에 추가합니다. x가 이미 S의 구성원 인 경우이 작업을 사용할 수 없습니다."
— jbapple

네가 옳아; 나는 "멀티"부분을 놓쳤다. 인용 부호는 없지만 해시 함수가 중복을 처리 할 수있을 것 같습니다.
— KWillets

-2

해시 함수의 품질은 항상 해시해야하는 요소의 속성에 따라 다릅니다. 이것에 대해 말할 수 있습니까? 예를 들어, 다중 집합의 x_i 요소에 일반적으로 작은 소수 요소가 많은 경우 제품 제안이 해시 함수가 불량한 것일 수 있습니다. 그러나이 경우 일부 소수 p 및 q에 대해 모든 x_i + p mod q의 곱을 취하면 간단히 향상시킬 수 있습니다.


1
그렇기 때문에 개별 요소의 해시를 곱하기 전에 해시를 취하는 이유입니다.
— jonderry

뭐? OP의 제안은 단순히 그것들을 모두 곱하는 것입니다. 나는 이것을하기 전에 각각에 상수를 추가하면 더 나은 해시를 얻을 수 있다고 말하고 있습니다.
— TonyK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

합은 우리가 같은 값을 여러 번 가질
수있게합니다.

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