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


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(lgu)u

위키 / 유니버설 해시 시사 , 충분히 큰 소수이고 에서 균일하게 그려집니다 . 요소 를 추가하거나 제거 할 때 해시 코드에서 를 더하거나 빼야 .이 경우 지수를 나누고 정복 하는 데 시간 이 걸립니다 . 차수 의 다항식 에는 루트 만있을 수 있으므로 두 개의 서로 다른 세트에 대한 충돌 확률은 입니다. 를 충분히 크게하여 매우 작게 만들 수 있습니다 (예 :h(x)=(i=1uxiai)modppa[p]iaiO(lgi)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.