Declaração informal do problema:
Dada uma sequência, por exemplo, , queremos colorir algumas letras em vermelho e outras em azul (e algumas nem sequer), de modo que a leitura apenas das letras vermelhas da esquerda para a direita produz o mesmo resultado que a leitura apenas as letras azuis.
No exemplo, poderíamos pintá-los assim:
Portanto, dizemos é uma subsequência de repetição de uma . É também a subsequência repetida mais longa (fácil de verificar).
Podemos calcular as subsequências repetidas mais longas com eficiência?
Pergunta formal:
É NP-difícil decidir por uma string e algum , se existe uma subsequência repetida de comprimento na string?
- Em caso afirmativo: Qual problema pode ser reduzido para esse problema?
- Caso contrário: o que é um algoritmo eficiente? (obviamente, esse algoritmo pode ser usado para calcular a subsequência repetida mais longa)
Pergunta bônus:
Será sempre uma subsequência repetida de comprimento se o tamanho do alfabeto for limitado por uma constante?
(Isso é conhecido por alfabetos binários.)
Edição 2: a resposta negativa à pergunta sobre bônus já é conhecida por alfabetos de tamanho mínimo de . Na verdade para alfabetos de tamanho Σ , existem cadeias mais longas com subsequências repetidas de um comprimento de apenas S ( n · Σ - 1 / 2 ) . Sequências aleatórias são suficientes para mostrar isso. O resultado já existia, mas eu o ignorei.
Editar: Nota:
Algumas pessoas querem dizer "substring" quando dizem "subsequence". Eu não. Este não é o problema de encontrar uma substrings duas vezes.
Respostas:
Isso pode ser resolvido emG (i,j) S S[i]=S[j] u v u v
tempo polinomialconstruindo um gráfico onde cada nó representa um ponto ( i , j ) em alguma subsequência repetida de S, de modo que S [ i ] = S [ j ] . Borda entre os nós u e v significa que u pode ser continuado por v para formar uma subsequência repetida de comprimento 2.1. Encontre os nós. Isso pode ser feito em , criando uma lista classificada de índices para cada caractere c e depois enumerando os pares exclusivos. Não há mais que m = n 2 nós.O(n2) c m=n2
2. Encontre as arestas. Leva tempo para verificar se o nó u pode ser continuado pelo nó v , portanto, considerando todos os pares ( u , v ), essa etapa leva tempo O ( m 2 ) .O(1) u v (u,v) O(m2)
3. Observe que o caminho mais longo em pode não ser uma subsequência repetida válida. Considere os caminhos a b e b c . Se existe uma aresta a c, então a b c é uma subsequência repetida válida de comprimento 3. Portanto, leva O ( m 4 ) tempo para encontrar todas as subsequências repetidas de comprimento 3. No caso geral, leva tempo linear para verificar se duas caminhos válidos de comprimento n podem ser combinados em um caminho válido de comprimento n + 1 .G ab bc ac abc O(m4) n n+1
4. Itere a etapa 3 até que não sejam mais encontrados caminhos.
fonte