Im Bereich der Algorithmen entsprechen sich "schwierig" und "zeitaufwendig". Ein Problem ist schwierig, wenn seine Lösung zeitaufwendig ist. Der Begriff zeitaufwendig ist natürlich relativ, aber es hat sich als sinnvoll erwiesen, hier eine Grenze zu ziehen zwischen Problemen mit höchstens polynomieller Zeitkomplexität und Problemen mit größerer als polynomieller Zeitkomplexität.
Definition: Eine Zeitkomplexität von T(n) ∈ O(nk) wird als polynomielle Zeitkomplexität bezeichnet. Hierbei ist k ein konstanter Wert, der nicht von n abhängt.
Definition: Ein Problem hat polynomielle Zeitkomplexität, wenn es einen Algorithmus zur Lösung des Problems gibt, der polynomielle Zeitkomplexität hat.
Die Menge aller Entscheidungsprobleme, die polynomielle Komplexität haben, wird mit
Beispiel: Sei G = (V, E) ein beliebiger ungerichteter, zusammenhängender Graph mit einer Kantengewichtung w : E → ℕ sowie k eine beliebige Zahl.
Das Entscheidungsproblem "Hat G einen Spannbaum mit einem Gewicht ≤ k?" liegt in
Wir konstruieren einen minimalen Spannbaum, dies erfordert Zeit O(n2), wobei n die Anzahl der Knoten des Graphen ist, und vergleichen das Gewicht des minimalen Spannbaums mit der Zahl k.
Das gedankliche Modell des Nichtdeterminismus haben wir bei den endlichen Automaten kennen gelernt.
Ein nichtdeterministischer Algorithmus ist dadurch gekennzeichnet, dass er in jedem Schritt möglicherweise mehrere Wahlmöglichkeiten hat. Eine solche Wahlmöglichkeit könnte beispielsweise darin bestehen, dass der Algorithmus frei wählen kann, ob er die Anweisung x=1, x=2 oder x=3 ausführt. Wohlgemerkt, er trifft seine Wahl nicht deterministisch etwa aufgrund einer Bedingung (wie bei einer If-Anweisung in einem deterministischen Algorithmus), sondern nichtdeterministisch. Je nach dem, welche Möglichkeit er wählt, gerät er aus seiner aktuellen Konfiguration in eine andere Folgekonfiguration. Eine solche Wahlmöglichkeit gibt es bei einem deterministischen Algorithmus nicht, die jeweilige Folgekonfiguration ist stets eindeutig bestimmt. Auch bei einer Verzweigung aufgrund einer Bedingung ist die Folgekonfiguration eindeutig, je nach dem, ob die Bedingung wahr oder falsch ist. Eine Berechnung eines deterministischen Algorithmus lässt sich durch eine Kette von Konfigurationen wie in Bild 1a veranschaulichen. Eine Berechnung eines nichtdeterministischen Algorithmus gleicht dagegen einem Baum von Konfigurationen wie in Bild 1b.
Bild 1: Deterministische Berechnung (a), nichtdeterministische Berechnung (b)
Es ist schwierig, sich einen nichtdeterministischen Algorithmus vorzustellen. Welche Wahl trifft der Algorithmus, wenn er mehrere Wahlmöglichkeiten hat? Hier gibt es mehrere Möglichkeiten der Vorstellung: Eine ist, dass der Algorithmus mit schlafwandlerischer Sicherheit immer die richtige Wahl trifft, die zur Lösung des Problems führt. Die andere ist, dass er alle Wahlmöglichkeiten gleichzeitig durchspielt. Der Algorithmus erzeugt entsprechend viele Kopien von sich selbst, und jede dieser Kopien rechnet in der entsprechenden Folgekonfiguration weiter. Wenn irgendeine dieser Kopien die Lösung des Problems gefunden hat, stoppt der Algorithmus.
Definition: Ein Problem hat nichtdeterministisch polynomielle Zeitkomplexität, wenn es einen nichtdeterministischen Algorithmus zur Lösung des Problems gibt, der polynomielle Zeitkomplexität hat.
Die Menge aller Entscheidungsprobleme, die nichtdeterministisch polynomielle Zeitkomplexität haben, wird mit
Offenbar gilt
Es sollen nun einige Probleme betrachtet werden, die in
Das
Definition: Das Erfüllbarkeitsproblem (satisfiability problem – SAT) besteht darin, für eine beliebige boolesche Formel f mit Variablen x0, ..., xk-1 die Frage zu beantworten: "Ist f erfüllbar?" Eine boolesche Formel ist erfüllbar, wenn es eine Belegung ihrer Variablen mit den Wahrheitswerten true und false gibt, sodass die Auswertung der Formel den Wahrheitswert true ergibt.
Beispiel: Die Formel
f = (x0 ∨ x1) ∧ (x0 ∨ x1) ∧ (x0 ∨ x1)
ist erfüllbar, denn mit der Belegung x0 = true und x1 = false ergibt die Formel den Wert true.
Die Formel
g = x1 ∧ (x0 ∨ x1) ∧ (x0 ∨ x1)
ist dagegen nicht erfüllbar.
Das Erfüllbarkeitsproblem liegt in
Definition: Das Cliquen-Problem (CLIQUE) besteht darin, für einen beliebigen ungerichteten Graphen G mit n Knoten und für beliebiges k ∈ ℕ die Frage zu beantworten: "Enthält G eine k-Clique?" Eine k-Clique ist ein vollständig verbundener Teilgraph mit k Knoten.
Das Cliquen-Problem liegt in
Definition: Gegeben ist ein ungerichteter Graph G = (V, E). Ein Hamiltonscher Kreis ist ein Kreis, der alle Knoten enthält, also ein Pfad, der jeden Knoten genau einmal durchläuft und zum Ausgangsknoten zurückführt.
Das Problem des Hamiltonschen Kreises (Hamiltonian circuit – HC) besteht darin, für einen beliebigen ungerichteten Graphen G zu entscheiden, ob G einen Hamiltonschen Kreis enthält.
Das Problem des Hamiltonschen Kreises liegt in
Weiter mit: [