Estou procurando um algoritmo eficiente para encontrar o padrão repetido mais longo em uma string.
Por exemplo, considere a seguinte sequência de números:
5431428571428571428571428571427623874534
.
Como você pode ver, 142857142857
é o padrão mais longo repetido algumas vezes (pelo menos duas vezes) nessa sequência.
A sequência repetida não deve conter mais nenhuma ideia do que força bruta?
142857
não é o mais longo, porque142857142857
é mais longo. Eu acho que você deve editar a pergunta para esclarecer o que você quer dizer com "padrão repetido".Respostas:
O problema é surpreendentemente não trivial. Primeiro, dois algoritmos de força bruta. Um quadrado ("padrão repetido") é dado por seu comprimento e posição , e leva tempo para verificar. Se passar por cima de tudo e p , obtemos um O ( n 3 ) algoritmo. Podemos melhorar isso primeiro dando um loop sobre ℓ e depois varrendo a string com dois ponteiros em execução a uma distância deℓ p O(ℓ) ℓ p O(n3) ℓ ℓ . Dessa forma, é possível verificar seexisteum quadrado de comprimento2ℓ em tempo linear, resultando em um tempo total de execução deO(n2) .
Kolpakov e Kucherov desenvolveram um algoritmo para encontrar todas as repetições máximas em uma palavra no tempoO(n) [1], e seu algoritmo pode ser usado para encontrar todos os quadrados máximos no tempo O(n) . Uma repetição é um subpalavra da forma wkx , onde k ≥ 2 e x é um prefixo adequado de W . O maior quadrado contido nessa repetição é ( w⌊ k / 2 ⌋)2 . Usando esta fórmula, dadas todas as repetições máximas em uma palavra (das quais existem apenas O ( n ) muitas)), pode-se encontrar o quadrado maior.
[1] Kolpakov, R. & Kucherov, G. (1999). Encontrando repetições máximas em uma palavra em tempo linear . In Foundations of Computer Science, 1999. 40º Simpósio Anual sobre (pp. 596-604). IEEE.
fonte