Encontre o padrão repetido mais longo em uma string


9

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?


3
Você não definiu o que significa "algumas vezes", mas se "duas vezes" conta como "algumas vezes", então 142857não é o mais longo, porque 142857142857é mais longo. Eu acho que você deve editar a pergunta para esclarecer o que você quer dizer com "padrão repetido".
Tsuyoshi Ito

ponto muito bom. Vou atualizar a pergunta.

8
Você está exigindo que as ocorrências do padrão sejam separadas umas das outras? Porque, se não, 142857142857 ainda não é a repetição mais longa; 142857142857142857142 ocorre duas vezes. De qualquer forma, a resposta usual para perguntas como essa é "árvores de sufixo".

Respostas:


15

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 depO()pO(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 tempo O(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 k2 e x é um prefixo adequado de W . O maior quadrado contido nessa repetição é (Wk/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.

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.