Szukam "jak to znaleźć", ponieważ nie mam pojęcia, jak podejść do znalezienia algorytmu złożoności mojego programu.Złożoność algorytmu (Big-O) sudoku solver
Napisałem solver sudoku przy użyciu języka Java, bez wydajności w umyśle (chciałem spróbować, aby to działało rekurencyjnie, co udało mi się!)
Niektóre tła:
moja strategia zatrudnia backtracking do określenia , dla danej sudoku, czy puzzle mają tylko jedno unikalne rozwiązanie, czy nie. Więc zasadniczo czytam w danej łamigłówce i rozwiązuję ją. Kiedy znalazłem jedno rozwiązanie, niekoniecznie muszę to zrobić, muszę kontynuować poszukiwania dalszych rozwiązań. Na koniec następuje jedno z trzech możliwych rezultatów: układanka nie jest w ogóle możliwa do rozwiązania, zagadka ma unikalne rozwiązanie lub układanka ma wiele rozwiązań.
Mój program odczytuje współrzędne puzzli z pliku, który ma jedną linię dla każdej cyfry, składającą się z wiersza, kolumny i cyfry. Przez własnej konwencji, górny lewy kwadrat 7 jest napisane jak 007.
Realizacja:
załadować wartości z pliku i przechowywać je w tablicy 2-D idę w dół tablica do znalezienia Blank (wartość niewypełniona) i ustaw ją na 1. I sprawdź, czy nie ma konfliktów (czy wprowadzona wartość jest poprawna czy nie). Jeśli tak, przechodzę do następnej wartości. Jeśli nie, zwiększam wartość o 1, dopóki nie znajdę cyfry, która działa, lub jeśli żadna z nich nie działa (od 1 do 9), cofam się o 1 krok do ostatniej wartości, którą skorygowałem i zwiększam ją (używając rekursja). Zrobiłem rozwiązanie, gdy wszystkie 81 elementów zostało wypełnionych, bez konfliktów. Jeśli zostaną znalezione jakieś rozwiązania, wydrukuję je na terminalu. W przeciwnym razie, jeśli spróbuję "cofnąć się o jeden krok" od elementu PIERWSZY, który początkowo zmodyfikowałem, oznacza to, że nie było żadnych rozwiązań.
W jaki sposób złożoność algorytmu mojego programu? Pomyślałem, że może to być liniowa [O (n)], ale mam dostępu do tablicy wiele razy, więc nie jestem pewien :(
Każda pomoc jest mile widziana
Jeśli używasz wycofywania, twoja złożoność jest prawdopodobnie wykładnicza. To znaczy. za każdy wykonany ruch powracasz do mniej więcej każdego innego możliwego ruchu. – millimoose
Czy możesz opublikować swój kod? A może tylko odpowiednie sekcje? –