Die zeitliche Komplexität eines Backtracking -Algorithmus ist im Allgemeinen
exponentiell , obwohl es je nach Problem und seinen Einschränkungen variieren kann. Es gibt keine Single "Die" Zeitkomplexität für Backtracking, da es stark davon abhängt:
* Die Anzahl der Auswahlmöglichkeiten in jedem Schritt: Wenn Sie in jedem Schritt *b *Auswahl haben und die Tiefe des Suchbaum ).
* Die spezifischen Einschränkungen und Schnitttechniken des Problems: Backtracking beinhaltet häufig das Beschneiden des Suchraums. Wenn Sie Zweige effektiv beschneiden können, die nicht zu einer Lösung führen, können Sie den Suchraum erheblich reduzieren und die Leistung verbessern. Die Effizienz der Schnittstrategie wirkt sich stark auf die endgültige Zeitkomplexität aus.
* die Art des Problems: Einige Probleme sind von Natur aus für Backtracking als andere zugänglicher.
Hier ist eine Aufschlüsselung, warum es im Allgemeinen exponentiell ist und einige Beispiele:
* exponentielle Natur: Backtracking untersucht alle möglichen Kombinationen oder Permutationen, bis eine Lösung gefunden wird. Im schlimmsten Fall muss es möglicherweise einen großen Teil des Suchraums untersuchen, was zu einem exponentiellen Wachstum der Anzahl der besuchten Knoten führt.
* Beispiele und ihre Komplexität:
* N-Queens Problem: Finden Sie alle möglichen Platzierungen von N Queens auf einem NXN -Schachbrett, so dass sich keine zwei Königinnen drohen. Die zeitliche Komplexität beträgt ungefähr O (n!) Im schlimmsten Fall. Beschneidungstechniken können die Leistung erheblich verbessern.
* Reiseverkäufer Problem (TSP): Finden Sie die kürzstige Route, die jede Stadt genau einmal besucht und in die Startstadt zurückkehrt. Ein naiver Backtracking -Ansatz hätte eine zeitliche Komplexität von O (n!), Wobei 'n' die Anzahl der Städte ist. Zweig und gebunden werden als Schnitt für eine schnellere Ausführung verwendet.
* SUBSUMPROBLEM: Bestimmen Sie, ob es eine Teilmenge einer bestimmten Reihe von Zahlen gibt, deren Summe einem Zielwert entspricht. Die Zeitkomplexität kann o (2
n
sein ), wobei 'n' die Anzahl der Elemente im Set ist, da Sie möglicherweise alle möglichen Teilmengen berücksichtigen müssen.
* Sudoku Solver: Im schlimmsten Fall könnte ein Backtracking -Sudoku -Solver eine große Anzahl von Möglichkeiten für jede leere Zelle versuchen. Obwohl theoretisch exponentiell, machen gute Heuristiken und Einschränkungen die reale Sudoku sehr schnell.
* Graph Färbung: Zuweisen von Farben zu Scheitelpunkten eines Diagramms, so dass keine zwei benachbarten Scheitelpunkte die gleiche Farbe haben. Der schlimmste Fall ist exponentiell, aber die Effizienz hängt davon ab, wie Sie die Knoten bestellen.
* Faktoren, die die Zeitkomplexität beeinflussen:
* Tiefe der Rekursion: Je tiefer der Suchbaum ist, desto mehr Berechnungen sind erforderlich.
* Verzweigungsfaktor: Die Anzahl der Auswahlmöglichkeiten an jedem Knoten des Suchbaums. Ein größerer Verzweigungsfaktor führt zu einem schnelleren exponentiellen Wachstum.
* Beschneidung: Effektives Beschneiden reduziert den Suchraum und verbessert die Leistung. Das Beschneiden ist der wichtigste Faktor, den Sie berücksichtigen sollten.
Zusammenfassend:
Es ist zwar schwierig, eine genaue Zeit für die Backtracking im Allgemeinen zu verleihen, aber es ist mit Sicherheit zu sagen, dass es normalerweise exponentiell ist (O (B
d
) oder o (2
n
) oder o (n!)) Im schlimmsten Fall. Die tatsächliche Zeitkomplexität wird stark von der Struktur des Problems, der Effizienz aller verwendeten Schnittstrategien und der Größe des Eingangs beeinflusst. Es ist wichtig, Backtracking -Algorithmen mit effektivem Beschneidung zu entwerfen, um unnötige Wege zu untersuchen. In einigen Fällen kann das Beschneiden so effektiv sein, dass der Algorithmus in der Praxis viel schneller macht, als die exponentielle Komplexität der schlimmsten Fall vermuten lässt. Bei vielen Problemen bleibt jedoch auch beim Beschneiden von Backtracking für große Eingangsgrößen von Natur aus ineffizient.