해밍 거리에서 가까운 모든 값 쌍을 찾습니다


11

32 백만 개의 32 비트 값이 있습니다. 각 값에 대해 해밍 거리 5 내에서 다른 모든 값을 찾고 싶습니다. 순진한 접근 방식에서는 피하고 싶은 비교 가 필요합니다 .O(N2)

이 32 비트 값을 정수로 처리하고 목록을 한 번 정렬하면 가장 중요하지 않은 비트에서만 다른 값이 매우 가깝게 끝났다는 것을 깨달았습니다. 이를 통해 정확한 해밍 거리에 대한 실제 쌍별 비교를 수행 할 수있는 더 짧은 "창"또는 숫자 범위를 가질 수 있습니다. 그러나 2 개의 값이 높은 순서의 비트에서만 변할 경우이 "창"외부로 끝나고 정렬 된 목록의 반대쪽 끝에 나타납니다. 예 :

11010010101001110001111001010110

01010010101001110001111001010110

해밍 거리가 1이더라도 매우 멀리 떨어져 있습니다. 두 값을 모두 회전해도 두 값 사이의 해밍 거리가 유지되므로 매번 왼쪽으로 32 회 회전 한 다음 목록을 정렬하면 2 개의 값이 적어도 하나의 정렬 된 목록에서 충분히 닫힙니다.

  1. 이 방법을 사용하면 좋은 결과를 얻을 수 있지만이 방법의 정확성을 공식적으로 설정하는 데 어려움을 겪고 있습니다.

  2. 해밍 거리 이하의 일치하는 값을 찾고 있다고 가정하면 실제로 32 비트 회전을 모두 수행해야합니까? 예를 들어 k = 1 이고 내 창 크기가 1000 인 경우 스트레이 비트가 8 개의 하위 비트 중 하나라도 나타나더라도 결과 숫자가 1000 개 이상 다르지 않기 때문에 최대 24 비트 회전을 수행해야합니다.kk=1


생각 20 초만에 나온 아이디어 : 그레이 코드에 의한 정렬은 어떻습니까? 32 비트 비트 맵 목록을 4 개의 8 비트 비트 맵 목록으로 나누고 기법을 사용하는 것은 어떻습니까?
Karl Damgaard Asmussen

1
220230

@ minar : 32 비트 비트 맵은 3-4 백만입니다.
karterk

A[i]4×109A[i].closei

적용 가능한 하이퍼 큐브를 제외하고 비슷한 "쿼드 트리" 개념이 있다고 생각 하십시오. 알고리즘은 하이퍼 큐브에서 벡터를 찾아 재귀 적으로 찾은 다음 "가까운"비트 벡터를 검색하려면 "가까운"하이퍼 큐브 만 검색합니다. 그것은 어딘가에 연구 및 논문에서 의심 될 수 있습니다 .... 정확한 용어를 잘 모르겠습니다 ....
vzn

답변:


9

언급했듯이, 두 비트 맵이 회전 간격이 균등 한 간격을두고 회전 할 경우 상위 비트에 차이가 있기 때문에 접근 방식에 문제가 있습니다.

51/5064NN222

45529N4960N


추가 정보:

  1. 51632
    (165)(325)0.0217
  2. 원래 목록의 각 요소에 대해 목록을 구성하면 기능 보강 된 목록에 배치됩니다. 요소 자체, 한 위치에서 다른 모든 요소 및 두 위치에서 다른 모든 요소 (원래 요소에 대한 정보 유지). 각 요소의 사본 수는이 목록 내의 모든 충돌 (정렬 후 감지)은 최대 거리의 두 원래 요소에 해당합니다 . 각 쌍을 여러 번 감지 할 수 있으므로 중복을 제거해야합니다 (이미 초기 알고리즘의 경우).1+32+(322)=529.4
  3. 최종 패스의 경우 보강 된 요소 목록을 제거하여 원래 요소 와 정확히 거리 의 요소 만 유지하는 것이 좋습니다 . 그런 다음 각 원래 요소에 대해 거리 에서 요소를 작성 하고 기능 보강 된 목록에서 검색하십시오. 다시 한 번, 각 쌍이 번 감지되므로 중복 항목을 제거해야합니다 . [여분의주의를 기울이면 대부분의 복제본을 예상하거나 피할 수 있지만 노력이 가치가 있는지는 확실하지 않습니다.]2(323)=49603(53)=10

첫 번째 접근 방식에서는 비트 회전을 수행하는 대신 비트 맵을 미리 결정된 순서로 순열한다고 말하고 있습니까? 1/50 확률을 어떻게 얻었는지 설명해 주시겠습니까? 또한 두 번째 접근법의 경우 먼저 내 목록의 색인을 작성한 다음 모든 요소에 대해 (32C1 + 32C2) 조합을 생성 하고이 색인과 비교하여 거리가 2만큼 다른 모든 비트 맵을 식별해야합니까? 이것을 더 설명 할 수 있다면 좋을 것입니다. 감사.
karterk

5

minar의 대답은 훌륭하며 아마도이 특정 문제에 대한 올바른 접근 방법 일 것입니다. 그러나 가능한 한 가지 방법을 언급하겠습니다.

LSH (Locality -sensitive Hash Function)를 사용할 수 있습니다 . 가 해밍 거리에 가까울 경우 가되도록 지역별 해시 함수 가 설계되었습니다 . 그러한 해시 가있는 경우 모든 값을 해시 테이블에 저장하고 (해시 함수 및 오픈 해싱 사용) 해밍 거리에 가까운 모든 값 쌍을 매우 빠르게 찾을 수 있습니다 . LSH를 구성하는 다양한 기술이 있습니다. 이 주제에 대한 참조를보고 여러 후보를 찾을 수 있습니다.Hx,yH(x)=H(y)HH

즉, 특정 문제 (앞서 언급 한 특정 매개 변수 사용)에 대해 minar의 두 알고리즘이 LSH 기반 체계보다 실제로 더 나은 것으로 입증 될 것으로 예상됩니다. 다른 독자 가이 문제에 대해 비슷한 문제로 여기지만 LSH가 더 합리적 일 수있는 다른 매개 변수가있는 경우에만 이것을 언급합니다.

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