Der Dancing-Links-Algorithmus - Eine Erklärung, die weniger erklärend, sondern mehr auf die Umsetzung?
Ich habe ein Sudoku-Solver, meine aktuelle solver verwendet das backtracking-Algorithmus, aber es dauert noch zu lange.
Ich bin der Hoffnung, um es bis auf weniger als eine Sekunde für die meisten Fälle. Als solche, habe ich beschlossen zu umschreiben, dass es mit dem dancing-links-Algorithmus, Verständnis es ist eines der besseren bruteforce Methoden, die gut funktioniert, vor allem mit einem constraint-problem wie das Sudoku-Rätsel.
Ich habe versucht, das Lesen der Wiki und Knuth ' s Papieraber beide sind ein bisschen schwer zu verstehen und sehr ausführlich.
Lese ich auch Sudopedia s version auf, und es scheint, dass, sobald Sie haben, um den Sudoku-Implementierung, wurde es zu Abstrakt.
Kann mir jemand versuchen zu erklären, die Dancing-Links-Algorithmus nicht in Bezug auf seine Abstammung, sondern seine Umsetzung? (wäre toll, verwenden Sie das Sudoku als Beispiel)
Dank!
InformationsquelleAutor der Frage nubela | 2009-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie interessieren könnten meine Implementierung in javascript.
Erstens müssen Sie verstehen, die Genaue Abdeckung. Eine genaue Abdeckung problem ist ein problem, wo Sie gegeben sind eine Reihe von Entscheidungen, und einen Satz von Einschränkungen und Ihre Herausforderung besteht darin, wählen Sie ein paar der Möglichkeiten, die füllen jede Einschränkung genau einmal.
Betrachten wir zum Beispiel den Fall von jemandem, der Erstellung Ihrer eigenen Eis-Tanz-routine. Sie haben eine Reihe von tricks, die Sie brauchen, um zu zeigen, die Richter, und nicht wollen, ausführen, trick mehr als einmal. Sie haben eine Reihe von Sequenzen, die Gruppen von tricks, die zusammengestellt werden können, und Sie möchten, wählen Sie die ideale Auswahl der Sequenzen, um alle tricks einmal. In diesem Beispiel, die Einschränkungen, die Sie ausführen müssen, jeden trick. Die Entscheidungen, sind die möglichen Sequenzen, die Sie könnte integrieren in Ihre routine.
Einer netten Art und Weise zu vertreten, Probleme dieser Art zu erstellen, die eine Tabelle, wo die Einschränkungen sind Spalten und die Möglichkeiten sind Zeilen, und Sie haben ein großes X in den Zellen, in denen eine bestimmte Auswahl erfüllt das constraint.
Wie es sich herausstellt, das Recht erhalten, Zwänge und Möglichkeiten, sudoku kann beschrieben werden als eine Genaue Abdeckung problem.
Ok, vorausgesetzt, Sie haben, jetzt müssen Sie verstehen, Algorithmus X. Knuth sagte "Algorithmus X ist einfach eine Aussage, die offensichtlich trial-and-error-Ansatz. (In der Tat, ich kann nicht denken von jedem anderen vernünftigen Weg, um die Arbeit zu tun, im Allgemeinen.)". Also hier ist meine Beschreibung des Algorithmus X:
Nun, dass Sie verstehen, dass Sie verstehen können, tanzen links. Dancing Links ist die Art der Umsetzung, dass der Algorithmus effizient. Der entscheidende Punkt der dancing-links, die in einer verknüpften Liste beim löschen eines Knotens (was kann getan werden, effizient durch ändern der Zeiger der Nachbarn), den Knoten, den Sie entfernt haben alle Informationen, die Sie brauchen, um es zurück zu der verlinkten Liste (in dem Fall, es stellt sich heraus, Sie waren falsch wenn Sie Ahnen, dass es war Teil der Lösung). Das plus die Tatsache, dass, wenn Sie alle Ihre verknüpften Listen kreisförmigen dann plötzlich verlieren Sie eine Menge von speziellen Fällen ist so ziemlich alles tanzen-links ist.
InformationsquelleAutor der Antwort kybernetikos
Obwohl diese Frage schon sehr alt ist, ich dachte, ich würde hinzufügen:
Diese Seite macht den Algorithmus sehr leicht zu verstehen: Zendoku writeup. Bis ich darüber Lesen Sie auf diesen link, hatte ich gedacht, das muss ein super-fortschrittlichen Algorithmus, aber wirklich, sobald Sie visualisieren können, es ist einfach eine wirklich geniale aber einfache Lösung.
Auch meine Umsetzung in C# sollte Recht einfach zu Lesen... wäre hilfreich zum aufteilen der verschiedenen Klassen in die verschiedenen Dateien bin ich mir sicher.
Es ist im wesentlichen eine direkte Umsetzung von Knuth im pdf-Format, aber mit ein paar Objekt-orientierte Optimierungen (eigentlich seit ich vor einigen Monaten, ich weiß nicht Recht daran erinnern, wie sehr ich irrte aus der pdf-Datei)
InformationsquelleAutor der Antwort Thymine