Algorithmus-Komplexität (Big-O) sudoku solver
Ich bin suchen Sie nach dem "wie finden Sie es" da habe ich keine Idee, wie Sie Ansatz finden, der Algorithmus Komplexität von meinem Programm.
Schrieb ich ein sudoku-solver, die mit java, ohne Effizienz im Hinterkopf (ich wollte versuchen, damit es funktioniert rekursiv, das ich es mit!)
Etwas hintergrund:
meine Strategie beschäftigt backtracking zu ermitteln, für eine VORGEGEBENE Sudoku-Rätsel, ob das puzzle hat nur eine einzigartige Lösung, oder nicht. Also habe ich im Grunde Lesen Sie in einem bestimmten Rätsel, und es zu lösen. Einmal fand ich eine Lösung, ich bin nicht unbedingt fertig, müssen noch weiter erforscht und für weitere Lösungen. Am Ende, eines von drei möglichen Ergebnissen passiert: das puzzle ist nicht lösbar an alle, das Rätsel eine eindeutige Lösung hat, oder das puzzle hat mehrere Lösungen.
Mein Programm liest in dem puzzle-Koordinaten aus einer Datei, eine Zeile für jede Ziffer, die aus der Zeile, der Spalte und der Ziffer. Durch meine eigene convention, die linke Obere Quadrat von 7 ist so geschrieben, als 007.
Umsetzung:
Lade ich die Werte aus der Datei und hinterlegt Sie in einem 2-D array
Ich gehe durch das array, bis ich eine Leere (unausgefüllte Wert), und setzen Sie ihn auf 1. Und überprüfen Sie, ob irgendwelche Konflikte (ob der Wert, den ich eingegeben, gültig ist oder nicht).
Wenn ja, Verschiebe ich auf den nächsten Wert.
Wenn Nein, ich erhöhe den Wert um 1, bis ich eine Stelle, die funktioniert, oder wenn keiner von Ihnen arbeiten (1 bis 9), gehe ich wieder 1 Schritt, um den letzten Wert, den ich eingestellt und ich habe Inkrement, dass man (mit Rekursion).
Ich bin fertig lösen, wenn alle 81 Elemente wurden gefüllt, ohne Konflikte.
Wenn keine Lösungen gefunden werden, Drucke ich Sie aus dem terminal.
Ansonsten, wenn ich versuche, "einen Schritt zurückgehen" auf das ERSTE element, dass ich zunächst geändert werden, bedeutet, dass es keine Lösungen.
Wie kann ich Programme Algorithmus Komplexität? Ich dachte, es könnte sein, linear [ O(n) ], aber ich bin den Zugriff auf das array mehrere Male, also bin ich nicht sicher 🙁
Jede Hilfe ist willkommen
Könnte Sie nach Ihrem code? Oder nur die relevanten Abschnitte?
InformationsquelleAutor Eric Muller | 2013-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
O(n ^ m), wo n ist die Anzahl der Möglichkeiten für jedes Quadrat (d.h., 9 in klassischen Sudoku) und m wird die Anzahl der Räume, die leer sind.
Diese können gesehen werden durch die Arbeit nach hinten aus nur einem einzigen Rohling. Wenn nur eine leer ist, dann haben Sie n Möglichkeiten, die Sie arbeiten müssen, im schlimmsten Fall. Wenn es zwei Leerzeichen, dann müssen Sie arbeiten, durch n Möglichkeiten für die erste leer und n Möglichkeiten für die zweite leere für jede der Möglichkeiten für die erste leer. Wenn es drei Leerzeichen, dann müssen Sie arbeiten, durch n Möglichkeiten für die erste leer. Jede dieser Möglichkeiten ergibt ein puzzle mit zwei Lücken, die hat n^2 Möglichkeiten.
Dieser Algorithmus führt eine Tiefensuche durch den möglichen Lösungen. Jede Stufe der Kurve stellt die Auswahl für einen einzigen Quadratmeter. Die Tiefe des Graphen ist die Anzahl der Felder, die ausgefüllt werden müssen. Mit einem branching-Faktor von n und einer Tiefe von m, eine Lösung zu finden, in der der graph hat eine worst-case-performance von O(n ^ m).
Würden Sie nicht nur arbeiten müssen, um durch n-1 Möglichkeiten für die zweite leere, n-2 Möglichkeiten für die Dritte leer ist, etc, da in Sudoku können Sie nur eine Zahl einmal?
Wenn es genau 1 leer ist, dann gibt es nur 1 Möglichkeit-die fehlende Zahl. Naja... ich meine, ich denke, Sie haben zu prüfen, die Zeilen und Spalten zu regieren, die anderen (n-1=8) zahlen aus, die in O(n) Zeit, aber diese führen nicht zu einer Rekursion.
InformationsquelleAutor Matthew T. Staebler
In vielen Sudokus, wird es ein paar zahlen, die platziert werden können direkt mit ein bisschen Gedanken. Indem Sie eine Zahl in die erste leere Zelle, geben Sie eine Menge von Möglichkeiten zur Verringerung der Möglichkeiten. Wenn die ersten zehn leeren Zellen haben viele Möglichkeiten, Sie bekommen ein exponentielles Wachstum. Ich würde die Fragen stellen:
Wo in der ersten Zeile können Sie die Nummer 1 gehen?
Wo in der ersten Zeile können Sie die Nummer 2 gehen?
...
Wo in der letzten Zeile können Sie die Nummer 9 gehen?
Gleiche, aber mit neun Spalten?
Gleiche, aber mit den neun Boxen?
Welche Zahl in der ersten Zelle?
Welche Zahl kann in die 81st Zelle?
Dass die 324 Fragen. Wenn jede Frage ist genau eine Antwort, die Sie wählen, zu beantworten. Wenn irgendeine Frage hat keine Antwort, Sie backtrack. Wenn jede Frage hat zwei oder mehr Antworten, Sie wählen eine Frage mit der minimalen Anzahl von Antworten.
Du kann bekommen exponentielles Wachstum, aber nur für Probleme, die wirklich hart sind.
InformationsquelleAutor gnasher729