Maior substring comum em tempo linear


Respostas:


14

Deixei m e n ser o comprimento de duas cordas dadas,

Tempo linear assumindo que o tamanho do alfabeto é constante.

Sim, a substring comum mais longa de duas seqüências especificadas pode ser encontrada em O(m+n) tempo, assumindo que o tamanho do alfabeto seja constante.

Aqui está um trecho do artigo da Wikipedia sobre o maior problema de substring comum .

As substrings comuns mais longas de um conjunto de strings podem ser encontradas através da construção de uma árvore de sufixos generalizada para as strings e, em seguida, localizando os nós internos mais profundos que possuem nós de folhas de todas as strings na subárvore abaixo dele.

Construir uma árvore de sufixos generalizada para duas seqüências de caracteres requerO(m+n)tempo usando o famoso algoritmo de Ukkonen . Encontrar os nós internos mais profundos que vêm das duas strings levaO(m+n)Tempo. Portanto, podemos encontrar a substring comum mais longa emO(m+n) Tempo.

Para uma implementação funcional, consulte o Suffix Tree Application 5 - Substring comum mais longo em GeeksforGeeks

(Melhorado!) Tempo linear

De fato, a substring comum mais longa de duas seqüências dadas pode ser encontrada em O(m+n) hora, independentemente do tamanho do alfabeto.

Aqui está o resumo de Computando as subseqüências comuns mais longas por meio de matrizes de sufixo de Babenko, Maxim e Starikovskaya, Tatiana. (2008).

Dado um conjunto de N cordas UMA={α1 1,,αN} de comprimento total n sobre o alfabeto Σ pode-se pedir para encontrar, para cada 2kN, a substring mais longa β que aparece em pelo menos K cordas em UMA. Sabe-se que esse problema pode ser resolvido emO(n)tempo com a ajuda de árvores sufixos. No entanto, o algoritmo resultante é bastante complicado (em particular, envolve responder a certas consultas de ancestral menos comuns emO(1 1)Tempo). Além disso, seu tempo de execução e consumo de memória podem depender de|Σ|.

Este artigo apresenta uma abordagem alternativa notavelmente simples para o problema acima, que se baseia na noção de matrizes de sufixos. Uma vez que a matriz de sufixos de algum auxiliarO(n)de comprimento total é calculada, é necessário um simples O(n)pós-processamento para encontrar a substring mais longa solicitada. Como vários algoritmos de tempo linear simples e eficientes para a construção de matrizes de sufixos foram recentemente desenvolvidos (com constante não dependendo da|Σ|), nossa abordagem parece bastante prática.

Aqui está a idéia geral do algoritmo no artigo acima. Let stringα concatenação de todos αEucom sentinelas de separação. Construa a matriz de sufixos paraαbem como sua matriz de prefixo comum mais longa . Aplique uma técnica de janela deslizante a essas matrizes para obter as substrings comuns mais longas.


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.