Il numero più breve di modifica si sposta tra due parole


11

Sto cercando una struttura di dati e un algoritmo per calcolare il numero minimo di modifiche necessarie per trasformare una parola in un'altra, date le due parole come input, dove le uniche modifiche consentite sono

  • aggiungere una lettera a una delle estremità (ad esempio, AB -> ABC),
  • duplicare e concatenare l'intera parola (ad esempio, ABC -> ABCABC),
  • tagliare una parola in due (il doppio della mossa di duplicazione, ABCABC -> ABC + ABC),
  • eliminare una delle lettere (ad esempio ABC -> AC) e
  • ripetere una delle lettere (ad esempio, ABC -> ABBC).

Ad esempio, una sequenza minima di spostamenti da ABC a BCBC è ABC -> BC (elimina A) -> BCBC (duplicazione).

Non ho un background in informatica. Forse questo è un problema ben noto, ma la mia ricerca su Google non mi ha dato nulla.

Conosci qualche problema correlato e ben definito?

Modifica : Come suggerito nella risposta di Anthony Labarre, ho letto alcuni articoli sul problema della permutazione / arrangiamento del poset che è simile al problema sopra descritto. Qualcuno sa di più su questo problema? Questo è rilevante?


1
Presumibilmente nessuno dall'elenco di en.wikipedia.org/wiki/String_metric si applica, né lo è in sourceforge.net/projects/simmetrics ?
András Salamon,

Non li conosco tutti, ma la maggior parte dell'obiettivo di questi metodi è allineare le stringhe con il solo cambio di una sola lettera consentito e non consentire mosse più complesse.
cz3rk,

1
Una duplicazione si applica all'intera stringa ABC -> ABCABC, quindi la direzione non ha importanza. Ma la direzione della ripetizione può essere solo nell'ordine a sinistra a destra, come una balbuzie.
cz3rk,

2
Perché è importante se le parole di input non condividono le lettere? (Dovrebbe esserci una stringa vuota tra Ae Bnella sequenza di @ reinerpost.)
Jeffε

2
Hai aggiunto l'operazione "taglia una parola in due"; intendi l'operazione quali mappe to w ? www
Argentpepper,

Risposte:


3

Non so se questo esatto problema sia stato studiato, ma Chaudhuri et al. studiato il relativo problema di perdita casuale di duplicazione in tandem : ti viene data una permutazione e vuoi trasformarla nella permutazione dell'identità duplicando (1) un segmento di qualsiasi lunghezza e aggiungendo la copia subito dopo l'originale, quindi (2) eliminando elementi in modo da ottenere una nuova permutazione anziché una stringa. Si noti che l'applicazione (1) quindi (2) rappresenta un'operazione.

Diverse varianti possono essere definite in base al peso assegnato a ciascuna operazione, che nella loro carta dipende dalla larghezza dei segmenti duplicati. Studiano anche un problema simile con l' intera duplicazione del genoma , che è esattamente il tipo di duplicazione consentita. Non ricordo di aver letto del lavoro su questo problema nel contesto delle stringhe, ma spero che questo possa almeno darti un punto di partenza per le tue ricerche.


Grazie, darò un'occhiata al loro lavoro. Vedo la relazione tra i due problemi.
cz3rk,

2

