Ich bin auf der Suche nach einem effizienten Algorithmus zum Verwürfeln eines Satzes von Buchstaben in eine Permutation, die die maximale Anzahl von Wörtern enthält.Effizienter Wortscramble-Algorithmus
Zum Beispiel sagen, dass ich die Liste der Buchstaben gegeben habe: {e, e, h, r, s, t}. Ich muss sie so bestellen, dass sie die maximale Anzahl von Wörtern enthält. Wenn ich diese Buchstaben in "Theres" bestelle, enthalten sie die Wörter "das", "dort", "sie", "hier" und "davor". So könnte dieses Beispiel eine Punktzahl von 5 haben, da es 5 Wörter enthält. Ich möchte die Buchstaben so bestellen, dass sie die höchste Punktzahl haben (die meisten Wörter enthalten).
Ein naiver Algorithmus wäre es, jede Permutation zu bewerten. Ich glaube, das ist O (n!), Also würden 720 verschiedene Permutationen nur für die obigen 6 Buchstaben versucht werden (einschließlich einiger Duplikate, da das Beispiel e zweimal hat). Für weitere Briefe wird die naive Lösung natürlich schnell unmöglich.
Der Algorithmus muss nicht wirklich die beste Lösung erzeugen, aber er sollte in einer angemessenen Zeit eine gute Lösung finden. Für meine Anwendung funktioniert das einfache Raten (Monte Carlo) bei einigen Millionen Permutationen ziemlich schlecht, und das ist derzeit der Punkt, den es zu schlagen gilt.
Ich verwende derzeit den Aho-Corasick Algorithmus, um Permutationen zu bewerten. Es sucht nach jedem Wort im Wörterbuch in nur einem Durchlauf durch den Text, also glaube ich, dass es sehr effizient ist. Das bedeutet auch, dass ich alle Wörter in einem trie gespeichert habe, aber wenn ein anderer Algorithmus einen anderen Speicher benötigt, ist das auch in Ordnung. Ich mache mir keine Sorgen über das Einrichten des Wörterbuchs, nur die Laufzeit der eigentlichen Bestellung und Suche. Selbst ein unscharfes Wörterbuch könnte bei Bedarf verwendet werden, wie beispielsweise ein Bloom Filter.
Für meine Anwendung ist die Liste der Buchstaben etwa 100, und das Wörterbuch enthält über 100.000 Einträge. Das Wörterbuch ändert sich nie, aber mehrere verschiedene Listen von Buchstaben müssen bestellt werden.
Ich überlege, eine path finding algorithm zu versuchen. Ich glaube, ich könnte mit einem zufälligen Buchstaben von der Liste als Ausgangspunkt beginnen. Dann würde jeder verbleibende Buchstabe verwendet, um einen "Pfad" zu erstellen. Ich denke, das würde gut mit dem Aho-Corasick-Scoring-Algorithmus funktionieren, da die Scores einen Buchstaben nach dem anderen ergeben könnten. Ich habe den Pfad noch nicht ausprobiert; vielleicht ist es nicht einmal eine gute Idee? Ich weiß nicht, welcher Pfadfindungsalgorithmus der beste sein könnte.
Ein anderer Algorithmus, an den ich dachte, beginnt auch mit einem zufälligen Buchstaben. Dann würde der Wörterbuchtried nach "reichen" Zweigen durchsucht, die die verbleibenden Buchstaben enthalten. Wörterbuchzweige, die nicht verfügbare Buchstaben enthalten, würden abgeschnitten werden. Ich bin ein wenig neblig auf die Details, wie das genau funktionieren würde, aber es könnte vollständig Scoring-Permutationen beseitigen.
Große Frage, gut gefragt! – erickson
Ere ist ein Wort. Das macht die Punktzahl von Ihrem ursprünglichen Beispiel 5. –
Klingt wie es ist NP-etwas, lol. –