Maior substring comum em tempo linear

7

Sabemos que a mais longa substring comum de duas strings pode ser encontrada em O(N2)complexidade do tempo. Uma solução pode ser encontrada apenas em tempo linear?

Manoharsinh Rana
fonte

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.

John L.
fonte
4

Sim. Existe até um artigo da Wikipedia sobre isso! https://en.wikipedia.org/wiki/Longest_common_substring_problem

Em particular, como a Wikipedia explica, existe um algoritmo de tempo linear, usando árvores de sufixos (ou matrizes de sufixos).

A pesquisa na "substring comum mais longa" mostra esse artigo da Wikipedia como o primeiro hit (para mim). No futuro, pesquise o problema antes de perguntar aqui. (Consulte, por exemplo, https://meta.stackoverflow.com/q/261592/781723 .)

DW
fonte