Eu tenho um aplicativo que precisa calcular bilhões de distâncias de levenshtein entre pares de strings. As cadeias são sequências de DNA curtas (70 de comprimento), consistindo apenas de 4 caracteres. Também pode-se supor que uma das seqüências seja fixa, ou seja, estamos comparando uma sequência fixa com um bilhão de outras seqüências.
Eu sei que a implementação de programação dinâmica da distância levenshtein é , gostaria de saber se há algum espaço para melhorias. Eu encontrei esses dois algoritmos:
- algoritmo, em que é a distância de edição de Berghel et al . No entanto, não posso assumir que é pequeno, por isso pode não dar nenhuma vantagem
- aproximação em tempo de Andoni et al . Mas tenho duas preocupações com relação a isso:
- Esse algoritmo também é rápido na prática?
- Faz significa que a distância de edição calculada no pior dos casos é vezes o real? Nesse caso, é demais.
Você conhece algum outro algoritmo / idéia / abordagem que possa ser aplicável?
strings
edit-distance
Ameer Jewdaki
fonte
fonte
Respostas:
Uma abordagem é construir um autômato de Levenshtein para a cadeia fixa (veja, por exemplo, aqui ). Dada uma stringx e uma distância D , você pode criar um DFA que reconheça todas as strings que estão à distância ≤D de x . Assim, você pode testar se uma sequência está próxima dex no O(n) hora, onde n é o comprimento da string. Não tenho certeza de quais são os requisitos de espaço para armazenar o DFA (eles são lineares emm,n , mas pode ser exponencial em D )
Como alternativa, você pode usar um algoritmo "early-out" para calcular a distância de edição. Você mencionou que só está interessado na distância de edição se for menor que algum limiteD . Existe um algoritmo "early-out" para calcular a distância de edição cujo tempo de execução éO(max(n,m)×D) , que calcula a distância de edição, se for ≤D ou então gera "muito grande" se for >D . Basicamente, você executa o algoritmo de programação dinâmica padrão para a distância de edição, mas calcula apenas os elementos da matriz que são≤D longe da diagonal. No seu caso, isso pode ou não ser melhor do que as outras alternativas.
fonte
Se eu tivesse que fazer bilhões e tivesse apenas 4 caracteres, eu os representaria como
1000
0100
0010
0001.
É um número inteiro de 35 bytes.
Pontue um pouco
and
e conte os 1sNão é perfeito, mas bilhões é muito, a menos que você jogue muita CPU nele.
fonte