Plus longue séquence répétée (dispersée) d'une chaîne


26

É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.ACCABBAB

Dans l'exemple, nous pourrions les colorer comme ceci: ACCABBAB

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).CABACCABBAB

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?kk

  • 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?n/2o(n)

(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é.5ΣO(n·Σ1/2)

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.


Sekti, merci. Vous avez raison: mon premier commentaire était erroné; Je l'ai maintenant supprimé. D'autre part, mon commentaire reste est parle de non-contigus sousséquences. Si est fixe, il existe un moyen de résoudre votre problème (avec des sous-séquences non contiguës, obligatoires pour ne pas se chevaucher) en temps O ( n 2 k + 2 ) environ. Chaque sous-problème dp garde la trace des indices de toutes les lettres rouges et de toutes les lettres bleues choisies jusqu'à présent. Ce n'est probablement pas intéressant, car cela ne nous dit pas ce qui se passe lorsque k fait partie de l'entrée. kO(n2k+2)k
DW

@DW Pourquoi ne peut-on pas répondre efficacement à la question formelle avec cette modification de la sous-séquence commune la plus longue? Peut-être que je manque quelque chose et que quelqu'un peut clarifier pour moi.
Bryce Kille

@BryceKille, je ne sais pas; c'est possible. Si vous comprenez comment le faire, j'espère que vous écrirez une réponse!
DW

Réponses:


-2

Cela peut être résolu en 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.G(i,j)SS[i]=S[j]uvuv

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)cm=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)uv(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 .GabbcacabcO(m4)nn+1

4. Répétez l'étape 3 jusqu'à ce que plus aucun chemin ne soit trouvé.


Hmm. Trop rapide. À l'étape 3, le nombre de sous-séquences à considérer augmente de plus en plus. Ce n'est donc pas polynomial.
noplogist

1
Bienvenue dans CS.SE et merci d'avoir essayé de résoudre ce problème! J'ai bien peur de ne pas comprendre votre algorithme. Qu'est-ce que l'étape 3? Tout ce que je vois dans "3." sont quelques déclarations / observations déclaratives, mais je ne vois pas de spécification procédurale de ce que l'algorithme est censé faire. De plus, je ne vois pas ce que cela signifie de répéter l'étape 3, ni la justification de votre affirmation selon laquelleO(nnm2)le temps suffit. Votre commentaire suivant donne l'impression que vous ne croyez plus que votre réponse est correcte. Dans l'affirmative, il pourrait être préférable de supprimer la réponse, pour éviter toute confusion.
DW

Vous pouvez toujours annuler la suppression ou publier une nouvelle réponse si vous trouvez la réponse plus tard.
DW

DW, merci. L'entrée à l'étape 3 est toutes les sous-séquences répétées de longueur n, et la sortie est toutes les sous-séquences répétées de longueur n + 1. Je crois que l'algorithme est correct mais qu'il ne s'agit pas d'un algorithme polynomial temporel. J'ai maintenant marqué les affirmations que je considère incorrectes.
noplogist

Merci. Je comprends. Malheureusement, avec ces révisions, je crains que cette réponse ne réponde pas à la question qui a été posée. La question était: est-ce NP-difficile? Existe-t-il un algorithme efficace? Montrer qu'il existe un algorithme à temps exponentiel n'aide pas à répondre à l'une ou l'autre de ces questions. En effet, il est déjà trivial de voir qu'il existe un algorithme à temps exponentiel pour le problème, sans invoquer de techniques fantaisistes. J'apprécie votre tentative.
DW
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.