Come è stato sottolineato, questo problema è simile al problema della distanza di modifica più comunemente noto (alla base della distanza di Levenshtein ). Ha anche elementi comuni, ad esempio con la distanza di distorsione temporale dinamica (la duplicazione o "balbuzie" nell'ultimo requisito).

Passi verso la programmazione dinamica

x=x1xny=y1ymd(x,y)

min{d(x,y1ym1)+1▻ Add letter at endd(x,y2ym)+1▻ Add letter at beginningd(x,y1ym/2)+1if y=y1ym/2y1ym/2▻ Doublingd(x1xn/2,y)+1if x=x1xn/2x1xn/2▻ Halvingd(x1xn,y)+1▻ Deletiond(x1xn1,y1ym1)if yn=ym▻ Ignoring last elt.

Qui, l'ultima opzione dice sostanzialmente che convertire FOOX in BARX equivale a convertire FOO in BAR. Ciò significa che è possibile utilizzare l'opzione "Aggiungi lettera alla fine" per ottenere l'effetto balbuzie (duplicazione) e la cancellazione in un determinato momento. Il problema è che permette automaticamente di aggiungere un arbitrario personaggio al centro della stringa così , qualcosa che probabilmente non si vuole. (Questo "ignorare gli ultimi elementi identici" è il modo standard per ottenere la cancellazione e la balbuzie in posizioni arbitrarie. Rende il divieto di inserimenti arbitrari, pur consentendo aggiunte a entrambe le estremità, un po 'complicato, sebbene ...)

Ho incluso questa suddivisione anche se non svolge completamente il lavoro, nel caso in cui qualcun altro possa "salvarlo", in qualche modo, e perché lo utilizzo nella mia soluzione euristica, di seguito.

(Certo, se potessi ottenere una ripartizione come questa che in realtà ha definito la tua distanza, avresti solo bisogno di aggiungere memoization e avresti una soluzione. Tuttavia, poiché non stai solo lavorando con i prefissi, non t pensi di poter usare solo indici per la tua memoizzazione; potresti dover memorizzare le stringhe effettive e modificate per ogni chiamata, il che sarebbe enorme se le tue stringhe fossero di dimensioni sostanziali.)

Passi verso una soluzione euristica

Un altro approccio, che potrebbe essere più facile da capire e che potrebbe usare un po 'meno spazio, è quello di cercare il "percorso di modifica" più breve dalla prima stringa alla seconda, usando l' algoritmo (in sostanza, il migliore- prima diramazione). Lo spazio di ricerca sarebbe definito direttamente dalle tue operazioni di modifica. Ora, per una stringa di grandi dimensioni, lo farestiAA ottenere un grande vicinato, in quanto potresti eliminare qualsiasi personaggio (dandoti un vicino per ogni potenziale eliminazione) o duplicare qualsiasi personaggio (di nuovo, dandoti un numero lineare di vicini), oltre ad aggiungere qualsiasi carattere alle due estremità, che darti un numero di vicini pari al doppio della dimensione dell'alfabeto. (Spero solo che non stai usando Unicode completo ;-) Con un fanout così grande, potresti ottenere una velocità piuttosto sostanziale usando un bidirezionale , o qualche parenteA .

Per far funzionare , avresti bisogno di un limite inferiore per la distanza rimanente al tuo obiettivo. Non sono sicuro che ci sia una scelta ovvia qui, ma quello che potresti fare è implementare una soluzione di programmazione dinamica basata sulla decomposizione ricorsiva che ho dato sopra (di nuovo con possibili problemi di spazio se le tue stringhe sono molto lunghe). Mentre quella decomposizione non calcola esattamente la tua distanza, è garantito che è un limite inferiore (perché è più permissivo), il che significa che funzionerà come euristico in . (Quanto sarà stretto, non lo so, ma sarebbe corretto.) Naturalmente, la memoizzazione della tua funzione associata potrebbe essere condivisa tra tutti i calcoli del limite durante il tuoA A AAAcorrere. (Un compromesso tempo / spazio lì.)

Così…

L'efficienza della mia soluzione proposta sembrerebbe dipendere un po 'da (1) la lunghezza delle stringhe e (2) dalla dimensione del tuo alfabeto. Se nessuno dei due è enorme, potrebbe funzionare. Questo è:

  • Implementa il limite inferiore alla tua distanza usando la mia decomposizione ricorsiva e la programmazione dinamica (ad esempio, usando una funzione ricorsiva memorizzata).
  • Implementa (o bidirezionale ) con le tue operazioni di modifica come "mosse" nello spazio degli stati e il limite inferiore basato sulla programmazione dinamica.A AA

Non posso davvero dare alcuna garanzia su quanto sarebbe efficiente, ma dovrebbe essere corretto e probabilmente sarebbe molto meglio di una soluzione a forza bruta.

Se non altro, spero che questo ti dia alcune idee per ulteriori indagini.


0

Un problema correlato e ben definito sarebbe il problema dell'allineamento della sequenza . È diverso perché non utilizza l'operazione di duplicazione. Le operazioni definite sono: inserimento di carattere, cancellazione di carattere, trasformazione di carattere. L'algoritmo popolare per risolvere questo problema è Needleman-Wunsch .


Conosco questo, ma voglio davvero lavorare con una serie di mosse definite. L'unico modo in cui ho scoperto di farlo è con un algoritmo ricorsivo a forza bruta. Non molto carino e potrebbe diventare intensivo dal punto di vista computazionale se la dimensione delle parole aumentasse.
cz3rk,

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.