Complessità di omogeneizzazione di una stringa


10

Motivazione : Durante lo sviluppo di strumenti per il versioning dei dati, abbiamo finito per esaminare gli algoritmi per "diff" due gruppi di numeri interi, presentando una sequenza di trasformazioni che portano un gruppo di numeri interi all'altro. Siamo riusciti a ridurre questo problema al seguente problema molto naturale che sembra avere connessioni per modificare la distanza, il raggruppamento tramite scambio e la partizione di stringa minima comune .

Problema : ci viene fornita una stringa, ovvero una sequenza di lettere, e il nostro obiettivo è omogeneizzare al minimo costo. Cioè, vogliamo una sequenza riorganizzata in modo tale che tutte le lettere simili siano una accanto all'altra.

L'unica operazione consentita è quella di raccogliere una sottosequenza di lettere simili e spostarla ovunque, e ciò mi costa 1 unità.

Qualsiasi aiuto che caratterizzi la complessità di questo problema sarebbe molto apprezzato!

Esempio :

  • aabcdab: input
  • bcd aa ab: dopo aver spostato il primo aa nella posizione subito dopo "d"
  • b bcdaaa: dopo aver spostato il trailing b nella prima posizione

Poiché la stringa risultante è omogenea, abbiamo un costo di 2.

Si noti che non siamo vincolati in alcun modo rispetto all'output: fintanto che è omogeneo, non è necessario garantire alcun ordine specifico.

Risposte:


6

Questo problema è NP-completo, per riduzione dal set minimo di colpire .

In minima colpire insieme, ci viene dato un universo , e un insieme di insiemi S tale che s S , s U . L'obiettivo è trovare H U di dimensioni minime tale che s S , h H tale che h s .USsS,sUHUsS,hHhs

La riduzione è la seguente:

  • La stringa è la seguente: Per ogni elemento , ci saranno due caratteri della stringa, u . Tra questi personaggi sarà un carattere s per ogni s S tale che tu s . Tra le coppie di u ' s, ci saranno caratteri unici che non sono ripetute nella stringa.uUussSusu

  • Per omogeneizzare la stringa, necessario spostare il carattere s | s | - 1 volte, per ogni s . Inoltre, per ogni u , la u ' carattere deve essere spostata una volta, a meno che ogni s ' tra la coppia di u ' è stato spostato altrove.s|s|1suusu

  • Pertanto, per ridurre al minimo il numero di mosse necessarie per omogeneizzare la stringa, vogliamo massimizzare il numero di tale che ogni s ' è stato spostato altrove. L' u ' s dove le s ' s non sono stati spostati altrove deve contenere un insieme s ' per ogni s S , quindi devono per un set colpire. Inoltre, tale insieme colpire può servire come le posizioni di fine del s ' s, spostando ciascuno s alla u che colpisce.ususssSssu

  • Pertanto, il numero di mosse per omogeneizzare questa stringa è uguale a , dove H è il numero minimo di colpi.|s|+|H|H

Poiché il set minimo di colpi è NP-Hard, anche l'omogeneizzazione ottimale di una stringa lo è. Poiché le mosse formano un testimone, è NP-Complete.


Questa è una riduzione elegante - grazie!
Aditya Parameswaran,

2

Osserva il numero di modifiche da una lettera all'altra nella tua stringa, che potresti vedere come una misura per la disomogeneità della stringa. Con ogni (utile) mossa di una sottosequenza si riduce questo numero di uno se la sottosequenza che si sposta è preceduta e seguita da due lettere distinte. Altrimenti riduci di due la disomogeneità.

Quindi, per una stringa con k modifiche è necessario al massimo k - l + 1 mosse in cui l è il numero di lettere diverse nella stringa, perché alla fine rimarranno l - 1 modifiche. Poiché una stringa di lunghezza n può contenere al massimo n-1 lettere, può richiedere al massimo n mosse. Il numero minimo possibile è la metà di questo.

La migliore strategia sembra quindi cercare sottosequenze della forma abbba e allontanare il bbb da lì. Quando non ne è rimasto nessuno, sposta qualunque cosa. Potresti ancora provare a fare quelle operazioni che creano nuove situazioni abbba, ma penso che il guadagno sarà molto piccolo. Poiché la peggior strategia possibile (senza mosse stupide che aumentano la disomogeneità) utilizza al massimo il doppio delle mosse di quella ottimale, il poco che potresti guadagnare sembra non avere alcuna relazione ragionevole con lo sforzo della risposta di isaacg con la caratterizzazione come NP-hard suggerisce. A meno che, ovviamente, non conti davvero solo il numero di operazioni di spostamento e non ti preoccupi del tempo per decidere quali movimenti effettuare.

Il caso peggiore è quindi una stringa in cui ogni lettera è diversa dal suo predecessore (e non si ottengono bonus abbba). Qui hai bisogno di un numero di operazioni lineari nella lunghezza della stringa e quasi uguali a questa lunghezza.

Nel tuo esempio, hai 5 -> 4 -> 3 modifiche e 3 è uguale al numero di lettere (4) meno 1.

Nota a margine: per un alfabeto di dimensioni solo due, ogni mossa che non sposta un prefisso o suffisso della stringa riduce di due la disomogeneità e quindi ogni sequenza di mosse ragionevoli è ottimale.


Affermate che una mossa può ridurre il numero di modifiche al massimo di 2, ma in realtà può ridurre il numero di modifiche fino a 3. Ad esempio, convertendo "aabcabc" in "aaabbcc" spostando la prima sottostringa "bc" in il centro della seconda sottostringa "bc" determina una riduzione del numero di modifiche nella stringa da 5 a 2.
Mikhail Rudoy,

Ciao, @MikhailRudoy. La domanda afferma che l'operazione è "raccogli una sottosequenza di lettere simili", quindi bc non è permesso per quanto ho capito.
Peter Leupold,

Mi mancava completamente quel dettaglio. In questo caso hai ragione.
Mikhail Rudoy,

Peter ha ragione: quelle mosse non sono consentite.
Aditya Parameswaran,

Ri: il resto della risposta - in effetti, queste osservazioni sono: limiti inferiori, ottimalità del caso di dimensione 2 dell'alfabeto ed euristica per cosa fare in qualsiasi momento sono preziosi. Poiché qualsiasi mossa nel caso peggiore avvantaggia solo quella sequenza di lettere e nel migliore dei casi si fonde al massimo due sequenze di lettere come nella tua abbba, un'approssimazione 2 sembra naturale.
Aditya Parameswaran,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.