Con un dizionario, BFS è ottimale, ma il tempo di esecuzione necessario è proporzionale alla sua dimensione (V + E). Con n lettere, il dizionario potrebbe avere ~ a^n voci, dove a è la dimensione dell'alfabeto. Se il dizionario contiene tutte le parole tranne quella che dovrebbe essere alla fine della catena, allora attraverserai tutte le parole possibili ma non troverai nulla. Questo è attraversamento grafico, ma la dimensione potrebbe essere esponenzialmente grande.
Ci si potrebbe chiedere se è possibile farlo più velocemente - per esplorare la struttura "in modo intelligente" e farlo in tempo polinomiale. La risposta è, penso, no.
Il problema:
Ti danno un modo veloce (lineare) per controllare se una parola è nel dizionario, due parole u, v e sono per verificare se c'è una sequenza di u -> un -> un -> ... -> un n -.> v
è NP-hard.
Dimostrazione: Prendete un po 'esempio 3SAT, come
(p o q o no r) e (p o no q o r)
Inizierete con 0 000 00 e sono per controllare se è possibile andare a 2 222 22.
Il primo carattere sarà "siamo finiti", tre bit successivi controlleranno p, q, re due clausole di controllo successivo.
parole ammessi sono:
- Tutto ciò che inizia con 0 e contiene solo 0 e 1 di
- Tutto ciò che inizia con 2 ed è legale. Ciò significa che consiste di 0 e 1 (eccetto che il primo carattere è 2, tutti i bit di clausole sono giustamente impostati in base ai bit delle variabili e sono impostati su 1 (quindi questo dimostra che la formula è soddisfacente.)
- Tutto ciò che inizia con almeno due 2 di e quindi è composto da (espressione regolare 0 e 1.: 222 * (0 + 1) *, come 22.221.101 ma non 2212001
Per produrre 2 222 22 da 0 000 00, quello che dovete fare in questo modo:..
(1) flip bit appropriati - ad esempio 0 100 111 in quattro fasi Ciò richiede di trovare una soluzione 3SAT
(2) Cambia il primo bit in 2: 2 100 111. Qui verrai verificato che si tratta di una soluzione 3SAT.
(3) modifica 2 100 111 -> 2 200 111 -> 2 220 111 -> 2 222 111 -> 2 222 211 -> 2 222 221 -> 2 222 222.
Tali norme impongono che non puoi imbrogliare (controllare). Passare a 2 222 22 è possibile solo se la formula è soddisfacente e controllare che sia NP-difficile. Sento che potrebbe essere ancora più difficile (probabilmente con #P o FNP), ma credo che la durezza NP sia sufficiente per quello scopo.
Modifica: Potresti essere interessato a disjoint set data structure. Questo richiederà il tuo dizionario e le parole di gruppo che possono essere raggiunte l'una dall'altra. Puoi anche memorizzare un percorso da ogni vertice a root o qualche altro vertice. Questo ti darà un percorso, non necessariamente il più breve.
Nel tuo esempio, perché scommettere lì? Hai cambiato la stessa lettera due volte di seguito, dovrebbe essere: cat -> bat -> bot -> bog -> dog – CaffGeek
duplicato http://stackoverflow.com/questions/11811918/how-to-compute-shortest- distanza tra due parole/11813399 # 11813399 –
Dacman, ti dispiacerebbe condividere la tua performance migliorata utilizzando l'euristica rispetto a BFS? –