Algoritmo eficiente para distância de edição para sequências curtas


7

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 é O(mn), gostaria de saber se há algum espaço para melhorias. Eu encontrei esses dois algoritmos:

  • O(n+d2)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 vantagemdd
  • log(n)O(1/ϵ) aproximação em n1+ϵ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 log(n)O(1/ϵ) significa que a distância de edição calculada no pior dos casos é log(n)O(1/ϵ)vezes o real? Nesse caso, é demais.

Você conhece algum outro algoritmo / idéia / abordagem que possa ser aplicável?


2
Você já viu os autômatos de Levenshtein?
Adriann

Tem que ser exatamente a distância de Levenshtein ou alguma distância de edição relativamente consistente é boa o suficiente?
Pål GD

Você está interessado apenas na distância de edição se a distância de edição estiver abaixo de algum limite (por exemplo, se a distância de edição for >20, você não se importa com a distância exata de edição; apenas saiba que é>20é suficiente)?
DW

O DNA é realmente Levenshtein semelhante? 11 versus 00 é 2 para Levenshtein, mas 10 versus 01 é apenas 1. Eu ficaria realmente surpreso com o DNA de uma correspondência ou não, é tudo o que importa.
Paparazzo

@ PålGD uma boa aproximação da distância de Levenshtein também pode ser boa.
Ameer Jewdaki

Respostas:


3

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ãoDlonge da diagonal. No seu caso, isso pode ou não ser melhor do que as outras alternativas.


-1

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 ande conte os 1s

Não é perfeito, mas bilhões é muito, a menos que você jogue muita CPU nele.


11
Na verdade, são alguns trilhões de chamadas à distância no total, mas eu tenho acesso a um cluster de computação. O problema é que, se duas seqüências tiverem 100 comprimentos e houver várias inserções ou exclusões, o produto escalar se desviará da distância real.
Ameer Jewdaki

OK, você disse 70 de comprimento. Surpreende-me que um algoritmo baseado em palavras se aplique ao DNA. Existem equações científicas correspondentes a DNA - Estou surpreso que você não esteja usando uma delas.
Paparazzo

Não estou reclamando, mas um DV não me ajuda a ser um colaborador melhor aqui.
26417 paparazzo

Não votei negativamente na resposta. Na verdade, acho que geralmente é uma boa abordagem, mas aqui está muito longe por causa de inserções / exclusões.
Ameer Jewdaki

e sim, existem maneiras probabilísticas de definir a distância entre duas seqüências de DNA, mas nenhuma, acredito, é mais simples de calcular do que editar a distância. Então aqui eu estou apenas começando com a medida "simples"
Ameer Jewdaki
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.