Sabemos que a mais longa substring comum de duas strings pode ser encontrada em complexidade do tempo. Uma solução pode ser encontrada apenas em tempo linear?
fonte
Sabemos que a mais longa substring comum de duas strings pode ser encontrada em complexidade do tempo. Uma solução pode ser encontrada apenas em tempo linear?
Deixei e ser o comprimento de duas cordas dadas,
Sim, a substring comum mais longa de duas seqüências especificadas pode ser encontrada em 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 requertempo usando o famoso algoritmo de Ukkonen . Encontrar os nós internos mais profundos que vêm das duas strings levaTempo. Portanto, podemos encontrar a substring comum mais longa em Tempo.
Para uma implementação funcional, consulte o Suffix Tree Application 5 - Substring comum mais longo em GeeksforGeeks
De fato, a substring comum mais longa de duas seqüências dadas pode ser encontrada em 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 cordas de comprimento total sobre o alfabeto pode-se pedir para encontrar, para cada , a substring mais longa que aparece em pelo menos cordas em . Sabe-se que esse problema pode ser resolvido emtempo com a ajuda de árvores sufixos. No entanto, o algoritmo resultante é bastante complicado (em particular, envolve responder a certas consultas de ancestral menos comuns emTempo). 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 auxiliarde comprimento total é calculada, é necessário um simples 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 com sentinelas de separação. Construa a matriz de sufixos parabem 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.
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 .)