Sia D il dizionario. Risolve m e n. Possiamo formulare il problema di trovare un rettangolo m × come constraint satisfaction problem (CSP).
x i, 1 & hellip; x i, n ∈ D & forall; i ∈ {1, & hellip ;, m}
x 1, j & hellip; x m, j ∈ D & forall; j ∈ {1, & hellip ;, n}
x i, j ∈ {A, & hellip ;, Z} & forall; i ∈ {1, & hellip ;, m}, e forall; j ∈ {1, & hellip ;, n}
Un approccio comune per risolvere i CSP è quello di combinare il backtracking con la propagazione dei vincoli. In parole povere, backtracking significa che selezioniamo una variabile, indoviniamo il suo valore e risolviamo ricorsivamente il sottoproblema con una variabile in meno e la propagazione dei vincoli significa provare a ridurre il numero di possibilità per ogni variabile (possibilmente a zero, il che significa che non c'è soluzione).
Come esempio, si potrebbe iniziare una griglia 3 × 3 scegliendo x 1,1 = Q
.
Q??
???
???
con un dizionario inglese, l'unica possibilità per x 1,2 e x 2,1 è U
(in prima Scrabble “ parole ”).
L'arte di risolvere i CSP è il bilanciamento tra il backtracking e la propagazione dei vincoli. Se non propagiamo affatto i vincoli, useremo solo la forza bruta. Se propagiamo perfettamente i vincoli, non è necessario tornare indietro, ma un algoritmo di propagazione che risolva un problema NP-hard di per sé è probabilmente piuttosto costoso da eseguire.
In questo problema, lavorare con un dizionario di grandi dimensioni su ciascun nodo di backtracking diventerà costoso a meno che non si abbia un buon supporto della struttura dati. Delineerò un approccio che utilizza uno trie o un DAWG rapidamente per calcolare il set di lettere tramite il quale un prefisso si estende a una parola completa.
A ciascun nodo di backtracking, l'insieme di variabili che abbiamo assegnato è un tableau Young. In altre parole, nessuna variabile viene assegnata fino a quando non sono state assegnate le variabili sopra di esso e a sinistra. Nello schema seguente, .
indica una variabile assegnata e *
e ?
indicano le variabili non assegnate.
.....*
...*??
...*??
..*???
*?????
Le variabili contrassegnate *
sono candidati per la prossima ad essere assegnato un valore. Il vantaggio di avere più scelte piuttosto di scegliere una variabile fissa ogni volta è che alcuni ordini variabili possono essere molto migliori di altri.
Per ogni *
, effettuare due ricerche nel trie/DAWG, uno per l'orizzontale e uno per la verticale, e calcolare l'intersezione delle serie di lettere che possono venire dopo. Una strategia classica è scegliere la variabile con il minor numero di possibilità nella speranza di raggiungere più rapidamente una contraddizione. Mi piace questa strategia perché si libera naturalmente quando c'è una variabile con zero possibilità e si propaga naturalmente quando c'è una variabile con una. Memorizzando i risultati, possiamo valutare molto rapidamente ciascun nodo.
Questo suona come farebbe per un grande gioco di barzellette di Scrabble. –
Hai codificato questo problema come NP-hard; è un problema noto come NP-difficile, o è solo una tua speculazione? – templatetypedef
@DavidBrigada Sì, lo so! Stavo pensando di usarlo per una cosa del genere :) – Adrian