Énoncé informel du problème:
Étant donné une chaîne, par exemple , nous voulons colorer certaines lettres rouges et certaines lettres bleues (et certaines pas du tout), de sorte que la lecture des lettres rouges de gauche à droite donne le même résultat que la lecture seules les lettres bleues.
Dans l'exemple, nous pourrions les colorer comme ceci:
Par conséquent, nous disons est une sous répétée de A C C A B B A B . Il s'agit également d'une sous-séquence répétée la plus longue (qui est facile à vérifier).
Peut-on calculer efficacement les sous-séquences répétées les plus longues?
Question formelle:
Est-il NP-difficile de décider pour une chaîne et certains , si une sous-séquence répétée de longueur k existe dans la chaîne?
- Si oui: quel problème peut être réduit à ce problème?
- Sinon: Qu'est-ce qu'un algorithme efficace? (évidemment, cet algorithme peut ensuite être utilisé pour calculer une sous-séquence répétée la plus longue)
Question bonus:
Leur sera-t-il toujours une sous-séquence répétée de longueur si la taille de l'alphabet est limitée par une constante?
(Ceci est connu pour les alphabets binaires.)
Edit 2: La réponse négative à la question bonus est déjà connue pour les alphabets de taille au moins . En fait pour les alphabets de taille Σ , il y a des chaînes avec les plus longues séquences répétées d'une longueur de seulement O ( n · Σ - 1 / 2 ) . Des chaînes aléatoires suffisent pour le montrer. Le résultat existait déjà, mais je l'ai ignoré.
Modifier: Remarque:
Certaines personnes veulent dire "sous-chaîne" quand elles disent "sous-séquence". Je ne. Ce n'est pas le problème de trouver deux fois une sous-chaîne.
Réponses:
Cela peut être résolu enG (i,j) S S[i]=S[j] u v u v
Temps polynomialen construisant un graphe où chaque nœud représente un point ( i , j ) dans une sous-séquence répétée de S telle que S [ i ] = S [ j ] . Le bord entre les nœuds u et v signifie que u peut être poursuivi par v pour former une sous-séquence répétée de longueur 2.1. Trouvez les nœuds. Cela peut être fait en temps en construisant une liste triée d'indices pour chaque caractère c , puis en énumérant les paires uniques. Il n'y a pas plus de m = n 2 nœuds.O(n2) c m=n2
2. Trouvez les bords. Il faut pour vérifier si le nœud u peut être poursuivi par le nœud v , donc en considérant toutes les paires ( u , v ), cette étape prend O ( m 2 ) .O(1) u v (u,v) O(m2)
3. Notez que le chemin le plus long dans peut ne pas être une sous-séquence répétée valide. Considérons les chemins a b et b c . S'il existe une arête a c, alors a b c est une sous-séquence répétée valide de longueur 3. Par conséquent, il faut O ( m 4 ) pour trouver toutes les sous-séquences répétées de longueur 3. Dans le cas général, il faut un temps linéaire pour vérifier si deux des chemins valides de longueur n peuvent être combinés en un chemin valide de longueur n + 1 .G ab bc ac abc O(m4) n n+1
4. Répétez l'étape 3 jusqu'à ce que plus aucun chemin ne soit trouvé.
la source