Sto cercando un algoritmo efficiente per rimescolare una serie di lettere in una permutazione contenente il numero massimo di parole.Algoritmo di scramble delle parole efficiente
Ad esempio, dire che mi viene fornita la lista di lettere: {e, e, h, r, s, t}. Ho bisogno di ordinarli in modo tale da contenere il numero massimo di parole. Se ordino quelle lettere in "theres", contiene le parole "the", "there", "her", "here" e "ere". Quindi quell'esempio potrebbe avere un punteggio di 5, poiché contiene 5 parole. Voglio ordinare le lettere in modo tale da avere il punteggio più alto (contiene la maggior parte delle parole).
Un algoritmo ingenuo sarebbe quello di provare a segnare ogni permutazione. Credo che questo sia O (n!), Quindi verrebbero tentate 720 diverse permutazioni solo per le 6 lettere sopra (inclusi alcuni duplicati, dato che l'esempio ha due e). Per più lettere, la soluzione ingenua diventa rapidamente impossibile, naturalmente.
L'algoritmo non deve effettivamente produrre la soluzione migliore, ma dovrebbe trovare una buona soluzione in un ragionevole lasso di tempo. Per la mia applicazione, la semplice supposizione (Monte Carlo) a qualche milione di permutazioni funziona in modo piuttosto scadente, quindi è attualmente il punto da battere.
Attualmente sto utilizzando l'algoritmo Aho-Corasick per ottenere le permutazioni. Cerca ogni parola nel dizionario in una sola passata del testo, quindi credo che sia abbastanza efficiente. Ciò significa anche che ho tutte le parole memorizzate in un trie, ma se anche un altro algoritmo richiede una memorizzazione diversa va bene. Non sono preoccupato di impostare il dizionario, solo il tempo di esecuzione degli ordini e delle ricerche effettivi. Potrebbe anche essere usato un dizionario fuzzy, se necessario, come lo Bloom Filter.
Per la mia applicazione, l'elenco di lettere fornite è circa 100 e il dizionario contiene oltre 100.000 voci. Il dizionario non cambia mai, ma è necessario ordinare diversi elenchi di lettere.
Sto considerando di provare un path finding algorithm. Credo che potrei iniziare con una lettera casuale dalla lista come punto di partenza. Quindi ogni lettera rimanente verrebbe utilizzata per creare un "percorso". Penso che questo potrebbe funzionare bene con l'algoritmo di punteggio Aho-Corasick, dal momento che i punteggi potrebbero essere costruiti una lettera alla volta. Tuttavia non ho ancora provato la ricerca di percorsi; forse non è nemmeno una buona idea? Non so quale algoritmo di ricerca del percorso potrebbe essere il migliore.
Un altro algoritmo che ho pensato inizia anche con una lettera casuale. Quindi il dizionario verrà cercato per i rami "ricchi" contenenti le lettere rimanenti. I rami del dizionario contenenti lettere non disponibili sarebbero stati eliminati. Sono un po 'annebbiato sui dettagli di come funzionerebbe esattamente, ma potrebbe eliminare completamente le permutazioni dei punteggi.
Grande domanda, ha chiesto bene! – erickson
Ere è una parola. Ciò rende il punteggio del tuo esempio originale 5. –
Sembra che sia NP-qualcosa, lol. –