Encontre todos os pares de valores próximos em Distância de Hamming

11

Eu tenho alguns milhões de valores de 32 bits. Para cada valor, quero encontrar todos os outros valores a uma distância de 5. De maneira ingênua, isso requer comparações de O(N2) , o que quero evitar.

Percebi que se apenas tratasse esses valores de 32 bits como números inteiros e classificasse a lista uma vez, então os valores que diferiam apenas nos bits menos significativos acabariam muito próximos. Isso me permite ter uma "janela" ou faixa de números mais curta dentro da qual eu possa realizar comparações reais em pares para a distância exata de hamming. No entanto, quando 2 valores variam apenas nos bits de ordem superior, eles acabam fora dessa "janela" e aparecem nas extremidades opostas da lista classificada. Por exemplo

11010010101001110001111001010110

01010010101001110001111001010110

estaria muito distante, mesmo que a distância de hamming seja 1. Como a distância de hamming entre 2 valores é preservada quando os dois são rotacionados, imaginei que, fazendo 32 rotações à esquerda e depois ordenando a lista todas as vezes, é provável que 2 valores terminará perto o suficiente na lista classificada em pelo menos um deles.

  1. Embora essa abordagem esteja me dando bons resultados, estou lutando para estabelecer formalmente a correção dessa abordagem.

  2. Dado que estou procurando valores correspondentes com distância de impedimento k ou menos, eu realmente preciso fazer todas as rotações de 32 bits? Por exemplo, se k=1 e o tamanho da minha janela for 1000, preciso fazer rotações máximas de 24 bits, porque mesmo que o bit disperso apareça em qualquer um dos 8 bits de ordem inferior, os números resultantes não serão diferentes em mais de 1000.

karterk
fonte
Apenas idéias a partir de 20 segundos de reflexão: que tal uma classificação pelo código Gray? Que tal dividir a lista de bitmaps de 32 bits em quatro listas de bitmaps de 8 bits e depois usar sua técnica?
Karl Damgaard Asmussen
1
Você poderia ser mais preciso sobre o número muito grande de bitmaps? É perto de , 2 30 ou o que quer? 220230
minar 31/07/2013
@minar: Eu tenho 3-4 milhões desses bitmaps de 32 bits.
karterk
Não tenho certeza do que você está perguntando. Você está dizendo que possui uma matriz de cadeias booleanas de 32 letras (grande, mas não contendo todas as cadeias 4 × 10 9 possíveis) e deseja marcar os pares que possuem distância de Hamming no máximo 5 de alguma forma, talvez criando uma lista vinculada de índices de vizinhos próximos para cada string i ? A[i]4×109A[i].closei
András Salamon
acho que existe um conceito semelhante de "quadtrees", exceto com hipercubos aplicável. o algoritmo localiza e recursivamente localiza os vetores em hipercubos e, quando você deseja pesquisar vetores de bits "próximos", apenas pesquisa hipercubos "próximos". suspeito que pode ser estudado e em uma em algum papel .... não tenho certeza os termos corretos ....
vzn

Respostas:

9

Como afirmado, sua abordagem é problemática, porque se 2 bitmaps tiverem diferenças espaçadas uniformemente, em qualquer rotação, haverá diferenças em alguns bits de ordem superior.

51/5064NN222

45529N4960N


Informação adicional:

  1. 51632
    (165)(325)0.0217
  2. A construção das listas, para cada elemento da lista original, é inserida na lista aumentada: o próprio elemento, todos os elementos diferentes em uma posição e todos os elementos diferentes em duas posições (mantendo as informações sobre o elemento original). O número de cópias para cada elemento éQualquer colisão nesta lista (detectada após a classificação) corresponde a dois elementos originais à distância, no máximo . Observe que cada par pode ser detectado várias vezes; portanto, você precisará remover duplicatas (mas esse já era o caso do seu algoritmo inicial).41+32+(322)=529.4
  3. Para o passe final, é preferível remover a lista aumentada de elementos para manter apenas aqueles à distância exata de seu elemento original. Em seguida, para cada elemento original, crie os elementos na distância e procure-os na lista aumentada. Mais uma vez, é necessário remover duplicatas, pois cada par será detectado vezes. [Com cuidado extra, você provavelmente pode antecipar / evitar a maioria das duplicatas, mas não tenho certeza se vale a pena o esforço.]( 3223 ( 5(323)=49603(53)=10
minar
fonte
Para a primeira abordagem, você está dizendo que permito o bitmap em algumas ordens pré-determinadas, em vez de fazer apenas rotações de bits? Você pode explicar como obteve a probabilidade 1/50? Além disso, para a segunda abordagem, preciso criar primeiro um índice da minha lista e depois para cada combinação de elemento - gerar (32C1 + 32C2) e compará-los com esse índice para identificar todos os bitmaps que diferem por uma distância de 2? Seria ótimo se você pudesse explicar isso mais a fundo. Obrigado.
karterk
5

a resposta de minar é excelente e provavelmente é a abordagem correta para esse problema em particular. No entanto, mencionarei mais uma abordagem possível:

Você pode usar uma função hash sensível à localidade (LSH). Uma função de hash sensível à localidade é projetada de modo que, se estão próximos na distância de Hamming, . Se você tiver um hash , poderá armazenar todos os seus valores em uma tabela de hash (usando a função hash e abrir hash) e poderá rapidamente encontrar todos os pares de valores próximos da distância de Hamming . Existem várias técnicas para construir um LSH; você pode consultar as referências sobre este tópico para encontrar vários candidatos.x , y H ( x ) = H ( y ) H HHx,yH(x)=H(y)HH

Dito isto, para o seu problema específico (com os parâmetros específicos que você mencionou), espero que os dois algoritmos de minar provem ser melhores na prática do que qualquer esquema baseado em LSH. Menciono isso apenas no caso de outros leitores chegarem a essa pergunta com um problema semelhante, mas com parâmetros diferentes em que o LSH pode fazer mais sentido.

DW
fonte