Mein Pseudo-Code:
- Erstellen Sie einen Graphen aus Knoten, wobei jeder Knoten ein Wort darstellt.
- Erstellen Sie Verbindungen zwischen allen Knoten (jeder Knoten ist mit jedem anderen Knoten verbunden). Jede Verbindung hat einen "Wert", der die Anzahl der gemeinsamen Zeichen angibt.
- Verbindungen verwerfen, bei denen der "Wert" 0 ist.
- Gehen Sie den Graphen durch, indem Sie die Verbindungen mit den höchsten Werten bevorzugen. Wenn Sie zwei Verbindungen mit demselben Wert haben, versuchen Sie beide rekursiv.
- Speichern Sie die Ausgabe eines Spaziergangs in einer Liste zusammen mit der Summe des Abstands zwischen den Wörtern in diesem bestimmten Ergebnis. Ich bin mir nicht 100%ig sicher, ob ATM die von Ihnen verwendeten Verbindungen einfach summieren kann. Überzeugen Sie sich selbst.
- Wählen Sie aus allen Ausgaben diejenige mit dem höchsten Wert aus.
Dieses Problem ist wahrscheinlich NP-vollständig, was bedeutet, dass die Laufzeit des Algorithmus unerträglich wird, wenn die Wörterbücher wachsen. Im Moment sehe ich nur eine Möglichkeit, es zu optimieren: Schneiden Sie den Graphen in mehrere kleinere Graphen, führen Sie den Code für jeden aus und fügen Sie die Listen dann zusammen. Das Ergebnis wird nicht so perfekt sein, wie wenn man jede Permutation ausprobiert, aber die Laufzeit wird viel besser sein und das Endergebnis könnte "gut genug" sein.
[EDIT] Da dieser Algorithmus nicht alle möglichen Kombinationen ausprobiert, ist es durchaus möglich, das perfekte Ergebnis zu verpassen. Es ist sogar möglich, in einem lokalen Maximum gefangen zu sein. Nehmen wir an, Sie haben ein Paar mit einem Wert von 7, aber wenn Sie dieses Paar wählen, sinken alle anderen Werte auf 1; wenn Sie dieses Paar nicht nehmen, wären die meisten anderen Werte 2, was ein viel besseres Gesamtergebnis ergibt.
Dieser Algorithmus tauscht Perfektion gegen Geschwindigkeit. Wenn das Ausprobieren aller möglichen Kombinationen Jahre dauern würde, selbst mit dem schnellsten Computer der Welt, muss man einen Weg finden, die Laufzeit zu begrenzen.
Wenn die Wörterbücher klein sind, können Sie einfach jede Permutation erstellen und dann das beste Ergebnis auswählen. Wenn sie über eine bestimmte Grenze hinauswachsen, ist man verloren.
Eine andere Lösung besteht darin, beides zu mischen. Verwenden Sie den Gieralgorithmus, um "Inseln" zu finden, die wahrscheinlich ziemlich gut sind, und verwenden Sie dann die "vollständige Suche", um die kleinen Inseln zu sortieren.