29.10.2013 Aufrufe

Skript zur Vorlesung Komplexitätstheorie im SS 1996

Skript zur Vorlesung Komplexitätstheorie im SS 1996

Skript zur Vorlesung Komplexitätstheorie im SS 1996

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Skript</strong> <strong>zur</strong> <strong>Vorlesung</strong><br />

<strong>Komplexitätstheorie</strong><br />

<strong>im</strong> <strong>SS</strong> <strong>1996</strong><br />

Technische Universität Ilmenau<br />

Fakultät für Informatik und Automatisierung<br />

Institut für Technische und Theoretische Informatik<br />

Fachgebiet Automaten und Formale Sprachen<br />

Prof. Dr. Manfred Kunde, Andre Osterloh


Inhaltsverzeichnis<br />

Einleitung 1<br />

1 Probleme und Algorithmen 1<br />

1.1 Erreichbarkeit in Graphen (REACHABILITY) . . . . . . . . 1<br />

1.2 O-Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

1.3 Max<strong>im</strong>aler Fluß . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

1.4 Problem des Handlungsreisenden . . . . . . . . . . . . . . . . 10<br />

2 Turing-Maschine 10<br />

2.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

2.2 Turing-Maschinen als Algorithmen . . . . . . . . . . . . . . . 14<br />

2.3 Turing-Maschinen mit mehreren Bändern . . . . . . . . . . . 15<br />

2.4 Lineare Beschleunigung (Linear Speedup) . . . . . . . . . . . 18<br />

2.5 Platzschranken . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

2.6 Random Access Machine (RAM) . . . . . . . . . . . . . . . . 22<br />

2.7 Nichtdeterministische Maschinen . . . . . . . . . . . . . . . . 23<br />

3 Beziehungen zwischen Komplexitätsklassen 26<br />

3.1 Komplexitätsklassen . . . . . . . . . . . . . . . . . . . . . . . 26<br />

3.2 Hierarchiesätze . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />

3.3 Die Erreichbarkeitsmethode . . . . . . . . . . . . . . . . . . . 33<br />

3.3.1 Nichtdeterministischer Platz . . . . . . . . . . . . . . . 35<br />

4 Reduktionen und Vollständigkeit 40<br />

4.1 Reduktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

4.2 Vollständigkeit . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

5 NP-vollständige Probleme 50<br />

5.1 Varianten von SAT . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

5.2 Graphentheoretische Probleme . . . . . . . . . . . . . . . . . 53<br />

5.3 Mengen- und Zahlenprobleme . . . . . . . . . . . . . . . . . . 55<br />

5.4 Weitere NP-vollständige Probleme . . . . . . . . . . . . . . . 60<br />

6 coNP 60<br />

6.1 NP und coNP . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />

6.2 Pr<strong>im</strong>zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />

7 Schlußbetrachtungen 65<br />

7.1 P gegen NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

7.2 Orakel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

7.3 PSPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />

7.4 Parallele Komplexitätsklassen . . . . . . . . . . . . . . . . . . 68


1 PROBLEME UND ALGORITHMEN 1<br />

Einleitung<br />

Dieses <strong>Skript</strong> ist als vorlesungsbegleitendes Material <strong>zur</strong> <strong>Vorlesung</strong> <strong>Komplexitätstheorie</strong><br />

gedacht, die an der TU Ilmenau <strong>im</strong> Bereich der Theoretischen<br />

Informatik angeboten wird.<br />

Im Inhalt und Aufbau orientiert es sich sehr stark an dem Buch ” Computational<br />

Complexity“ von Christos H. Papad<strong>im</strong>itriou. Einige Teile entstammen<br />

dem Buch ” Computers and Intractability, A Guide to the Theory of<br />

NP-completeness“ von M. R. Garey und D. S. Johnson. In diesem und den<br />

in der Literaturliste angegebenen Büchern findet der Leser weitere Informationen<br />

über die in diesem <strong>Skript</strong> angesprochenen und nicht angesprochenen<br />

Teilbereiche der <strong>Komplexitätstheorie</strong>.<br />

Entstanden ist das vor Ihnen liegende <strong>Skript</strong> durch die Mitarbeit mehrer<br />

Personen, denen hiermit dafur gedankt sei. Ein besonderer Dank geht an<br />

Herrn Björn-Hendrik Moritz, der das handgeschriebene <strong>Skript</strong> in ein L ATEXfile<br />

verwandelte und an Herrn Michael Sommer, der bei der Fehlersuche sehr<br />

erfolgreich war.<br />

Fehler oder Verbesserungsvorschläge, die das <strong>Skript</strong> betreffen, können sie an<br />

folgende e-mail-Adresse schicken: osterloh@theoinf.tu-ilmenau.de.<br />

1 Probleme und Algorithmen<br />

1.1 Erreichbarkeit in Graphen (REACHABILITY)<br />

Definition 1.1 Ein Graph G = (V, E) ist ein Tupel aus<br />

1. einer endlichen Menge V von Knoten und<br />

2. einer Menge E ⊆ V × V von Kanten<br />

Im folgenden werden die Knoten (oft) als Zahlen 1, . . . , |V | geschrieben.<br />

Sei G = (V, E) ein Graph; dann lautet die Frage bei REACHABILITY: Gibt<br />

es einen Pfad von Knoten v1 nach v2?<br />

Beispiel: v1 = 1, v2 = 5. Existiert ein Weg von 1 nach 5?<br />

1 4<br />

✻ 5<br />

2 ✲ 3<br />

❄<br />

❤ ✲ ❤<br />

❦<br />

❤<br />

✸<br />

❤ ❤<br />

Antwort: Ja, (1, 4, 3, 5).<br />

Wäre allerdings statt des Paars (4, 3) das Paar (3, 4) eine Kante <strong>im</strong> Graph, so<br />

gäbe es keinen Pfad von 1 nach 5. Obiges Beispiel ist ein Fall oder Instanz des<br />

Problems REACHABILITY. Ein Fall ist durch folgendes gekennzeichnet:


1 PROBLEME UND ALGORITHMEN 2<br />

• ein mathematisches Objekt (hier ein Graph und zwei Knoten)<br />

• eine Fragestellung<br />

• ein Antwort auf die Fragestellung: ja oder nein (ein sogenanntes Entscheidungsproblem)<br />

Entscheidungsprobleme werden eine zentrale Rolle in dieser <strong>Vorlesung</strong> spielen.<br />

Man löst ein gegebenes Problem mit einem Lösungsverfahren (Algorithmus).<br />

Formale Modelle zum Ausdrücken von Algorithmen sind:<br />

• Turing-Maschine<br />

• Random Access Machine (RAM)<br />

• PASCAL<br />

• Informelle Beschreibung (meist in der <strong>Vorlesung</strong>)<br />

Algorithmus 1.1 (REACHABILITY) Idee: Aufbauen einer Menge<br />

S ⊆ V :<br />

• Anfang: S = {1}<br />

• Knoten werden markiert oder nicht<br />

• Knoten i markiert, falls i zu einem Zeitpunkt gerade zu S gehört<br />

Dazu wird folgende Schleife durchlaufen:<br />

• In jeder Iteration wird ein Knoten i ∈ S gewählt und entfernt. Das<br />

neue S entsteht dann aus S := S\{i}<br />

• Behandle alle Kanten (i, j) ∈ E nacheinander. Falls j nicht markiert<br />

ist, markiere j. S = S ∪ {j}<br />

Wiederhole die Schleife bis S = ∅ (eigentlich reicht es, die Schleife zu wiederholen,<br />

bis n ∈ S). Falls zu diesem Zeitpunkt n markiert ist, dann Ausgabe<br />

” ja“. Falls n nicht markiert, dann Antwort ” nein“.<br />

Beweis der Korrektheit des Suchalgorithmus durch das Beweisen der Behauptung:<br />

Der Knoten i ist markiert ⇔ Es gibt einen Weg von 1 nach i<br />

(Übungsaufgabe).


1 PROBLEME UND ALGORITHMEN 3<br />

Ungenauigkeiten:<br />

1. Genaue Darstellung des Graphen (Fallbeschreibung) möglich durch:<br />

• Knotenliste: 1, . . . , 5 und Kantenliste: (1, 4), (2, 1), (2, 3), (3, 5),<br />

(4, 3), (5, 4) oder<br />

• n × n-Matrix (Adjazenzmatrix):<br />

<br />

1<br />

aij =<br />

0<br />

falls<br />

sonst<br />

(i, j) ∈ E<br />

⎛<br />

⎜<br />

Im obigen Beispiel: ⎜<br />

⎝<br />

0 0 0 1 0<br />

1 0 1 0 0<br />

0 0 0 0 1<br />

0 0 1 0 0<br />

0 0 0 1 0<br />

Es wird sich später zeigen, daß die genaue Darstellung keine große<br />

Rolle spielt.<br />

2. Ungenaue Darstellung des Algorithmus: Wie wird der Knoten i ∈ S<br />

ausgewählt? Z. B.<br />

• Wähle Knoten i, der am längsten in S war (S als Warteschlange).<br />

Resultierender Algorithmus: Breitensuche (breadth-first).<br />

• Wähle Knoten i, der am kürzesten in S war (S als Stapel, Stack).<br />

Resultierender Algorithmus: Tiefensuche (depth-first).<br />

Es gibt viele Möglichkeiten, S zu verwalten. Der Algorithmus arbeitet<br />

korrekt für alle Auswahlen.<br />

Effizienz des Algorithmus: Jede Zeilenmatrix wird nur einmal besucht, d. h.<br />

es gibt ≤ n 2 Operationen auf den Kanten, die zu den ausgewählten Knoten<br />

gehören. Die Annahme dabei ist, daß der Zeitaufwand konstant ist für:<br />

• Auswahl der Knoten aus S<br />

• Markieren von Knoten<br />

• Auskunft, ob Knoten markiert oder nicht<br />

Der Algorithmus löst das Problem proportional zu n 2 oder in O(n 2 ).<br />

1.2 O-Notation<br />

Definition 1.2 Seien f, g : N → N, n, n0 ∈ N und c ∈ R<br />

⎞<br />

⎟<br />

⎠<br />

1. f ∈ O(g) :⇔ ∃c > 0, ∃n0 ∀n ≥ n0 f(n) ≤ cg(n).<br />

Dies wird auch als f(n) = O(g(n)) geschrieben.


1 PROBLEME UND ALGORITHMEN 4<br />

2. f ∈ Ω(g) :⇔ g ∈ O(f)<br />

Dies wird auch als f(n) = Ω(g(n)) geschrieben.<br />

3. f ∈ θ(g) :⇔ f ∈ O(g) ∩ Ω(g)<br />

Dies wird auch als f(n) = θ(g(n)) geschrieben.<br />

Nachbemerkung: f ∈ Ω(g) ist manchmal definiert als:<br />

:⇔ ∃c ∃unendlich viele n f(n) ≥ cg(n)<br />

Sprechweise für f ∈ O(g): f wächst größenordungsmäßig langsamer oder genauso<br />

wie g. Sprechweise für f ∈ θ(g): f und g wachsen größenordungsmäßig<br />

gleichschnell.<br />

Beispiele und Bemerkungen:<br />

1. n ∈ O(n 2 ), n log n ∈ O(n 2 )<br />

2. Falls f(n) ∈ N, meinen wir: max (⌈f(n)⌉, 0)<br />

3. Für Polynome p vom Grad m, also<br />

p(n) = am · n m + am−1n m−1 + · · · + a1n + a0 (am > 0)<br />

gilt: p(n) ∈ O(n m )<br />

4. ∀m : n m ∈ O(2 n ), aber 2 n ∈ O(n m )<br />

5. Es gilt: O(1) < O(log n) < O(n) < O(n log n) < O(n 2 ) < O(n 3 ) <<br />

O(2 n )<br />

Zeitabschätzung durch ein Polynom: O(n 2 ) für REACHBILITY wird<br />

als behandelbarer Zeitaufwand angesehen.<br />

Im Rahmen dieser <strong>Vorlesung</strong> wird generell polynomielles Wachstum als<br />

vernünftig behandelbar angesehen. Dagegen ist nicht polynomielles Wachs-<br />

tum nicht mehr vernünftig behandelbar. Dazu einige Zahlenbeispiele.<br />

Kritik hierbei: n 100 ist polynomiell und behandelbar, aber 2 n<br />

100 ist nicht mehr<br />

behandelbar? Wenn das n und damit die Problemgröße sehr groß wird, wird<br />

2 n<br />

100 jedes Polynom irgendwann übertreffen.<br />

Kleine Problemgrößen, die in der Praxis oft vorkommen, werden mit einem<br />

in exponentieller Zeit arbeitenden Algorithmus eventuell schneller gelöst.<br />

Beispielsweise wird be<strong>im</strong> Linearen Programmieren die S<strong>im</strong>plex-Methode (exponentieller<br />

Aufwand) praktisch genutzt, wohingegen die Ellipsoid-Methode<br />

(polynomieller Aufwand) praktisch nicht nutzbar ist.


1 PROBLEME UND ALGORITHMEN 5<br />

Komplexitätsfunktion<br />

10 20 30<br />

Größe n<br />

40 50 60<br />

n 0.00001 0.00002 0.00003 0.00004 0.00005 0.00006<br />

s s s s s s<br />

n2 0.0001 0.0004 0.0009 0.0016 0.0025 0.0036<br />

s s s s s s<br />

n3 0.001 s 0.008 s 0.027 s 0.064 s 0.125 s 0.216 s<br />

n5 0.1 s 3.2 s 24.3 s 1.7 5.2 13.0<br />

min min min<br />

2n 0.001 s 1.0 s 17.9 12.7 35.7 366<br />

min Tage Jahre Jhdte<br />

3n 0.059 s 58 min 6.5 3855 2.0 ×<br />

Jahre Jhdte 108 1.3 ×<br />

10<br />

Jhdte<br />

13<br />

Jhdte<br />

Tabelle 1: Vergleich einiger polynomieller und exponentieller Zeitkomplexitätsfunktionen<br />

(1 Schritt ≡ 10 −6 Sekunden), Jhdte – Jahrhunderte<br />

Verhalten <strong>im</strong> schlechtesten Fall: Basis unserer Betrachtung ist der<br />

schlechteste Fall (worst case).<br />

Vielfach wäre es günstiger, ein Verhalten <strong>im</strong> Mittel zu beschreiben, z. B.<br />

REACHABILITY: Knoten n wird bei gewissen Graphenklassen nach durchschnittlich<br />

log n Iterationen markiert: REACHABILITY ∈ O(n log n) <strong>im</strong><br />

Mittel.<br />

Diese Analyse wird bei Algorithmen gemacht. Schwierig ist es jedoch, eine<br />

angemessene Eingabeverteilung zu finden und daraus einen mittleren Wert<br />

zu ermitteln.<br />

Standpunkt in der <strong>Komplexitätstheorie</strong>: Polynomiell zeitbeschränktes<br />

Verhalten <strong>im</strong> schlechtesten Fall wird als Kriterium für Effizienz benutzt.<br />

Dies ergibt eine nützliche Theorie, die Bedeutendes über praktische Berechnung<br />

aussagen kann und die ohne diese Vereinfachung wohl nicht möglich<br />

wäre.<br />

1.3 Max<strong>im</strong>aler Fluß<br />

Definition 1.3 Ein Netzwerk N = (V, E, s, t, c) ist ein Graph G = (V, E).<br />

s ist dabei der Anfangsknoten (die sogenannte Quelle, d. h. keine Kante geht<br />

nach s) und t ist der Endknoten (die sogenannte Senke, d. h. keine Kante<br />

verläßt t). Für jede Kante (i, j) ∈ E gibt c(i, j) ≥ 0 die Kapazität der Kante<br />

an.


1 PROBLEME UND ALGORITHMEN 6<br />

Definition 1.4 Ein Fluß in N ist eine Zuordnung f : E → N 0 mit<br />

f(i, j) ≤ c(i, j) für alle (i, j) ∈ E derart, daß für jeden Knoten die Summe<br />

der f’s der hereinkommenden Kanten gleich der Summe der f’s der<br />

herausgehenden Kanten ist, d. h. es gilt für alle v ∈ V \ {s, t}:<br />

<br />

(i,v)∈E<br />

f(i, v) = <br />

(v,j)∈V<br />

f(v, j)<br />

Definition 1.5 Der Wert eines Flusses f ist die Summe aller Flüsse, die<br />

die Quelle s verlassen (bzw. die Senke t erreichen). Mathematisch formuliert<br />

gilt:<br />

Wert(f) = <br />

f(s, i) − <br />

f(j, s) = <br />

f(i, t) − <br />

f(t, j)<br />

(s,i)∈E<br />

(j,s)∈V<br />

(i,t)∈E<br />

(t,j)∈V


1 PROBLEME UND ALGORITHMEN 7<br />

Beispiel-Netz:<br />

s<br />

✉ 1 ✲ ✉<br />

2 ✒ ✼<br />

✉ 2<br />

3<br />

❘ ✉ 1 ✲<br />

✉<br />

4<br />

❘ ✉t<br />

✒<br />

3<br />

s<br />

✉<br />

Fluß f<br />

✉ ✲ ✉<br />

✒<br />

2<br />

✼ ✼<br />

3 ❘ ❘ ✉ ✲<br />

✲<br />

1<br />

✉<br />

2<br />

❘<br />

❘ ✉t<br />

✒<br />

✼<br />

1<br />

MAXFLOW: Finde Fluß mit dem größten Wert. Dies ist ein Opt<strong>im</strong>ierungsproblem,<br />

das unter den möglichen Lösungen die beste sucht. Es ist kein<br />

Entscheidungsproblem.<br />

Das zugehörige Entscheidungsproblem ist MAXFLOW(D): Gegeben ist ein<br />

Netzwerk und k ∈ N. Die Frage lautet: Existiert <strong>im</strong> Netzwerk ein Fluß mit<br />

Wert(f) ≥ k?<br />

Dieses Entscheidungsproblem kann natürlich sofort durch einen Algorithmus<br />

für MAXFLOW gelöst werden, da nur der Wert eines max<strong>im</strong>alen Flusses<br />

mit der Schranke k verglichen werden muß. Falls wir einen Algorithmus für<br />

das Entscheidungsproblem haben, so können wir den Wert eines max<strong>im</strong>alen<br />

Flusses mit Hilfe von binärer Suche finden. Dies ist nicht ganz trivial, später<br />

genauer.<br />

Algorithmus 1.2 (MAXFLOW) (für Graphen ohne Paare von entgegengesetzten<br />

Kanten)<br />

Sei ein Fluß f gegeben. Frage: Ist f opt<strong>im</strong>al?<br />

Falls es einen Fluß f ′ mit größerem Wert als f gibt, d. h. es gilt: Wert<br />

(f ′ ) > Wert (f), dann ist<br />

∆f := f ′ − f mit ∆f(i, j) = f ′ (i, j) − f(i, j), (i, j) ∈ E<br />

selbst ein Fluß mit positivem Wert, also Wert(∆f) = Wert(f ′ )− Wert(f) ><br />

0.<br />

Problem hierbei ist: ∆f(i, j) kann negativ werden. Dies kann als positiver<br />

Fluß entlang der Kante (j, i) angesehen werden. Dieser umgekehrte Fluß<br />

entlang von (j, i) ist ≤ f(i, j).<br />

Falls ∆f(i, j) ≥ 0, dann gilt: ∆f(i, j) ≤ c(i, j) − f(i, j).<br />

Anders betrachtet ist ∆f als Fluß in einem abgeleitetem Netzwerk N(f) =<br />

(V, E ′ , s, t, c ′ ) mit<br />

• E ′ = E\{(i, j)|f(i, j) = c(i, j)} ∪ {(i, j)|(j, i) ∈ E, f(j, i) > 0}<br />

• c ′ <br />

c(i, j) − f(i, j)<br />

(i, j) =<br />

f(j, i)<br />

für<br />

für<br />

(i, j) ∈ E<br />

(i, j) ∈ E ′ \E


1 PROBLEME UND ALGORITHMEN 8<br />

Beispiel: Fortsetzung von oben:<br />

s ✉<br />

■<br />

3<br />

✉ 1 ✲ ✉✾<br />

2 ✒<br />

2<br />

✉✴ ✛1<br />

2<br />

2<br />

2<br />

✿ ✉<br />

✿<br />

t<br />

✉✮<br />

1<br />

Man kann einfach einsehen: f ist max<strong>im</strong>al ⇔ Es gibt keinen positiven Fluß<br />

in N(f).<br />

Das Finden eines positiven Flusses in einem Netzwerk mit positiven Kapazitäten<br />

entspricht der Frage: Gibt es einen Weg von s nach t in N(f)?, d.<br />

h. es ist ein Fall von REACHABILITY. Wir können also zu einem gegebenen<br />

Fluß entscheiden, ob er max<strong>im</strong>al ist oder nicht. Daraus ergibt sich der<br />

folgende<br />

Algorithmus 1.3 (MAXFLOW) Führe folgende Schleife aus:<br />

1. Beginne mit Fluß f = 0 (d. h. f(i, j) = 0 für alle (i, j) ∈ E)<br />

2. Konstruiere N(f)<br />

3. Gibt es keinen Weg von s nach t?<br />

(a) Ja: f ist opt<strong>im</strong>al. Ende.<br />

(b) Nein: Suche auf einem Weg von s nach t die kleinste Kapazität<br />

c ′ entlang seiner Kanten.<br />

4. Addiere c ′ zu f für alle Kanten, die auf dem Weg liegen:<br />

Gehe zu 2.<br />

⎧<br />

⎨<br />

f(i, j) =<br />

⎩<br />

f(i, j) + c ′ (i, j) auf Weg<br />

f(i, j) − c ′ (j, i) auf Weg<br />

f(i, j) sonst<br />

Zeitaufwand: Jede Iteration (Aufbau N(f), Finden eines Weges) dauert<br />

O(n 2 ) und erhöht den Wert des Flusses um mindestens 1 (da Flüsse und<br />

Kapazitäten ganzzahlig sind). Sei C die max<strong>im</strong>ale Kapazität an einer Kante.<br />

Es gibt n Knoten insgesamt, d. h. ≤ n Kanten verlassen s. Also ist der<br />

max<strong>im</strong>ale Flußwert ≤ n · C. Dies <strong>im</strong>pliziert, daß es höchstens n · C Iterationen<br />

gibt und der Zeitaufwand somit in O(n 3 · C) liegt. Ω(n 3 · C) kann leider<br />

erreicht werden.


1 PROBLEME UND ALGORITHMEN 9<br />

Beispiel:<br />

s<br />

i❥<br />

C ✒ ✻<br />

C<br />

1 ✒ ❘ t<br />

❘ ❥<br />

j<br />

Wenn der Algorithmus für REACHABILITY <strong>im</strong>mer die Kanten (i, j) oder<br />

(j, i) durchläuft, werden mindestens 2C Iterationen benötigt!<br />

Bei binärer Kodierung benötigt die Darstellung von C ⌈log C⌉ Bits. Wenn<br />

etwa log C > n2 ist, wird die Länge der Problembeschreibung, d. h. die Beschreibung<br />

des aktuellen Problemfalls durch O(n2 log C) beschränkt. Wählt<br />

man beispielsweise <strong>im</strong> obigen Beispiel C = 2n3, dann ist die Laufzeit<br />

O(n3C) = O(n32n3) eine exponentielle Funktion der Eingabelänge, der Algorithmus<br />

für MAXFLOW ist exponentiell.<br />

Einfache Verbesserung: Statt irgendeinen Pfad von s nach t in N(f) zu<br />

suchen, gehe den Weg mit den wenigsten Knoten (z. B. mit der ” breadthfirst“-Version<br />

bei REACHABILITY). Man kann dann zeigen, daß höchstens<br />

n 3 Iterationen mit diesem Algorithmus nötig sind, also MAXFLOW in O(n 5 )<br />

ist. (Anmerkung: Es geht sogar noch schneller.) Damit ist die Schranke von<br />

einem exponentiellen zu einem polynomiellen Algorithmus durchbrochen.<br />

Wir werden sehen, daß das leider wohl nicht <strong>im</strong>mer möglich ist.<br />

Bipartites Matching (Heiratsproblem): Gegeben sei ein bipartiter<br />

Graph B(U, V, E) mit U, V Knoten, E ⊆ U × V und |U| = |V | = n.<br />

Frage: Gibt es ein (perfektes) MATCHING, d. h. existiert eine Menge M ⊆<br />

E mit |M| = n, und für alle (u, v), (u ′ , v ′ ) ∈ M gilt: u = u ′ und v = v ′ ?<br />

Beispiel:<br />

<br />

<br />

<br />

<br />

<br />

C<br />

C<br />

U V<br />

Wir suchen also Paare von Männern und Frauen, die sich sympathisch sind.<br />

Jede Person soll einen Partner finden. Wir können dieses Problem reduzieren<br />

auf ein Flußproblem in folgendem Netzwerk:<br />

Die Knotenmenge ist U ∪ V ∪ {s, t}, die Kantenmenge {(s, u)|u ∈ U} ∪ E ∪<br />

{(v, t)|v ∈ V } und die Kapazität aller Kanten ist 1. Das zugehörige Netzwerk<br />

sieht dann folgendermaßen aus:


2 TURING-MASCHINE 10<br />

s<br />

<br />

❃<br />

✯<br />

✲<br />

❥<br />

⑦<br />

<br />

<br />

<br />

<br />

<br />

✼<br />

❥<br />

❥<br />

❥<br />

❥✲<br />

<br />

<br />

<br />

<br />

<br />

⑦❥✲ ✶❃<br />

t<br />

Sofort einzusehen ist dann: Es gibt ein Matching genau dann, wenn das<br />

zugehörige Netzwerk einen Fluß mit Wert n hat. Das Problem ” Bipartites<br />

Matching“ wurde reduziert auf MAXFLOW.<br />

Algorithmus 1.4 (MATCHING) Erstelle zugehöriges Netzwerk und<br />

wende dann polynomiellen Lösungsalgorithmus auf MAXFLOW (D) an.<br />

Bei diesem Algorithmus ist der MAXFLOW-Algorithmus sogar polynomiell,<br />

der MATCHING-Algorithmus liegt in O(n 3 ).<br />

Hier gab es eine Reduktion auf ein Problem, das gut gelöst werden kann.<br />

Später ist es sehr wichtig, Probleme zu reduzieren, für die wir keine praktikable<br />

Lösung kennen.<br />

1.4 Problem des Handlungsreisenden<br />

TSP (Traveling Salesman Problem)<br />

Gegeben sind n Städte und dij ≥ 0 Distanzen zwischen zwei Städten i und<br />

j.<br />

Finde kürzeste Tour durch alle Städte, d. h. finde Permutation Π mit<br />

<br />

n−1<br />

dΠ(l),Π(l+1) + dΠ(n),Π(1) l=1<br />

min<strong>im</strong>al. Das Entscheidungsproblem TSP (D) lautet: Finde zu gegebenen<br />

D eine Tour mit Länge ≤ D.<br />

Algorithmus 1.5 Einfacher Algorithmus: Probiere alle (n−1)! Touren aus<br />

(Start <strong>im</strong>mer mit 1) und wähle davon die kürzeste aus.<br />

Die Laufzeit ist hier O(n!), also exponentiell. Derzeit gibt es für dieses Problem<br />

keinen bekannten Algorithmus, der polynomiellen Zeitaufwand hat!<br />

Das berührt die berühmte P = NP Frage, die Gegenstand dieser <strong>Vorlesung</strong><br />

ist.<br />

2 Turing-Maschine<br />

Eine Turing-Maschine ist eine sehr einfache Maschine mit nur einem Datentyp,<br />

nämlich Wörter von Symbolen, die aber letztlich alles kann, was wir<br />

uns unter einer Berechnung vorstellen.


2 TURING-MASCHINE 11<br />

2.1 Grundlagen<br />

Definition 2.1 Eine Turing-Maschine (TM) ist ein Viertupel M =<br />

(K, Σ, δ, s) mit<br />

• K — endliche Menge von Zuständen<br />

• s ∈ K — Startzustand<br />

• Σ — endliches Alphabet. Es gilt: K ∩ Σ = ∅. Spezielle Zeichen in Σ:<br />

– ⊔ — Blank<br />

– ⊲ — Anfangszeichen, erstes Symbol auf dem Band<br />

• δ — Übergangsfunktion (Programm) mit<br />

Dabei ist:<br />

δ : K × Σ → (K ∪ {h, ” yes“, ” no“}) × Σ × {←, –, →}<br />

– h — Haltezustand<br />

– ” yes“ — akzeptierender Zustand<br />

– ” no“ — <strong>zur</strong>ückweisender Zustand<br />

– ← — Bewegung des Lese/Schreibkopfes nach links<br />

– – — Keine Bewegung des L/S-Kopfes<br />

– → — Bewegung des L/S-Kopfes nach rechts<br />

←, – und → sind nicht in K ∪ Σ.<br />

Genaue Definition von δ: Sei q ∈ K, σ ∈ Σ. Dann ist:<br />

wobei<br />

• p — nächster Zustand<br />

δ(q, σ) = (p, ρ, D)<br />

• ρ — Zeichen, mit dem σ überschrieben wird<br />

• D ∈ {←, –, →} – Richtung des L/S-Kopfes<br />

Für ⊲ fordern wir, daß es nie überschrieben und nie nach links passiert wird,<br />

d. h.<br />

∀q ∈ K : δ(q, ⊲) = (p, ⊲, →)<br />

Die Eingabe auf dem Band ist anfangs: ⊲x, x ∈ (Σ\{⊔}) ∗


2 TURING-MASCHINE 12<br />

s<br />

δ<br />

✠<br />

⊲ x1 x2 . . . xn ⊔ ⊔<br />

Da die Turing-Maschine niemals über den linken Rand des Bandes (⊲) hinausgeht,<br />

gibt es nur einen Grund, warum die Maschine nicht fortfährt,<br />

nämlich die Haltezustände h, ” yes“ und ” no“.<br />

Berechnung (Ausgabe) M(x): bei Eingabe x<br />

Haltezustand Ausgabe der Berechnung<br />

yes M(x) = ” yes“<br />

no M(x) = ” no“<br />

h M(x) = y<br />

Die Bandinschrift zum Zeitpunkt h ist dabei: ⊲y ⊔ ⊔ . . . .<br />

• y = ɛ (leeres Wort), falls die Bandinschrift die Form ⊲x mit x ∈ {⊔} ∗<br />

hat<br />

• y = x, falls die Bandinschrift die Form ⊲xv mit v ∈ {⊔} ∗ und x ∈<br />

Σ ∗ (Σ\{⊔}) hat.<br />

Falls M nicht hält: M(x) :=↗ (Sondersymbol).<br />

Beispiel: Maschine mit Eingabe x, x ∈ {0, 1} ∗ und M(x) = ⊔x (Verschieben<br />

von x um ein Feld nach rechts).<br />

K Σ δ<br />

s ⊲ (s, ⊲, →)<br />

s i (∈ {0, 1}) (qi, ⊔, →)<br />

s ⊔ (h, ⊔, –)<br />

qi 0 (q0, i, →)<br />

qi 1 (q1, i, →)<br />

qi ⊔ (h, i, –)


2 TURING-MASCHINE 13<br />

Beispiellauf:<br />

s ⊲010<br />

s ⊲ 010<br />

q0 ⊲⊔ 10<br />

q1 ⊲⊔ 0 0<br />

q0 ⊲⊔ 0 1 ⊔<br />

h ⊲⊔ 0 1 0<br />

Weiteres Beispiel: Addition einer Eingabe x ∈ {0, 1} ∗ mit 1.<br />

Methode: Invertiere vom Ende alle Einsen zu Null bis zu erster Null, die dann<br />

zu Eins invertiert wird (10010 011 → 10010 100 ). Problem dabei: 111111<br />

Definition 2.2 Eine Konfiguration einer Turing-Maschine ist ein Tripel<br />

(q, w, u) mit:<br />

• q ∈ K ∪ {h, ” yes“, ” no“}<br />

• u ∈ Σ ∗ , w ∈ (⊲ · Σ ∗ )<br />

• wu ist die Bandinschrift (L/S-Kopf steht auf letztem Buchstaben von<br />

w)<br />

Definition 2.3 Eine Turing-Maschine M = (K, Σ, δ, s) geht von der Konfiguration<br />

(q, w, u) = (q, w ′ σ, αu ′ ) in einem Schritt über zu der Konfiguration<br />

(p, x, y) (Notation: (q, w, u) M → (p, x, y)), falls: δ(q, σ) = (p, ρ, D) mit<br />

• D =– (keine Bewegung): x = w ′ ρ, y = u<br />

• D =→: x = w ′ ρα, y = u ′<br />

• D =←: x = w ′ , y = ρu<br />

Dabei sind p, q ∈ K, w, x ∈ ⊲Σ ∗ , u, y, w ′ , u ′ ∈ Σ ∗ und σ, α, ρ ∈ Σ.<br />

Transitive Hülle:<br />

M k<br />

1. (q, w, u) → (p, x, y): M geht in k Schritten über ⇔ Es gibt Konfigurationen<br />

(qi, wi, ui), für die gilt:<br />

2. (q, w, u)<br />

• (qi, wi, ui) M → (qi+1, wi+1, ui+1), i = 1, . . . , k und<br />

• (q, w, u) = (q1, w1, u1) und<br />

• (p, x, y) = (pk+1, wk+1, uk+1)<br />

M ∗<br />

M k<br />

→ (p, x, y) ⇔ ∃k(q, w, u) → (p, x, y)


2 TURING-MASCHINE 14<br />

2.2 Turing-Maschinen als Algorithmen<br />

Definition 2.4 Sei L ⊆ (Σ\{⊔}) ∗ , f : (Σ\{⊔}) ∗ → Σ ∗ .<br />

1. Eine Turing-Maschine M akzeptiert L (Notation: L = L(M)) :⇔<br />

∀x ∈ (Σ\{⊔}) ∗ (x ∈ L ⇔ M(x) = ” yes“)<br />

L ist dann rekursiv aufzählbar<br />

2. Eine Turing-Maschine M entscheidet L :⇔<br />

∀x ∈ (Σ\{⊔}) ∗<br />

L ist dann rekursiv entscheidbar .<br />

(x ∈ L ⇔ M(x) = ” yes“) und<br />

(x ∈ L ⇔ M(x) = ” no“)<br />

3. Eine Turing-Maschine M berechnet f :⇔<br />

f ist dann rekursiv berechenbar .<br />

∀x ∈ (Σ\{⊔}) ∗ M(x) = f(x)<br />

Probleme und Sprachen: Turing-Maschinen eignen sich offenbar gut<br />

dazu, um Wörter (Strings) zu verarbeiten. Um Probleme mit Turing-<br />

Maschinen zu lösen, müssen wir jeden Fall eines Problems in geeigneter<br />

Weise als Wort (String) darstellen. Haben wir das erst einmal gemacht, so<br />

ist ein Entscheidungsproblem dadurch zu lösen, daß die zugehörige Sprache<br />

der mit ja ( ” yes“) beantworteten Fälle zu entscheiden ist. Oder alle zu<br />

Fällen gehörige Strings eines Opt<strong>im</strong>ierungsproblems dienen als Eingabe, um<br />

den gewünschten Wert zu berechnen.<br />

Beschreibung von Fällen eines Problems (oder Darstellung), z. B. REACHA-<br />

BILITY. Gegeben ist folgender Graph G = (V, E):<br />

1❤ ✲ 2❤<br />

❄ ❄<br />

3❤<br />

✛ 4❤<br />

Darstellung: {(1, 10), (1, 11), (10, 100), (100, 11)} oder<br />

(0110, 0001, 0000, 0010) (als Adjazenzmatrix).<br />

Es gibt sehr viele adäquate Darstellungen, die sehr unterschiedlich sein<br />

können.<br />

Sei PROB ein Problem und F ein Fall. F wird dargestellt als A(F ) ∈ X ∗<br />

bzw. als B(F ) ∈ Y ∗ , X und Y sind dabei Alphabete mit Klammern, usw.<br />

Sei |A(F )| = n die Anzahl der Zeichen in der Beschreibung, also die Länge<br />

von A(F ).<br />

Falls A und B vernünftige Darstellungen sind, dann gibt es ein Polynom p<br />

derart, daß |B(F )| ≤ p(n)


2 TURING-MASCHINE 15<br />

Definition 2.5 Die Beschreibungen (Kodierungen) A und B eines Problems<br />

PROB heißen polynomiell verwandt genau dann, wenn es Polynome p1<br />

und p2 gibt, so daß für alle Fälle F des Problems PROB |A(F )| ≤ p1(|B(F )|)<br />

und |B(F )| ≤ p2(|A(F )|) gilt.<br />

Diese Polynome sind für gängige Problembeschreibungen, Graphen, Mengen,<br />

Zahlen, usw. <strong>im</strong> allgemeinen nicht allzu groß. Zahlen stellen wir normalerweise<br />

binär dar. Nicht zugelassen ist dagegen die Darstellung von Zahlen in<br />

unärer Weise (5 ≡ 101, nicht 5 ≡ 11111).<br />

2.3 Turing-Maschinen mit mehreren Bändern<br />

⊲ x1 . . .<br />

♦<br />

Kontrolle δ<br />

✠ . . .<br />

⊲ x1<br />

☛<br />

⊲ x1 . . .<br />

Definition 2.6 Eine k-Band-Turing-Maschine M = (K, Σ, δ, s) ist eine Turing-Maschine<br />

mit mehreren (k) Bändern, wobei K, Σ, s wie bei der (ursprünglichen)<br />

1-Band-Turing-Maschine definiert sind.<br />

Die Übergangsfunktion δ ist wie folgt definiert:<br />

δ : K × Σ k → (K ∪ {h, ” yes“, ” no“}) × (Σ × {←, –, →}) k<br />

(q, σ1, . . . , σk) ↦→ (p, s1, D1, . . . , sk, Dk)<br />

Auf dem i-ten Band wird σi gelesen, ρi geschrieben und Di beschreibt die<br />

Bewegung des i-ten Kopfes. ⊲ ist auf jedem Band die Begrenzung nach links.<br />

Die Eingabe x ist nur auf dem ersten Band, die Ausgabe M(x) (falls Halt<br />

mit h) erfolgt nur auf dem letzten (k-ten) Band. In einem Schritt werden<br />

sämtliche Operationen aller k L/S-Köpfe gleichzeitig ausgeführt.<br />

Konfiguration: Eine Konfiguration sieht folgendermaßen aus<br />

(q, w1, u1, . . . , wk, uk)<br />

Der i-te L/S-Kopf zeigt auf das letzte Zeichen des Wortes wi.<br />

Die Anfangskonfiguration bei Eingabe von x:<br />

(s, ⊲, x, ⊲, ɛ, . . . , ⊲, ɛ)<br />

Die Haltekonfigurationen sind die folgenden:<br />

(h, . . . ), (yes, . . . ), (no, . . . )


2 TURING-MASCHINE 16<br />

Ein Übergang ist folgendermaßen definiert:<br />

(q, w1, u1, . . . , wk, uk) M → (p, x1, y1, . . . , xk, yk)<br />

Analog <strong>zur</strong> 1-Band-Turing-Maschine mit parallelem Arbeiten auf jedem der<br />

k Bänder.<br />

M l<br />

Ein Übergang in l Schritten: →, ein Übergang in endlich vielen Schritten:<br />

M ∗<br />

→ analog <strong>zur</strong> 1-Band-Turing-Maschine.<br />

Definition 2.7 Sei M eine k-Band-Turing-Maschine, x eine Eingabe und<br />

f : N → N eine Funktion.<br />

1. M benötigt <strong>zur</strong> Berechnung von M(x) t Schritte (Zeit t) :⇔<br />

(s, ⊲, x, ⊲, ɛ, . . . , ⊲, ɛ)<br />

Falls H = h, dann ist M(x) = wkuk.<br />

M t<br />

→ (H, w1, u1, . . . , wk, uk), H ∈ {h, ” yes“, ” no“}<br />

2. M arbeitet in Zeit f(n) :⇔<br />

für jede Eingabe x berechnet M die Ausgabe M(x) nach höchstens<br />

f(|x|) Schritten.<br />

3. Werde L ⊆ (Σ\{⊔}) ∗ von einer k-Band-Turing-Maschine entschieden,<br />

die in Zeit f(n) arbeitet. Dann ist L ∈ TIME (f(n)). TIME(f(n)) ist<br />

eine Menge von Sprachen, die in Zeit f(n) entschieden werden können,<br />

TIME(f(n)) heißt Komplexitätsklasse.<br />

Komplexitätsklassen und ihre zugehörigen Probleme sind genau der Gegenstand<br />

dieser <strong>Vorlesung</strong>.<br />

Welchen Einfluß haben nun diese k Bänder auf die Komplexität?<br />

Theorem 2.1 Zu jeder k-Band-Turing-Maschine M, die in Zeit f(n) arbeitet,<br />

gibt es eine 1-Band-Turing-Maschine M ′ , die in O(f(n) 2 ) arbeitet,<br />

wobei für alle Eingaben x gilt: M(x) = M ′ (x).<br />

Beweis: Die k-Band-Turing-Maschine M = (K, Σ, δ, s) soll durch die 1-<br />

Band-Turing-Maschine M ′ = (K ′ , Σ ′ , δ ′ , s) s<strong>im</strong>uliert werden.<br />

Idee: Die Bandinhalte der k Bänder werden hintereinander auf dem einen<br />

Band von M ′ geschrieben, allerdings ohne die ⊲’s (ersetze diese durch ⊲ ′ , die<br />

nach links überschritten werden dürfen). Das Merken der k Köpfe geschieht<br />

durch Unterstreichen des entsprechenden Symbols.<br />

Σ ′ = Σ ∪ Σ ∪ {⊲, ⊳, ⊳ ′ } mit<br />

• Σ = {σ|σ ∈ Σ} für die Markierung der Position der i-ten Köpfe.<br />

• ⊲ ′ – ” linke Ende eines Bandes“, kann nach links passiert werden


2 TURING-MASCHINE 17<br />

• ⊳ – markiert Ende einer Bandinschrift<br />

• ⊳ ′ – siehe weiter unten...<br />

Eine Konfiguration von M der Form (q, w1, u1, . . . , wk, uk) wird s<strong>im</strong>uliert<br />

durch eine Konfiguration von M ′ der Form (q, ⊲, w ′ 1 u1 ⊳ w ′ 2 u2 ⊳ . . . w ′ k uk ⊳ ⊳).<br />

Dabei entsteht w ′ i aus wi wie folgt: ⊲ wird durch ⊲ ′ und σi (letztes Symbol<br />

von wi) durch σi ersetzt, ⊳⊳ signalisiert das Ende des Strings von M ′ .<br />

Anfang der S<strong>im</strong>ulation: Die Eingabe ⊲x wird geändert in ⊲⊲ ′ x⊳⊲ ′ ⊳ . . . ⊲ ′ ⊳<br />

<br />

k−1 mal<br />

⊲ ′ ⊳ steht für ein leeres i-tes Band, i ≥ 2. Diese Eingabeänderung kann erreicht<br />

werden durch: ⊲⊔x (Verschieben, siehe frühere Maschinen) und Schreiben<br />

von ⊲ ⊲ ′ x. Dies erfordert 3 + 1 + 2(k − 1) = 2(k + 2) neue Zustände.<br />

Ein Übergang von M wird <strong>im</strong> wesentlichen durch zwei Scans von links nach<br />

rechts und <strong>zur</strong>ück in M ′ s<strong>im</strong>uliert.<br />

• Be<strong>im</strong> ersten Scan merkt sich M ′ die markierten Symbole (σi entspricht<br />

i-ter Kopf liest σi). Ein Zustand in M ′ ist [q, σ1, . . . , σk], wobei q der<br />

Originalzustand aus M ist.<br />

• Be<strong>im</strong> zweiten Scan wird in Übereinst<strong>im</strong>mung mit der Übergangsfunktion<br />

δ von M <strong>im</strong> i-ten Bandabschnitt σi überschrieben und entsprechend<br />

der Kopfbewegung ein neues Zeichen markiert.<br />

Problem: Falls <strong>im</strong> i-ten Bereich der i-te Kopf über das bisherige Ende hinaus<br />

will, d. h. der Kopf zeigt <strong>im</strong> i-ten Band der Originalmaschine M auf ⊔.<br />

Hierzu markiere an all diesen Stellen das ” Bandende“ <strong>im</strong> Bereich mit ⊳ ′ . Für<br />

jede dieser Stellen muß dann ein ⊔ eingefügt werden und der Rest um eine<br />

Position nach rechts verschoben (analog zu unserer ersten Maschine).<br />

Die S<strong>im</strong>ulation fährt solange fort, bis M hält. Dann löscht M ′ alle Teilstrings<br />

bis auf den letzten und hält.<br />

Aufwand bei Eingabe von x: M hält innerhalb Zeit f(|x|), d. h. auf keinem<br />

Band von M steht ein Wort länger als f(|x|), da in dieser Zeit höchstens<br />

f(|x|) Symbole betrachtet und geschrieben werden können. Also ist die<br />

Länge des Strings auf Band von M ′ ≤ k(f(|x|) + 1) + 2 (wegen der zusätzlichen<br />

⊳’s und ⊲ am Anfang). Das heißt, daß für die beiden oben erwähnte<br />

Scans 4k(f(|x|) + 1) + 8 Schritte benötigt werden.<br />

Mit dem Einfügen von problematischen ” ⊔“ ’s in jedem der k Teilbereiche<br />

summieren sich die Anzahl der Schritte auf 2k(k(f(|x|) + 1)) + 2), d. h., es<br />

werden O(k 2 f(|x|) 2 ) Schritte in M ′ für jeden Schritt in M benötigt.<br />

Da k aber konstant und unabhängig von |x| ist, ist der Gesamtzeitbedarf in<br />

O(f(|x|) 2 . q.e.d.<br />

Bemerkung: Dieses Theorem demonstriert also, daß die Hinzunahme einer<br />

beschränkten (konstanten) Anzahl von Bändern die Effizienz der Berechnung<br />

höchstens polynomiell beeinflußt.<br />

⊳.


2 TURING-MASCHINE 18<br />

2.4 Lineare Beschleunigung (Linear Speedup)<br />

Das folgende Theorem spricht für die Stärke der O-Notation, in der konstante<br />

Faktoren keine Rolle spielen.<br />

Theorem 2.2 Sei L ∈ TIME (f(n)). Dann gibt es für jedes ɛ > 0 eine<br />

Funktion f ′ (n) = ɛf(n) + n + 2 mit L ∈ TIME (f(n) ′ ).<br />

Beweis: Sei M = (K, Σ, δ, s) eine k-Band-Turing-Maschine, die L in f(n)<br />

Schritten entscheidet. Wir konstruieren eine k ′ -Band-Turing-Maschine M ′ =<br />

(K ′ , Σ ′ , δ ′ , s ′ ), die L in f ′ (n) Schritten entscheidet.<br />

Setze k ′ <br />

2 k = 1<br />

=<br />

k sonst<br />

m sei eine Zahl, die nur von M und ɛ abhänge.<br />

Der Trick wird sein, daß Wörter der Länge m zu einem Symbol in Σ ′ kodiert<br />

werden, und zahlreiche Bewegungen von M auf Strings mit wenigen<br />

Bewegungen in M ′ s<strong>im</strong>uliert werden.<br />

Setze Σ ′ = Σ ∪ [Σ m ] mit [Σ m ] = {[σ1, . . . , σm]|σi ∈ Σ}<br />

⊲ x1<br />

♦<br />

M<br />

δ<br />

✠<br />

⊲ ⊔ . . .<br />

☛<br />

⊲ ⊔ . . .<br />

. . . xn ⊲ x1 . . . xn ⊲ ⊔ . . .<br />

✯<br />

⊲ y1<br />

δ ′<br />

. . .<br />

⊲ ⊔ . . .<br />

M ′<br />

y ⌈ n<br />

m ⌉<br />

Hierbei ist yi = [x (i−1)(m+1), . . . , x<strong>im</strong>] mit xn+1 = · · · = x m·⌈ n<br />

m ⌉ = ⊔ für<br />

m | n.<br />

Anfangs liest M ′ jeweils m Symbole von x σ1, . . . , σm und schreibt dann<br />

das Symbol [σ1, . . . , σm] auf das zweite Band. Das wird erreicht, indem K ′<br />

Zustände der Form K × Σ i , i = 1, . . . , m − 1 zugefügt werden. (q, σ1, . . . , σi)<br />

bedeutet <strong>im</strong> Zustand q von M und σ1 bis σi gelesen. Falls |x| kein Vielfaches<br />

von m ist, werden Blanks hinzugenommen.<br />

Nach m + 2 Schritten enthält das zweite Band von M ′ den konzen-<br />

|x|<br />

m<br />

trierten Input. Auf Band 1 in M ′ wird nach x ein ⊲ geschrieben als neue<br />

Bandbegrenzung, die nach links nicht überschritten werden kann. Es bietet<br />

sich folgende Situation:


2 TURING-MASCHINE 19<br />

nur Blanks<br />

⊲ x1 . . . xn ⊲ ⊔<br />

✯<br />

. . ✎.<br />

✠<br />

⊲ y1<br />

δ ′<br />

. . .<br />

⊲ ⊔ . . .<br />

✮<br />

yl<br />

konzentriert<br />

Band 2<br />

übrige Bänder (leer)<br />

Wir betrachten nun das Band 2 als Eingabeband und alle anderen Bänder<br />

als Arbeitsbänder. Alle Bänder werden nur noch mit m-Tupeln beschrieben.<br />

M ′ wird nun m Schritte von M in weniger als 6 Schritten s<strong>im</strong>ulieren.<br />

Man kann sich das so vorstellen, daß jeweils m Stellen hintereinander auf<br />

einem beliebigen Band wie eine neue Stelle aufgefasst werden:<br />

m m m<br />

⊲ A C B<br />

✻<br />

Kopf<br />

✻<br />

Kopf<br />

✲<br />

nach m Schritten<br />

von M<br />

✲ ⊲ A B C<br />

jeweils m<br />

Symbole dick<br />

Die Köpfe von M ′ zeigen nun allerdings auf m-Tupel. Wir müssen uns die<br />

Position innerhalb der m-Tupel merken. Das heißt, daß die Zustände nun<br />

von der Form (q, j1, . . . , jk), q ∈ K, ji ≤ m sind, wobei ji die genaue Position<br />

des Kopfes auf dem i-ten Band angibt.<br />

Situation auf Band i:<br />

A B C<br />

x ji<br />

✻<br />

i-ter L/S<br />

von M ′<br />

✲<br />

A B C<br />

x ji neu<br />

Wenn M nun m Schritte ausführt, dann wird M ′ auf Band i höchstens die<br />

Tupel A, B und C verändern. Dazu reicht es, daß K ′ Zustände hat, die<br />

sich dies alles merken können. K ′ umfaßt alle Zustände K × {1, . . . , m} k ×<br />

[σ 3mk ], d. h. für jeden Zeitpunk cm der Berechnung in M enthält (nach der<br />

Anfangsphase) M ′ eine genaue Beschreibung der Konfiguration von M.<br />

Auf jedem Band i geht nun der entsprechende L/S-Kopf um eine Position<br />

nach links und korrigiert dort das m-Tupel, dann geht er in die Mitte sowie


2 TURING-MASCHINE 20<br />

nach rechts und wandert schließlich auf das korrekte Endtupel. Bewegungen<br />

der Köpfe in M ′ sind max<strong>im</strong>al folgende: ←, →, →, ←, ←.<br />

Nach den drei Schritten mit Bewegungen ←, →, → (bzw. –, falls ein ← oder<br />

→ nicht möglich) hat M ′ alle Informationen, die in M nötig sind, um m<br />

Schritte in M auszuführen. Diese Information wird von M ′ in einem Zustand<br />

gemerkt (K × {1, . . . , m} × Σ 3mk ⊆ K ′ ) und für die höchstens drei letzten<br />

Schritte der S<strong>im</strong>ulation benutzt.<br />

Wenn schließlich M die Eingabe akzeptiert oder <strong>zur</strong>ückweist, so tut M ′<br />

dasselbe.<br />

Die Schrittzahl von M ′ <br />

f(|x|)<br />

bei Eingabe x ist höchstens |x| + 2 + 6 m . Mit<br />

m = <br />

6<br />

ɛ folgt das Theorem. q.e.d.<br />

Bemerkungen:<br />

1. In gewisser Weise sagt das Theorem, daß erhöhter Hardwareeinsatz<br />

die Konstanten bedeutungslos machen kann. Daher die Begründung<br />

für die O-Notation. Allerdings kann der ” Hardwareaufwand“ enorm<br />

werden. Die Anzahl der Zustände von M muß mit einem Faktor ≥<br />

m k | | 3mk multipliziert werden.<br />

2. Normalerweise sind nur Zeitfunktionen f mit f(n) ≥ n interessant, da<br />

zumindest der Input gelesen werden sollte.<br />

3. Ist f(n) = cn mit c > 1, dann sagt das Theorem, daß c beliebig nahe<br />

an 1 herankommen kann.<br />

4. Wenn f(n) superlinear (etwa 4n 2 + 5n), dann sagt das Theorem, daß<br />

wir beliebigen linearen Speedup (Beschleunigung) erreichen können.<br />

5. Falls L in polynomieller Zeit entscheidbar, dann ist L ∈ TIME (n k )<br />

für ein k ≥ 1<br />

6. P = ∞<br />

k=1 TIME (nk ) ist die Klasse aller in polynomieller Zeit entscheidbaren<br />

Sprachen.<br />

2.5 Platzschranken<br />

Bisher haben wir bei Berechnungen den nötigen Speicherplatz nicht beachtet.<br />

Betrachte etwa folgende Berechnung:<br />

Start = (s, ⊲, x, ⊲, ɛ, . . . , ⊲, ɛ)<br />

M ∗<br />

→ (H, w1, u1, . . . , wk, uk) = Ende<br />

Da (nach unserer Definition) die Bandinhalte der Turingmaschine sich<br />

während einer Berechnung niemals verkürzen (Blanks ⊔“ werden gezählt),<br />

”<br />

erscheint als Platzbedarf k i=1 |wiui| sinnvoll zu sein. Es zeigt sich, daß dies<br />

eine nicht sinnvolle Überbewertung darstellt.


2 TURING-MASCHINE 21<br />

Definition 2.8 Sei M eine Turing-Maschine mit k Bändern.<br />

1. Band 1 ist das Eingabeband, von dem nur gelesen wird, d. h. gelesene<br />

Symbole σ werden wieder mit sich selbst überschrieben. Außerdem<br />

soll der L/S-Kopf des ersten Bandes nicht in den Bereich der Blanks<br />

hineinwandern (wird ⊔ gelesen, dann D1 =←)<br />

2. Band k ist nur Ausgabeband, auf dem der L/S-Kopf nie nach links<br />

bewegt wird (d. h. Dk =←).<br />

Eine derartige Turing-Maschine heißt Turing-Maschine mit Ein- und Ausgabe<br />

(TM mit E/A).<br />

Satz 2.1 Jede k-Band-Turing-Maschine M, die in Zeit f(n) arbeitet, kann<br />

durch eine (k + 2)-Band-Turing-Maschine mit E/A M ′ in Zeit O(f(n)) s<strong>im</strong>uliert<br />

werden.<br />

Beweis: M ′ kopiert die Eingabe auf Band 2 und arbeitet dann auf den<br />

Bändern 2 bis k + 1 wie M. Nach einem ” Stop“ von M kopiert sie die<br />

Ausgabe auf Band k + 2. q.e.d.<br />

Definition 2.9 Es gelte für eine k-Band-Turing-Maschine M bei Eingabe<br />

M ∗<br />

x (s, ⊲, x, ⊲, ɛ, . . . , ⊲, ɛ) → (H, w1, u1, . . . , wk, uk) mit H ∈ {h, yes“, no“}<br />

” ”<br />

1. Falls M eine Turing-Maschine mit Ein- und Ausgabe ist, dann ist der<br />

Speicherbedarf von M bei Eingabe von x k−1 i=2 |wiui|.<br />

Falls M keine Turing-Maschine mit Ein- und Ausgabe ist, dann ist<br />

der Speicherbedarf k i=1 |wiui|.<br />

Falls für ein f : N → N für alle Eingaben x der Speicherbedarf ≤<br />

f(|x|) ist, dann arbeitet M mit Platzbedarf f(n) (oder einfach mit<br />

Platz f(n))<br />

2. Sei L eine Sprache. L ∈ SPACE (f(n)) ⇔<br />

∃ Turing-Maschine mit Ein- und Ausgabe (TM mit E/A) M, die L<br />

entscheidet und mit Platz f(n) arbeitet. SPACE ist eine Platzkomplexitätsklasse.<br />

Es gibt Sprachen, die in SPACE (log n) liegen. REACHABILITY liegt z. B.<br />

in SPACE (log 2 n).<br />

Analog zum Linearen Speedup gibt es<br />

Theorem 2.3 Sei L ∈ SPACE (f(n)). Dann gilt für alle ɛ > 0: L ∈ SPACE<br />

(2 + ɛf(n)).<br />

Beweis: ähnlich zu Beweis von Theorem 2.2 (Seite 18).


2 TURING-MASCHINE 22<br />

2.6 Random Access Machine (RAM)<br />

Obwohl die Turing-Maschine ein ausreichendes Modell für Berechnungen<br />

aller Art ist (Churche These), erscheint sie für Algorithmen, wie wir sie in<br />

der Praxis lösen wollen, als reichlich unhandlich.<br />

Es hat daher verschiedene Bemühungen gegeben, Modelle von Maschinen<br />

zu entwickeln, die unserem Verständnis von Computern näherstehen. Ein<br />

solches Modell, das sich durchgesetzt hat, ist die Random Access Machine<br />

(RAM).<br />

Eine ihrer vielen ähnlichen Versionen soll hier kurz vorgestellt werden:<br />

Register<br />

0<br />

1<br />

2<br />

RAM Programm<br />

0 π0<br />

1 π1<br />

2<br />

. . .<br />

Die Register sind mit 0, 1, . . . , i, . . . durchnummeriert. Sie sind für die jeweilige<br />

Berechnung endlich, es gibt aber beliebig viele. Jedes Register kann<br />

beliebig große ganze Zahlen enthalten (Register i enthält ri ∈ Z).<br />

Das Programm ist eine Folge von Instruktionen Π = (π1, . . . , πm). κ ist ein<br />

Befehlszähler, der nach Ausführung eines Befehls, der kein Sprung und kein<br />

Halt ist, inkrementiert wird. Nach einem Sprung ist κ := j (wobei j die<br />

Sprungadresse angibt), nach einem Halt wird κ := 0 gesetzt. Im Berechnungsverlauf<br />

wird die jeweils aktuelle Instruktion (Befehl) πκ ausgeführt.<br />

Eine Eingabe ist ein Tupel I = (i1, . . . , in) mit ij ∈ Z in Register j. Die<br />

Länge von I ist n<br />

j=1 ⌈log(|ij| + 1)⌉<br />

Befehlssatz<br />

Instruktion Operand Semantik<br />

READ j r0 := ij<br />

READ<br />

STORE<br />

↑ j<br />

j<br />

r0 := irj<br />

rj := r0<br />

STORE<br />

LOAD<br />

↑ j<br />

x<br />

rrj := r0<br />

r0 := x<br />

ADD x r0 := r0 + x<br />

SUB<br />

HALF<br />

x r0 := r0 − x<br />

r0 := JUMP j<br />

r0<br />

2<br />

κ := j<br />

JPOS j if r0 > 0 then κ := j else κ := κ + 1<br />

JZERO j if r0 = 0 then κ := j else κ := κ + 1<br />

JNEG j if r0 < 0 then κ := j else κ := κ + 1<br />

HALT κ := 0<br />

m<br />

πm


2 TURING-MASCHINE 23<br />

Zusammenhang mit Turing-Maschine:<br />

1. Sei L ∈ TIME (f(n)). Dann gibt es ein RAM-Programm, das<br />

<br />

1 x ∈ L<br />

χL(x) =<br />

0 sonst<br />

in O(f(n)) berechnet.<br />

2. Falls ein RAM-Programm Π eine Funktion ϕ in Zeit f(n) berechnet,<br />

dann gibt es eine 7-Band-Turing-Maschine, die ϕ in Zeit O(f(n) 3 )<br />

berechnet.<br />

2.7 Nichtdeterministische Maschinen<br />

Nichtdeterministische Maschinen spielen für die Charakterisierung und Klassifizierung<br />

von Problemen eine große Rolle. Sie sind aber ein unrealistisches<br />

Modell für Berechnungen.<br />

Definition 2.10 Eine Nichtdeterministische Turing-Maschine ist ein Viertupel<br />

N = (K, Σ, ∆, s). Dabei sind K, Σ und s wie bei der deterministischen<br />

Turing-Maschine definiert. ∆ ist eine Übergangsrelation:<br />

∆ ⊆<br />

<br />

K × Σ k<br />

×<br />

<br />

(k ∪ {h, ” yes“, ” no“}) × (σ × {→, −−, ←}) k<br />

In diesem Abschnitt wird nur mit der 1-Band-Turing-Maschine gearbeitet.<br />

Nichtdeterministisch heißt, daß es statt eines legalen Übergangs mehrere<br />

oder gar keinen Übergang geben kann.<br />

Für gegebenes q ∈ K und σ ∈ Σ ist<br />

bzw.<br />

∆(q, σ) ∈ P ((k ∪ {h, ” yes“, ” no“}) × Σ × {→, −−, ←})<br />

∆(q, σ) = {δ1(q, σ), . . . , δr(q, σ)}<br />

mit δi wie bei deterministischen Maschinen und r abhängig von q und σ<br />

(∆(q, σ) = {(p1, ρ1, D1), . . . , (pr, ρr, Dr)})<br />

Definition 2.11 Eine Konfiguration A = (q, w, u) erzeugt eine Konfiguration<br />

B = (q, x, y) :⇔<br />

A geht über zu B gemäß einem δi(q, σ) ∈ ∆(q, σ) (wie bei deterministischen<br />

Maschinen bezüglich δi).<br />

Dies wird auch geschrieben als: A = (q, w, u) N → (q, x, y) = B<br />

N k N ∗<br />

→ sowie → werden auch analog zu deterministischen Maschinen definiert.<br />

N k<br />

Aber: → ist nun keine Funktion mehr.<br />

Wie löst nun so eine nichtdeterministische Maschine Probleme?


2 TURING-MASCHINE 24<br />

Definition 2.12 Eine Nichtdeterministische Turing-Maschine N akzeptiert<br />

eine Sprache L :⇔<br />

x ∈ L ⇔ ∃w, u ∈ Σ ∗ mit (s, ⊲, x)<br />

N ∗<br />

→ ( ” yes“, w, u)<br />

Definition 2.13 Eine nichtdeterministische Turing-Maschine N akzeptiert<br />

eine Sprache L in Zeit f(n) :⇔ N akzeptiert L und<br />

∀x ∈ Σ ∗ gilt: falls (s, ⊲, x)<br />

N k<br />

→ (q, u, w) dann ist k ≤ f(|x|)<br />

Diese Definition bedeutet, daß keine Berechnungen länger als f(n), n Länge<br />

der Eingabe, stattfinden.<br />

Unterschiede <strong>zur</strong> deterministischen Berechnung:<br />

• Asymmetrie zwischen ” yes“ und ” no“: Eine nichtdeterministische<br />

Turing-Maschine akzeptiert eine Eingabe x nicht, wenn es keine Berechnung<br />

gibt, die <strong>im</strong> Zustand ” yes“ endet.<br />

• Die Berechnung einer nichtdeterministischen Turing-Maschine stellt<br />

einen Berechnungsbau dar:<br />

❡<br />

❡<br />

❡ Startkonfiguration S<br />

✎☞ ✎☞<br />

A1 A2<br />

✍✌ ✍✌<br />

❡<br />

❡<br />

✎☞ ✎☞ ✎☞<br />

C1 C2 C3<br />

✍✌ ✍✌ ✍✌<br />

❡<br />

❡ ❡ ❡<br />

Es gilt: S N → A1, S N → A2, A2 N → C1, A2 N → C2, A2 N N 2<br />

→ C3 und S → C3.<br />

Die Zeit <strong>zur</strong> Berechnung entspricht der Tiefe des Baums. Nichtdeterministische<br />

Berechnung in Zeit f(n) kann unter Umständen tatsächlichem<br />

(deterministischen) Rechenaufwand von exponentiellen Aufwand<br />

darstellen.<br />

Neue Komplexitätsklasse: NTIME (f(n)) = {L ⊆ Σ∗ |L wird von einer<br />

nichtdeterministischen Turingmaschine N in Zeit f(n) akzeptiert}.<br />

Die wichtigste Klasse ist NP = <br />

j>0 NTIME (nj ).<br />

Natürlich gilt: P ⊆ NP, weil die deterministischen Turing-Maschinen eine<br />

Unterklasse der nichtdeterministischen Turiung-Maschinen bilden, in der ∆<br />

gerade eine Funktion ist.


2 TURING-MASCHINE 25<br />

Beispiel: TSP (D) mit Schranke D. Gegeben sei eine nichtdeterministische<br />

Turingmaschine N mit zwei Bändern:<br />

• Band 1: Das Eingabeband mit der Beschreibung des Problemfalls, auf<br />

dem die Städte mit Entfernungen sowie die Schranke D stehen. Die<br />

Länge der Beschreibung sei n.<br />

• Band 2:<br />

Phase 1: Beschreibe das Band mit beliebigem Wort w, |w| ≤ n. Dies<br />

geschieht in Zeit O(n).<br />

Phase 2: Teste, ob w eine Tour beschreibt (d. h. Permutation). Zeitbedarf<br />

hier: O(n 2 ).<br />

Phase 3: Falls Tour beschrieben wurde:<br />

1. Aufaddieren der Distanzen. Zeitbedarf: O(n 2 ).<br />

2. Falls Summe ≤ D, Übergang zu Zustand ” yes“, sonst: ” Abbruch“<br />

der Berechnung (Übergang in ” no“ oder einfach in einen Zustand<br />

von dem es nicht weiter geht).<br />

Diese Maschine entscheidet TSP(D). Falls es eine Tour der Länge ≤ D gibt,<br />

dann kann N eine solche Berechnungsfolge erzeugen und <strong>im</strong> Zustand ” yes“<br />

halten, und zwar mit einer Folge von Konfigurationen, die nicht länger als<br />

O(n 2 ) ist bei Eingaben der Länge n. Falls es keine Tour mit Länge ≤ D gibt,<br />

dann findet die Maschine keine Berechnungsfolge von Konfigurationen, die<br />

mit Zustand ” yes“ enden.<br />

Das Problem ist nun: Wie komme ich von einer polynomiellen nichtdeterministischen<br />

Berechnung zu einer möglicherweise schnellen deterministischen<br />

Berechnung?<br />

Nach heutigem Kenntnisstand können wir etwa zu obigem nichtdeterministischen<br />

Algorithmus für TSP(D) keinen deterministischen polynomiellen<br />

Algorithmus angeben.<br />

Folgendes Resultat liegt derzeit vor:<br />

Theorem 2.4 Sei L ∈ NTIME (f(n)). Dann kann L von einer deterministischen<br />

Turingmaschine in O(c f(n) ) für eine Konstante c > 1 entschieden<br />

werden.<br />

Beweisskizze (nur Idee):<br />

1. Gehe systematische alle Berechnungspfade des Baums durch.<br />

2. Sei d max<strong>im</strong>aler Verzweigungsgrad, d ≥ 2 und d konstant.<br />

3. An jedem Knoten kann man damit der Wahl des Weges eine Zahl<br />

i, 1 ≤ i ≤ d zuordnen.


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 26<br />

4. Das heißt: (i1, i2, . . . , ir) stellt Berechnungspfad der Länge r dar. Da<br />

die nichtdeterministische Turing-Maschine nach ≤ f(|x|) Schritten<br />

auf einem Berechnungspfad anhält, ist r ≤ f(|x|). Gehe jeweils soweit<br />

<strong>zur</strong>ück in (i1, . . . , ir), daß ein ij erhöht werden kann, d. h. zuerst<br />

(1, 1, . . . , 1), dann (1, 1, . . . , 1, 2), usw.<br />

Das heißt: f(|x|)<br />

t=1 dt ∈ O(d f(|x|)+1 )<br />

Definition 2.14 Eine nichtdeterministische Turing-Maschine N = (K, Σ,<br />

∆, s) mit Ein- und Ausgabe akzeptiert eine Sprache L mit Platzbedarf f(n)<br />

⇔ N akzeptiert L und<br />

∀x ∈ (Σ\{⊔}) ∗ gilt: falls (s, ⊲, x, ⊲, ɛ, . . . , ⊲, ɛ)<br />

dann<br />

k−1<br />

|wiui| ≤ f(|x|)<br />

i=2<br />

N ∗<br />

→ (q, w1, u1, . . . , wk, uk)<br />

Das heißt also, N benötigt auf ihren Arbeitsbändern 2, . . . , k − 1 niemals<br />

mehr als f(|x|) Platz. Es wird dabei noch nicht einmal verlangt, daß N<br />

überhaupt hält bei allen Eingaben!<br />

Beispiel: REACHABILITY hat deterministischen Platz O(log 2 n) und<br />

nichtdeterministischen Platz O(log n) (ohne Beweis!).<br />

3 Beziehungen zwischen Komplexitätsklassen<br />

3.1 Komplexitätsklassen<br />

Komplexitätsklassen sind spezifiziert durch:<br />

• Berechnungsmodell: Turing-Maschine, RAM, u. a.<br />

• Art der Berechnung: deterministisch, nicht deterministisch, (randomistisch,<br />

parallel)<br />

• Maße: Zeit, Platz<br />

• Schranken: Funktionen f : N → N<br />

Es hat sich gezeigt, daß man für Schranken Komplexitätsfunktionen wählen<br />

sollte, die in gewisser Weise sinnvoll oder passend sind. Zum Beispiel kann<br />

man Funktionen definieren, die selbst nicht einmal in dem Platz oder der Zeit<br />

berechnet werden können, die sie selbst beschreiben. Oder auch sonderbare<br />

Funktionen wie<br />

f(n) =<br />

2 n falls n Pr<strong>im</strong>zahl<br />

die kleinste Zahl mit irgendeiner Eigenschaft sonst


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 27<br />

Nicht einmal berechenbar ist beispielsweise: χL mit L nicht entscheidbar.<br />

Das kann zu sehr merkwürdigen Ergebnissen führen (Später: Theorem 3.3).<br />

Daher schränken wir uns ein.<br />

Definition 3.1 f : N → N heißt eigentliche (proper) Komplexitätsfunktion<br />

⇔<br />

1. ∀n ∈ Nf(n) ≤ f(n + 1)<br />

2. Es gibt eine k-Band-Turing-Maschine mit E/A Mf = (K, Σ, δ, s) derart,<br />

daß für jede Eingabe x mit |x| = n gilt:<br />

(s, ⊲, x, ⊲, ɛ, . . . , ⊲, ɛ) M t f<br />

→ (h, ⊲, x, ⊲, ⊓ i2 ik−1 f(n)<br />

, . . . , ⊲, ⊓ , ⊲, ⊓ )<br />

mit t ∈ O(n + f(n)) und ij ∈ O(f(n)), j = 2, . . . , k − 1.<br />

(t und ij hängen nur von der Länge der Eingabe ab).<br />

Das heißt, Mf berechnet für jede Eingabe x einen String von Quasi-Blanks<br />

⊓ f(|x|) in O(|x| + f(|x|)) Schritten und O(f(|x|)) Platz.<br />

Bemerkungen:<br />

• Eigentliche Komplexitätsfunktionen sind beispielsweise: f(n) = c =<br />

konstant, f(n) = n, f(n) = ⌈log n⌉, f(n) = n log n und f(n) = n 3 .<br />

Falls f(n) /∈ N, dann ist ⌈f(n)⌉ gemeint.<br />

• Sind f, g eigentliche Komplexitätsfunktionen, dann sind auch f + g,<br />

f · g, 2 g eigentliche Komplexitätsfunktionen.<br />

• Eigentliche Komplexitätsfunktionen sind auch √ n und n!.<br />

Für eigentliche Komplexitätsfunktionen gelten <strong>im</strong> weiteren die Klassen:<br />

• TIME (f) – deterministische Zeit<br />

• SPACE (f) – deterministischer Platz<br />

• NTIME (f) – nichtdeterministische Zeit<br />

• NSPACE (f) – nichtdeterministischer Platz<br />

f ist nicht nur spezielle Funktion, machmal sind auch Familien von Funktionen<br />

gemeint, parametrisiert durch k:<br />

• P = TIME (n k ) = <br />

j>0 TIME (nj )<br />

• NP = NTIME (n k ) = <br />

j>0 NTIME (nj )<br />

Weitere Klassen von Funktionen sind:


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 28<br />

• PSPACE = SPACE (n k ) = <br />

j>0 SPACE (nj )<br />

• NPSPACE = NSPACE (n k ) = <br />

j>0 NSPACE (nj )<br />

• EXP = <br />

j>0 TIME (2nj)<br />

• L = SPACE (log n)<br />

• NL = NSPACE (log n)<br />

Komplemente von nichtdeterministischen Klassen: Wir haben<br />

schon und werden noch sehen, daß es gravierende Unterschiede bei nichtdeterministischen<br />

Berechnungen bezüglich der Endzustände ” yes“ und ” no“<br />

gibt.<br />

Definition 3.2 (Komplement einer Sprache) Sei L ⊆ Σ ∗ eine Sprache.<br />

Das Komplement zu L ist ¯ L = Σ ∗ \L.<br />

Bei Entscheidungsproblemen PROB gibt es das Komplement PROB. Ein<br />

Fall F in PROB hat die Antwort ” ja“ genau dann, wenn der Fall F in<br />

PROB die Antwort ” nein“ hat.<br />

Beispiel: TSP(D). Das Komplement zu TSP(D) hat die Fragestellung:<br />

Gilt für alle Touren, daß sie Länge > D haben?<br />

Komplement von REACHABILITY: Fragestellung hier: Ist Knoten n von 1<br />

nicht erreichbar?<br />

Seien ein Problem PROB, ein Fall F kodiert als F ∈ Σ ∗ und eine Fragestellung<br />

gegeben: LPROB = {F |Antwort von F : ” ja“}. Das Komplement ist:<br />

¯LPROB = {w|w /∈ LPROB}. w ist dabei Beschreibung von Fällen mit Antwort<br />

” nein“ und von Wörtern, die überhaupt keine Fälle beschreiben.<br />

Streng gesehen gilt: LPROB = ¯ LPROB. Es gilt nur: LPROB ⊆ ¯ LPROB. Dies<br />

wird aber keine Rolle spielen.<br />

Definition 3.3 Sei C eine Komplexitätsklasse (Menge von Sprachen). Definiere<br />

das Komplement dieser Komplexitätsklasse mit co-C = { ¯ L | L ∈ C<br />

}.<br />

Deterministischen Klassen sind unter dem Komplement abgeschlossen, d. h.<br />

C = co-C. Sowohl bei Zeit- als auch bei Platzschranken können wir aus einer<br />

deterministischen Turing-Maschine T eine Maschine ¯ T konstruieren, bei der<br />

die Rollen von ” yes“ und ” no“ in T gerade vertauscht werden.<br />

Der Komplementabschluß bei nichtdeterministischen Platz folgt demnächst,<br />

bei nichtdeterministischer Zeit ist er ein offenes Problem.


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 29<br />

3.2 Hierarchiesätze<br />

Sie kennen unter Umständen die Chomsky-Hierarchie REG < KFR < K<strong>SS</strong><br />

< REKURSIVAUFZ. Hier geht es um quantitative Hierarchien f(n) ≥ n,<br />

f(n) eigentliche Komplexitätsfunktion. Es werden nur eigentliche Komplexitätsfunktionen<br />

f(n) mit f(n) ≥ n betrachtet (Ausnahme: Theorem 3.3)<br />

Definition 3.4 (Haltesprache) Eine Haltesprache Hf ist wie folgt definiert:<br />

Hf = {M; x|M ist Beschreibung einer deterministischen Turing-Maschine<br />

M akzeptiert x in höchstens f(|x|) Schritten}<br />

Das heißt, wir betrachten alle Beschreibungen von Turing-Maschinen. Dabei<br />

nehmen wir an, unser Alphabet Σ sei groß genug: 0, 1, ” (“, ” ;“, usw. seien<br />

Symbole aus Σ.<br />

Wie kann man nun eine Turing-Maschine für Hf konstruieren?<br />

Einschub: Eine angemessene einheitliche Kodierung der Beschreibung<br />

von Turing-Maschinen ist: M = (K, Σ, δ, s) mit:<br />

• Σ = {1, . . . , |Σ|} (Zahlen, alle binär)<br />

• K = {|Σ| + 1,<br />

|Σ| + 2, . . . , |Σ| + |k|}<br />

<br />

≡s<br />

• Zahlen |k| + |Σ| + 1, . . . , |k| + |Σ| + 6 für spezielle Symbole ←, →, –, h,<br />

” yes“, ” no“<br />

• alle verwendeten Zahlen werden dargestellt durch Strings der Länge<br />

⌈log(|k| + |Σ| + 6)⌉ Bits mit führenden Nullen<br />

• δ wird dargestellt als Sequenz von Paaren ((q, σ1, . . . , σk), (p, ρ1, D1,<br />

ρ2, D2, . . . , ρk, Dk ))<br />

• ” (“ und ” )“ sind als Symbole vorhanden<br />

Das heißt also, daß ein String M = (|Σ|)(|K|)δ ∈ Σ eine Turing-Maschine<br />

beschreibt.<br />

Für die folgende Sätze und Lemmata benötigen wir noch eine universelle<br />

Turing-Maschine U, die sämtliche Turing-Maschinen M s<strong>im</strong>ulieren kann.<br />

Dabei wird die Beschreibung vom jeweiligen M mit einer Eingabe x kombiniert<br />

(M; x) und als Eingabe von U verstanden: U(M; x) = M(x).<br />

S<strong>im</strong>ulation eines Schrittes von M ((q, w, u) M → (p, w ′ , u ′ )) auf U wie folgt:<br />

U ∗<br />

(s<strong>im</strong>, ⊲, M; x, ⊲w, q; u) → (s<strong>im</strong>, ⊲, M; x, ⊲w ′ , p; u ′ ). U kennt das letzte Symbol<br />

von w und den Zustand q von M. U sucht in der Beschreibung von M den


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 30<br />

Übergang δ(q, σ) = (p, ρ, D) und ändert den String auf dem zweiten Band<br />

entsprechend.<br />

S<strong>im</strong>ulationsidee (1-Band-Turing-Maschine auf 2-Band-Turing-Maschine):<br />

Lemma 3.1 Hf ∈ TIME (f(n) 3 )<br />

Beschreibung von<br />

M und Eingabe x<br />

⊲ M; x<br />

❨<br />

δ<br />

⊲ w ′ ❘<br />

σ q u<br />

enthält Beschreibung der errechneten<br />

Konfiguration in M<br />

Beweisskizze: Konstruktion einer Turing-Maschine Uf mit vier Bändern,<br />

die Hf in Zeit (f(n) 3 ) entscheidet.<br />

Uf basiert auf folgenden Maschinen:<br />

• universelle Turing-Maschine U<br />

• 1-Band-Turing-Maschine <strong>zur</strong> S<strong>im</strong>ulation von Mehrband-Turing-<br />

Maschine (Theorem 2.1)<br />

• Maschine zum linearen Speed-up<br />

• Mf , wobei Mf eine 4-Band-Turing-Maschine sei (Falls Mf mit k > 4<br />

Bändern, dann auch Uf )<br />

Arbeitsphasen von Uf :<br />

1. Band 4: mit Mf mit ⊓ f(|x|) Pseudo-Blanks füllen.<br />

2. Band 3: Kopie der Beschreibung von M; dabei Test, ob M tatsächlich<br />

eine Turing-Maschine beschreibt.<br />

Band 1: Wandle ⊲M; x zu ⊲M; ⊲x. Dadurch steht nur noch die Eingabe<br />

⊲x <strong>zur</strong> Verfügung<br />

Zeitaufwand: O(f(|x|) + n) = O(f(n))<br />

3. Uf s<strong>im</strong>uliert nun die Konfigurationen von M auf Band 2 ähnlich wie<br />

eine universelle Turing-Maschine U.<br />

Band 2:<br />

(q, ⊲w ′ 1σ1, u1, ⊲w ′ 2, . . . , ⊲w ′ k σk, uk) M → (p, ⊲x1, y1, . . . , ⊲xk, yk)<br />

gemäß δ(q, σ1, . . . , σk) = (p, ρ1, D1 . . . , ρk, Dk) alles auf einem Band<br />

gemäß Theorem 2.1.<br />

Band 3: Uf


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 31<br />

• kopiert (q, σ1, . . . , σk) hinter Beschreibung von M (Scan auf Band<br />

2)<br />

• sucht in Beschreibung von M entsprechenden Übergang (p, ρ1,<br />

D1, . . . , ρk, Dk) und kopiert ihn ans Ende (Scan Band 3)<br />

• ändert Bandinhalt 2 entsprechend (Scan Band 2)<br />

Band 4: Nach S<strong>im</strong>ulation eines Schrittes von M wird die Uhr“ um<br />

”<br />

einen Schritt nach rechts versetzt.<br />

Zeitaufwand: Für kM-Band-Maschine M O(lMk 2 Mf(|x|)), wobei lM<br />

die max<strong>im</strong>ale Länge der Beschreibung von Zuständen und Symbolen<br />

von M und kM die Anzahl der Bänder von M ist. lMk 2 M ≤ f(n), da<br />

≤ |M| ≤ n.<br />

lM k 2 M<br />

≤ lkM<br />

M<br />

Falls Uf feststellt, daß M den Input x in f(|x|) Schritten akzeptiert, dann<br />

akzeptiert Uf auch M; x. Falls M x nicht akzeptiert oder die ” Uhr“ abgelaufen<br />

ist, weist Uf den Input <strong>zur</strong>ück.<br />

Zeitaufwand: O(f(n) · f(n) 2 ) = O(f(n) 3 ).<br />

Mit dem Theorem über linearen Speed-up (Theorem 2.2) kann Uf so modifiziert<br />

werden, daß höchstens f(n) 3 Schritte benötigt werden.<br />

Lemma 3.2 Hf /∈ TIME 1 n<br />

2f(⌊ 2 ⌋) , f(n) ≥ 10n + 4<br />

Beweis: (durch Widerspruch)<br />

Angenommen, es gibt Turing-Maschine MHf , die Hf in f(⌊ n<br />

2 ⌋) entscheidet.<br />

Dann konstruiere folgende Maschine Df (Diagonalisierung):<br />

Df (M) : if MHf (M; M) = ” yes“ then ” no“ else ” yes“<br />

Falls MHf eine k-Band-Turing-Maschine ist, dann ist Df eine (k + 1)-Band-<br />

Turing-Maschine mit:<br />

1. Die Eingabe x von Band 1 wird als x; x in |x| + 1<br />

<br />

1. Kopie<br />

|x| = 3|x| + 1 Schritten auf Band 2 kopiert.<br />

<br />

2. Kopie<br />

2. Dann Rücklauf auf Band 2 in 2|x| + 1 Schritten.<br />

+ |x|<br />

<br />

<strong>zur</strong>ücklaufen<br />

Insgesamt werden also 5|x| + 2 Schritte benötigt.<br />

Dann auf den Bändern 2 bis k + 1 Arbeit wie MHf . Bei Eingabe M (Maschinenbeschreibung)<br />

mit |M| = n braucht Df also<br />

<br />

n<br />

<br />

5|M| + 2 + 1/2f ≤ 1/2f(n) + 1/2f(n) = f(n)<br />

2<br />

Schritte. Das obige ≤-Zeichen gilt, da f(n) ≥ 10n + 4 und f monoton steigende<br />

Funktion (da eigentliche Komplexitätsfunktion).<br />

Gilt: Df (Df)?<br />

+


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 32<br />

1. Df (Df) = ” yes“, d. h. Df akzeptiert die eigene Beschreibung ⇔<br />

MHf (Df; Df) = ” no“. Daraus folgt, daß Df /∈ Hf .<br />

Nach der Definition von Hf heißt das, daß Df die eigene Beschreibung<br />

Df nicht in f(n), n = |Df|, Schritten akzeptiert.<br />

Es folgt, daß das Ergebnis von Df(Df) = ” no“ ist, also ein Widerspruch<br />

existiert.<br />

2. Entsprechend ist Df (Df) = ” no“ ⇔ MHf (Df; Df ) = ” yes“.<br />

Nach der Definition von Hf wird Df in f(n) Schritten akzeptiert, also<br />

Df (Df) = ” yes“, was wiederum ein Widerspruch ist. q.e.d.<br />

Aus Lemma 3.1 und 3.2 folgt<br />

Theorem 3.1 (Zeithierachie) Sei f(n) ≥ 10n + 4 eigentliche Komplexitätsfunktion.<br />

Dann gilt<br />

TIME(f(n)) ⊂ TIME 8(f(2n + 1)) 3<br />

Es gilt allerdings nicht die Gleichheit!<br />

Korollar 3.1 P ⊂ EXP<br />

Beweis: Jedes Polynom p(n) ist irgendwann ≤ 2 n , anders ausgedrückt gibt<br />

es für alle Polynome p(n) ein n0, so daß für alle n ≥ n0 gilt: p(n) ≤ 2 n .<br />

Also ist P ⊆ TIME (2 n ).<br />

Von Theorem 3.1 wissen wird, daß<br />

TIME(2 n ) ⊂ TIME 8(2 2n+1 ) 3 = TIME 2 6n+6 ⊆ TIME<br />

d. h. P ⊂ EXP.<br />

Für den Platzbedarf gilt ähnliches wie für den Zeitbedarf:<br />

<br />

2 n2<br />

⊆ EXP<br />

Theorem 3.2 (Platzhierachie) Sei f(n) eigentliche Komplexitätsfunktion.<br />

Dann gilt:<br />

SPACE(f(n)) ⊂ SPACE(f(n) · log n)<br />

Was kann passieren, wenn f(n) nicht eigentliche Komplexitätsfunktion ist?<br />

Theorem 3.3 (Gap-Theorem) Es gibt eine rekursive Funktion f : N →<br />

N mit<br />

<br />

TIME(f(n)) = TIME 2 f(n)<br />

Beweis: Idee ist hierbei die Definition einer Funktion f(n), so daß für jede<br />

Eingabe der Länge n jede beliebige Turing-Maschine M entweder in weniger<br />

als f(n) Schritten hält oder mehr als 2 f(n) Schritte benötigt.


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 33<br />

Betrachte alle Turing-Maschinen M0, M1, M2, . . . in der lexikographischen<br />

Ordnung ihrer Kodierungen.<br />

Für beliebige i, k ≥ 0 sei folgende Eigenschaft definiert: P (i, k) heißt, daß<br />

für alle Maschinen Mj, 0 ≤ j ≤ i, gilt: Mj hält in weniger als k Schritten<br />

oder Mj hält nach mehr als 2k + 1 Schritten oder Mj hält überhaupt nicht.<br />

P (i, k) kann folgendermaßen entschieden werden: S<strong>im</strong>uliere alle Maschinen<br />

Mj, j ≤ i, auf allen Eingaben der Länge i bis zum Schritt 2k + 1.<br />

Definiere dazu f(i) für irgendein i ≥ 0 und betrachte Folge von k’s: k1 =<br />

2i, kj = 2kj−1 + 1 für j = 2, 3, . . . .<br />

Sei nun N(i) = i j=0 |Σj| i mit Σj aus Mj. N(i) ist die Anzahl aller Inputs<br />

der Länge i für die ersten i + 1 Maschinen. Jeder Input x der Länge i<br />

kann höchstens ein P (i, kj) unwahr machen (M ∈ {M0, . . . , Mi} hält auf x<br />

zwischen kj und 2kj Schritten).<br />

(*) Dann gibt es aber ein l ≤ N(i)+1, so daß P (i, kl) wahr ist. Sei f(i) = kl,<br />

d. h. P (i, f(i)) ist wahr (f(i) kann schnell wachsen!).<br />

Sei nun L ∈ TIME(2f(n) ). Das heißt, daß L von einer Turing-Maschine Mj<br />

in 2f(n) Schritten entschieden wird.<br />

Für jeden Input x mit |x| ≥ j (das sind alle bis auf endlich viele) hält Mj<br />

nicht zwischen f(|x|) und 2f(|x|) Schritten.<br />

Nun war f(n) war für n ≥ j aber gerade so definiert, daß Mj berücksichtigt<br />

wurde (siehe (*)).<br />

Da Mj aber nach höchstens 2f(|x|) Schritten hält, muß Mj bei Eingabe von<br />

|x| schon nach höchstens f(|x|) Schritten halten.<br />

Was geschieht nun mit den Inputs der Länge < j?<br />

Ändere Mj derart in M ′ j ab, daß alle Eingaben der Länge < j erkannt werden<br />

(1 Scan) und dann rückwärts das Word einlesen sowie Zustände der Form<br />

K × [Σl ], l < j, zufügen. Dies geht in 2|x| Schritten.<br />

Da f(i) ≥ 2i gilt, gilt auch TIME(f(n)) = TIME 2f(n) . q.e.d.<br />

Bemerkungen:<br />

• Beachte das Größenwachstum von f(n) und die riesige Anzahl von<br />

Zuständen von M ′ j !<br />

• Konstruktion ginge auch mit 3 f(n) und anderen schnell genug wachsenden<br />

Funktionen.<br />

• Für den Platz kann man ähnliche Resultate erzielen.<br />

3.3 Die Erreichbarkeitsmethode<br />

Das Hierachie-Theorem über deterministischen Platz und deterministische<br />

Zeit gehörten mit zu den ersten Resultaten, die in der <strong>Komplexitätstheorie</strong><br />

bewiesen wurden.


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 34<br />

Die schwierigen und wichtigen Fragen betreffen aber den Bereich determi-<br />

nistische versus nichtdeterministische Berechnung, speziell P ? = NP.<br />

Theorem 3.4 Sei f(n) eigentliche Komplexitätsfunktion. Dann gilt:<br />

1. SPACE(f(n)) ⊆ NSPACE(f(n)) und TIME(f(n)) ⊆ NTIME(f(n))<br />

2. NTIME(f(n)) ⊆ SPACE(f(n))<br />

3. ∃c > 0 NSPACE(f(n)) ⊆ TIME(c log n+f(n) )<br />

Beweis:<br />

1. Jede deterministische Turing-Maschine ist auch nichtdeterministisch<br />

(mit nur einer Wahl pro Schritt).<br />

2. Sei L ∈ NTIMEf(n). Dann gibt es (eine) nichtdeterministische Turing-<br />

Maschine M = (K, Σ, ∆, s), die L in Zeit f(n) akzeptiert.<br />

Sei d die max<strong>im</strong>ale Anzahl von Übergangsmöglichkeiten (Choices) in<br />

M (|∆(q, σ)| ≤ d, d ist eine Konstante). Die Übergangsmöglichkeiten<br />

sind dann etwa: [(p1, ρ1, D1), 0], . . . [(pd, ρd, Dd), d − 1].<br />

Die deterministische Maschine M ′ generiert jetzt eine Sequenz von<br />

Choices, die f(n) lang ist, und schreibt sie auf ein zusätzliches Band:<br />

d1, d2, . . . , d f(n), 0 ≤ di ≤ d − 1.<br />

Dann arbeitet M ′ einen Input x mit |x| = n wie M gemäß der vorgegebenen<br />

Sequenz von Choices ab.<br />

Diese S<strong>im</strong>ulation eines Berechnungspfades von M kann in Platz f(n)<br />

stattfinden, da in jedem Schritt nur ein Platz beschrieben werden kann<br />

und die Berechnungspfade von M höchstens f(n) lang sind.<br />

Es gibt aber in der Regel exponentiell viele Berechnungspfade in M.<br />

Mit Start der Auswahlsequenz 01, 02, . . . , 0 f(n) können aber auf dem<br />

Band systematisch alle Sequenzen erzeugt werden, indem <strong>im</strong>mer die<br />

jeweils vorherige Sequenz gelöscht wird.<br />

Betrachtet man Sequenz a1, . . . , a f(n) als Darstellung der Zahl<br />

f(n)<br />

i=1 aid i−1 , so entspricht das einer Addition mit 1. Dies geht in Platz<br />

O(f(n)).<br />

3. Sei M = (K, Σ, ∆, s) nichtdeterministische k-Band-Turing-Maschine<br />

mit E/A-Bändern, die L in f(n) Platz akzeptiert.<br />

Eine Konfiguration von M bei einer Eingabe x sieht folgendermaßen<br />

aus: (q, w1, u1, . . . , wk, uk) mit w1u1 = ⊲x (wegen E/A). Die Ausgabe<br />

wkuk ist uninteressant, da L entschieden wird.<br />

Diese Konfiguration kann beschrieben werden durch (2k − 2)-Tupel<br />

(q, i, w2, u2, . . . , wk−1, uk−1), wobei i die Position des ersten Kopfes<br />

auf x angibt, 0 ≤ i ≤ n = |x|.<br />

Es gibt |K| Möglichkeiten für q, n + 1 Möglichkeiten für i und


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 35<br />

≤ |Σ| (2k−2)f(n) Möglichkeiten für den Rest. Das heißt, daß die Gesamtzahl<br />

der Konfigurationen beschränkt ist durch n·c f(n) n+f(n)<br />

1 = clog 1 für<br />

eine Konstante c1, die nur von M abhängt.<br />

Sei nun G(M, x) der Konfigurationsgraph von M bei Eingabe von x,<br />

wobei die Knoten alle möglichen Konfigurationen {Ci} symbolisieren<br />

und eine Kante (C1, C2) genau dann existiert, wenn gilt: C1 M → C2.<br />

Offenbar gilt: x ∈ L ⇔ es existiert ein Weg von der Startkonfiguration<br />

C0 = (s, 0, ⊲, ɛ, . . . , ⊲, ɛ) zu einer Konfiguration der Form<br />

Ci = ( yes“, i, . . . ). Das heißt also, daß das Entscheidungsproblem,<br />

”<br />

ob x ∈ L ist, reduziert werden kann auf REACHABILITY <strong>im</strong> Gra-<br />

log n+f(n)<br />

phen G(M, x) mit c1 Knoten.<br />

Dafür gibt es aber einen polynomiellen Algorithmus mit O(m2 log m),<br />

d. h. ≤ c2m3 log n+f(n)<br />

bei Eingabe von m Knoten. Hier ist m = c , und<br />

1<br />

3 log n+f(n))<br />

≤ (c2c3 1 )(log n+f(n)) . Mit c = c2c3 1 ergibt<br />

somit c2m3 = c2c1 sich eine Laufzeit von clog n+f(n) .<br />

Jede Konfiguration von M (jeder Knoten von G(M, x)) hat die Länge<br />

O(log |K| + log n + kf(n)). Für den Erreichbarkeitsalgorithmus muß<br />

in der Kantenmenge des Graphen G(M, x) nachgesehen werden, ob<br />

eine Kante existiert. Dieses kann durch das explizite Erstellen der Adjazenzmatrix<br />

und den Zugriff auf das entsprechende Matrixelement <br />

3(log n+f(n))<br />

geschehen. Das Erstellen der Matrix benötigt O c1 Zeit.<br />

Die Adjazenzmatrix kann aber auch <strong>im</strong>plizit erstellt werden: Für je<br />

zwei Konfigurationen C und C ′ wird mit Hilfe von ∆ überprüft, ob<br />

C M → C ′ gilt. Dies dauert O(log |K| log n + kf(n)) Zeit.<br />

Insgesamt erhält man somit einen Zeitaufwand von O c log n+f(n) mit<br />

einem geeignetem c. q.e.d.<br />

Korollar 3.2 L ⊆ NL ⊆ P ⊆ NP ⊆ PSPACE<br />

Beweis: Mit Theorem 3.4: etwa NL = NSPACE (log n) ⊆ TIME (c 2 log n ) =<br />

TIME (n 2 log c ) ⊆ P.<br />

Bemerkung: Aus Theorem 3.2 folgt L = SPACE (log n) ⊂ PSPACE =<br />

SPACE (n k ). Das heißt, daß irgendwo in der obigen Hierachie ein ” echtes“<br />

Enthaltensein gilt. Wir wissen derzeit nicht wo, und vermuten, daß überall<br />

eine echte Teilmenge vorliegt.<br />

3.3.1 Nichtdeterministischer Platz<br />

Aus Theorem 3.3 folgt sofort, daß<br />

<br />

<br />

log<br />

NSPACE(f(n)) ⊆ TIME c<br />

n+f(n)<br />

log<br />

⊆ SPACE c<br />

n+f(n)


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 36<br />

Wir werden sehen, daß wir exponentiellen deterministischen Platz <strong>zur</strong> S<strong>im</strong>ulation<br />

nichtdeterministischen Platzes nicht benötigen.<br />

Folgende Definition wird noch benötigt:<br />

Definition 3.5 (PATH) Sei G = (V, E) ein Graph mit |V | = n Knoten.<br />

Seien weiterhin x, y ∈ V und i ≥ 0. Die Aussage (Prädikat) PATH (x, y, i)<br />

ist genau dann wahr, wenn ein Weg von x nach y mit einer Länge ≤ 2 i<br />

existiert.<br />

Theorem 3.5 (Savitch) REACHABILITY ∈ SPACE(log 2 n)<br />

Beweis: Sei G = (V, E) ein Graph mit |V | = n Knoten, V = {1, . . . , n}.<br />

Seien weiterhin x, y ∈ V und i ≥ 0.<br />

Da der Weg von x nach y in G höchstens Länge n zu haben braucht, können<br />

wir die Erreichbarkeit von x nach y mit PATH (x, y, ⌈log n⌉) entscheiden.<br />

Sei M eine 4-Band-Turing-Maschine mit zwei Arbeitsbändern und E/A:<br />

• Band 1 (Eingabe): Adjazenzmatrix von G<br />

• Band 2: Tripel der Form (u, v, j), wobei (x, y, i) erstes (linkestes) Tripel<br />

ist. Die Zahlen sind in Binärdarstellung.<br />

Wie entscheidet M PATH (x, y, i)?<br />

Falls i = 0 ist, ist die Länge des Weges ≤ 2 0 = 1, also ist x = y oder<br />

(x, y) ∈ E.<br />

Für i ≥ 1 gilt: Berechne PATH (x, y, i) folgendermaßen: Für alle Knoten<br />

z teste, ob PATH (x, z, i − 1) und PATH (z, y, i − 1) gilt. Falls es ein z<br />

gibt derart, daß ein Weg der Länge ≤ 2 i−1 von x nach z und von z nach y<br />

existiert, dann gibt es einen Weg der Länge ≤ 2 i−1 + 2 i−1 = 2 i von x nach<br />

y.<br />

Dazu werden alle Knoten z ∈ V nacheinander generiert, um Platz zu sparen<br />

(Band 3). Wenn ein neues z generiert ist, wird auf Band 2 (x, y, i), (x, z, i−1)<br />

hinzugefügt.<br />

Dann folgt wieder ein Test PATH (x, z, i − 1) (wieder rekursiv):<br />

Falls PATH (x, z, i − 1) = false: Lösche (x, z, i − 1) und gehe zum nächsten<br />

” z“.<br />

Falls PATH (x, z, i − 1) = true: Lösche (x, z, i − 1) und schreibe (z, y, i − 1).<br />

Teste dann PATH (z, y, i−1); falls PATH (z, y, i−1) = true: PATH (x, y, i) =<br />

true, falls ” false“, lösche (z, y, i − 1) und gehe zum nächsten ” z“. Falls kein<br />

erfolgreiches z existiert, dann PATH (x, y, i) = false, sonst PATH (x, y, i) =<br />

true<br />

Band 2 arbeitet wie ein Keller: (x0, y0, ⌈log n⌉), . . . , (xi, yi, ⌈log n⌉ − i − 1),<br />

(xi, z, ⌈log n⌉ − i) und enthält nie mehr als ⌈log n⌉ + 1 Tripel, jedes mit der<br />

Länge 3⌈log n⌉, d. h. O(log 2 n).<br />

Band 3 enthält nur generierte z der Länge ⌈log n⌉.<br />

Der Gesamtplatzbedarf ist also O(log 2 n). q.e.d.


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 37<br />

Korollar 3.3 Sei f(n) eine eigentliche Komplexitätsfunktion mit f(n) ≥<br />

log n. Dann gilt:<br />

NSPACE(f(n)) ⊆ SPACE(f(n) 2 )<br />

Beweis: Sei M eine nichtdeterministische Turing-Maschine mit Platzbedarf<br />

f(n). Die Eingabe sei x mit |x| = n.<br />

Die S<strong>im</strong>ulation auf deterministischen Maschinen läuft mit Algorithmus aus<br />

Theorem 3.5 auf dem Konfigurationsgraphen G(M, x).<br />

Für geeignetes c gibt es höchstens c f(n) Knoten, d. h. die Darstellung einer<br />

Konfiguration ist höchstens von der Länge log c f(n) = f(n) log c = O(f(n)).<br />

Systematisches Erzeugen der Konfigurationen nacheinander auf Band 3 (mit<br />

Wiedergebrauch des Platzes): Für PATH (C, C ′ , 0) wird getestet, ob C = C ′<br />

oder C M → C ′ . Letzteres wird durch Nachsehen in der Übergangsrelation ∆<br />

von M festgestellt.<br />

Außer den oben erzeugten Konfigurationen stehen noch die Startkonfigu-<br />

ration sowie sämtliche ” yes“-Konfigurationen (nacheinander) für den Test<br />

M ∗<br />

CStart → C yes“ auf Band 3.<br />

”<br />

Da die Darstellung eines Knotens höchstens von der Länge O(f(n)) ist und<br />

höchstens ⌈log cf(n) ⌉ Tripel auf Band 2 geschrieben werden, folgt für den<br />

Platzbedarf O(f(n) 2 ). q.e.d.<br />

Aus obigem Korollar folgt sofort PSPACE = NSPACE. Das deutet darauf<br />

hin, daß Nichtdeterminismus bezüglich Platz nicht so bedeutend ist wie<br />

bezüglich Zeit.<br />

Das soll noch an einer weiteren Fragestellung belegt werden, dem Komplement<br />

von nichtdeterministischen Platzklassen. Dies betrifft Fragen, die bis<br />

1987 <strong>im</strong> wesentlichen offen waren.<br />

Definition 3.6 Für nichtdeterministische Turing-Maschinen sei bei Eingabe<br />

x<br />

<br />

<br />

<br />

S(h) = C <br />

M t<br />

C ist Konfiguration in G(M, x) und CStart → C mit t ≤ h<br />

Behauptung: Falls M eine nichtdeterministische Turing-Maschine mit<br />

Platzbedarf f(n) und f(n) ≥ log n eine eigentliche Komplexitätsfunktion<br />

ist, dann kann |S(h)| in O(f(n)) nichtdeterministisch berechnet werden.<br />

Beweis: später<br />

Theorem 3.6 (Immerman, Szelepscényi; 87/88) Sei f(n) ≥ log n eine<br />

eigentliche Komplexitätsfunktion. Dann gilt:<br />

NSPACE(f(n)) = co-NSPACE(f(n))


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 38<br />

Beweis: Sei L ∈ NSPACE(f(n)). Das heißt, daß eine nichtdeterministische<br />

Turing-Maschine M mit E/A und Platzbedarf f(n) existiert. Konstruiere<br />

eine nichtdeterministischen Turing-Maschine co − M, die ¯ L = Σ ∗ \L akzeptiert,<br />

folgendermaßen:<br />

z sei die Anzahl aller Konfigurationen von M mit z ≤ c f(n) , c > 0. Es folgt<br />

dann:<br />

1. Für alle h: |S(h)| ≤ c f(n) und log(|S(h)|) ≤ f(n) · log c ∈ O(f(n)).<br />

2. Für alle C mit CStart<br />

somit ist C ∈ S(z).<br />

M ∗<br />

→ C existiert ein t ≤ z mit CStart<br />

M t<br />

→ C und<br />

3. Teste für alle C, ob C ∈ S(z) oder nicht. Existiert eine akzeptierende<br />

Konfiguration C ” yes“ in S(z), dann akzeptiert co − M nicht. Existiert<br />

keine akzeptierende Konfiguration in S(z), dann akzeptiert co − M.<br />

(Nichtdeterministischer Test (|S(z)| sei bekannt, Ermittlung von |S(z)| siehe<br />

Theorem 3.7):<br />

1. m = 0<br />

2. Erzeuge systematisch nacheinander alle Konfigurationen C von M auf<br />

Arbeitsband 1. Bei ständigem Wiedergebrauch des Platzes ergibt sich<br />

ein Platzbedarf von O(f(n)).<br />

3. Teste, ob C ∈ S(z).<br />

Rate nacheinander bei Benutzung desselben Platzes Konfigurationenfolge<br />

C = Cz, Cz−1, Cz−2, . . . , C1 = CStart<br />

Teste mit Hilfe von ∆ von M, ob Ci M → Ci+1 oder Ci = Ci−1<br />

Falls ja für alle i: C ∈ S(z), m := m + 1. Falls C = C ” yes“ ist, dann ist<br />

C ” yes“ in S(z) und co − M akzeptiert nicht (siehe oben bei Punkt 3).<br />

Falls nein für ein i: C /∈ S(z). Dies kann falsch sein.<br />

4. Falls alle C getestet wurden:<br />

m < |S(z)|: Es wurde falsch geraten. Goto 1<br />

m = |S(z)|: Richtig geraten.<br />

Falls alle C ∈ S(z) nicht akzeptierend in M: Akzeptiere x. q.e.d.<br />

Theorem 3.7 (Immerman, Szelepscényi) Sei G = (V, E) ein Graph<br />

und x ∈ V, |V | = n. Die Anzahl der von x erreichbaren Knoten kann auf<br />

einer nichtdeterministischen Turing-Maschine mit Platz O(log n) berechnet<br />

werden.<br />

Beweis: Sei S(h) = {y| es gibt einen Weg von x nach y mit Länge ≤ h}<br />

|S(h)| ≤ n und kann in O(log n) Zeichen dargestellt werden.<br />

S(0) = {x}, |S(0)| = 1. Sei |S(h − 1)| schon berechnet und auf einem Band<br />

notiert (alle vorherigen Werte |S(i)|, i < h − 1 sind schon gelöscht).


3 BEZIEHUNGEN ZWISCHEN KOMPLEXITÄTSKLA<strong>SS</strong>EN 39<br />

Bei der folgenden Berechnung stehen <strong>im</strong>mer nur höchstens zwei Knoten der<br />

Länge O(log n) auf einem Band: Platzbedarf O(log n).<br />

Die Zahlen |S(h − 1)|, m ≤ |S(h − 1)|, |S(h)|, l ≤ |S(h)| benötigen ebenfalls<br />

Platz O(log n).<br />

Nichtdeterministische Berechnung:<br />

1. l = 0<br />

2. Erzeuge systematisch nacheinander alle Knoten v ∈ V (Wiedergebrauch<br />

des Platzes)<br />

3. Teste nichtdeterministisch, ob v ∈ S(h).<br />

(a) m = 0<br />

(b) Erzeuge nacheinander alle Knoten u ∈ V<br />

(c) Teste nichtdeterministisch, ob u ∈ S(h − 1):<br />

i. Rate (bei Wiedergebrauch des Platzes) u =<br />

uh−1, uh−2, . . . , u0 = x.<br />

ii. Falls (ui, ui+1) ∈ E für alle i: u ∈ S(h − 1), m := m + 1.<br />

Falls dann u = v oder (u, v) ∈ E, dann ist v ∈ S(h). Setze<br />

l := l + 1 und Goto 2. Wenn nicht, goto 3(b).<br />

Falls (ui, ui+1) /∈ E für ein i, ist u /∈ S(h − 1) (kann falsch<br />

sein!) Goto 3(b) (Nächster Knoten)<br />

4. Alle Knoten getestet:<br />

m < |S(h − 1)|: Berechnung falsch, goto 3.<br />

m = |S(h − 1)|: Berechnung richtig und v /∈ S(h − 1) und für alle<br />

u ∈ S(h − 1) ist (u, v) /∈ E. Es folgt, daß v /∈ S(h). Goto 2 (nächster<br />

Knoten)<br />

5. Alle Knoten getestet: |S(h)| = l<br />

Bemerkungen:<br />

1. L sei kontextsensitive Sprache (Klasse CS), d. h. Produktionen sind<br />

nicht verkürzend. Ist ¯ L = Σ ∗ \L kontextsensitiv?<br />

Wegen CS = NSPACE(n) = co-NSPACE(n) = co-CS lautet die Antwort:<br />

ja.<br />

Diese Frage war sehr lange offen.<br />

2. Noch einige verbesserte Resultate: Sei f(n) eigentliche Komplexitätsfunktion.<br />

Mit dem Theorem 3.1 gilt: TIME(f(n)) ⊂<br />

TIME(f(n) log 2 f(n)).<br />

<br />

f(n)<br />

3. Zeit versus Platz: TIME(f(n)) ⊆ SPACE<br />

<br />

log f(n)


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 40<br />

4 Reduktionen und Vollständigkeit<br />

4.1 Reduktionen<br />

Wir haben schon Reduktionen von einem Problem auf ein anderes kennengelernt,<br />

etwa MATCHING auf MAXFLOW (D).<br />

Reduktionen betreffen Aussagen wie: Problem A ist mindestens so schwer<br />

(hard) wie B. Dies sagen wir, wenn B auf A reduziert werden kann.<br />

Definition 4.1 (Reduktion) B wird reduziert auf A :⇔ es gibt eine<br />

Transformation R derart, daß für jede Eingabe x für B R(x) eine äquivalente<br />

Eingabe für A ist: x ∈ LB ⇔ R(x) ∈ LA.<br />

x ✲<br />

R<br />

R(x)<br />

✲ Algorithmus für A<br />

Algorithmus für B<br />

✲<br />

” yes“ / ” no“<br />

Das heißt, wir können mit Hilfe der Transformation R und einem Algorithmus<br />

für Problem A das Problem B lösen.<br />

Dabei darf der Aufwand für R allerdings nicht beliebig groß werden, wenn<br />

wir noch sinnvoll reduzieren wollen. Zum Beispiel kann TSP (D) so leicht<br />

auf REACHABILITY reduziert werden: Gegeben seien zwei Knoten a und<br />

b sowie ein Fall F aus TSP (D). Die Transformation R(F ) ist dann: R(F ) =<br />

({a, b}, E) mit (a, b) ∈ E ⇔ Antwort für F ist ” ja“.<br />

Definition 4.2 Seien L1, L2 ⊆ Σ ∗ . L1 ist mit logarithmischem Platz reduzierbar<br />

auf L2 :⇔ es existiert eine Funktion R : Σ ∗ → Σ ∗ , die von einer deterministischen<br />

Turingmaschine mit Platz O(log n) berechnet werden kann,<br />

und<br />

∀x ∈ Σ ∗ x ∈ L1 ⇔ R(x) ∈ L2<br />

R heißt Reduktion von L1 auf L2.<br />

Schreibweise: L1 ≤log L2 oder nur L1 ≤ L2.<br />

Am Anfang der Untersuchungen von Reduktionen konzentrierte man sich<br />

auf solche, die in polynomieller Zeit berechnet werden konnten.<br />

Satz 4.1 Sei R eine Reduktion, die von einer Turingmaschine M berechnet<br />

wird. Dann hält M auf allen Eingaben x nach polynomiell vielen Schritten.<br />

Beweis: Aus |x| = n folgt, daß es O(nc log n ) mögliche Konfigurationen von<br />

M gibt.<br />

Da M deterministisch ist, kann keine Konfiguration zwe<strong>im</strong>al durchlaufen<br />

werden, da M sonst nicht halten würde. Daher haben die Berechnungen<br />

höchstens die Länge O(nc log n ) = O(nn log c ) = O(n k ) für ein k ≥ 1 + log c.<br />

Folgerung: Für |x| = n ist |R(x)| ∈ O(n k ), also von polynomieller Länge.


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 41<br />

Beispiel: HAMILTON PATH (Hamilton’scher Weg, HP): Sei G = (V, E)<br />

ein Graph. Frage: Gibt es einen Weg in G, der jeden Knoten genau einmal<br />

besucht?<br />

<br />

✻<br />

✛ ✲<br />

✛<br />

✸<br />

❄<br />

❄ ✰<br />

<br />

✻<br />

✲<br />

<br />

Dies ist ein schweres Problem, aber SAT ist mindestens genauso schwer.<br />

SAT: Gegeben sei ein Boole’scher Ausdruck Φ über X = {x1, . . . , xn}.<br />

Frage: Gibt es eine Wahrheitsbelegung von X derart, daß Φ wahr wird? (Ist<br />

Φ erfüllbar?).<br />

Beispiel (für SAT): Sei Φ = ((x1 ∨ x2) ∧ x3), X = {x1, x1, x2, x2, x3, x3}.<br />

Gesucht ist eine Wahrheitsbelegung T : X → {true, false} mit T (x) =<br />

true ⇔ T (¯x) = false, d. h. ¯x = ¬x. x, ¯x heißen auch Literale.<br />

Setze T1(x1) = T1(x3) = true und T1(x2) = false. Mit dieser Belegung folgt:<br />

T1(Φ) = false. Mit T2(xi) = true für i = 1, 2, 3 ist T2(Φ) = true. Das heißt<br />

die Antwort auf Φ ∈ SAT ist: ” ja“.<br />

Beispiel 4.1 HP ≤ SAT<br />

Beweis:<br />

1. Sei G = (V, E) ein Fall von HP. Konstruiere einen Boole’schen Ausdruck<br />

R(G) mit R(G) ist erfüllbar ⇔ G besitzt Hamilton’schen Weg<br />

folgendermaßen: R(G) = X, Φ bzw. R(G) = Φ (da X eigentlich überflüssig<br />

ist, da in Φ die Literale auftauchen).<br />

2. Sei V = {1, . . . , n} und X = {xij|1 ≤ i, j ≤ n}, wobei xij für die<br />

Aussage Knoten j ist i-ter Knoten in dem Hamilton’schen Weg“ steht.<br />

”<br />

Diese Aussage kann wahr oder falsch sein.<br />

Schreibe Φ in konjunktiver Normalform: Φ = A1 ∧ A2 ∧ · · · ∧ An <br />

(Φ =<br />

i Ai, Ai = <br />

yij j ). Es gelten für alle j = 1, . . . , n folgende Klauseln<br />

(Disjunktionen):<br />

(a) (x1j ∨ x2j ∨ · · · ∨ xnj): Knoten j muß in dem Pfad irgendwo auftauchen.<br />

(b) Für i, j, k = 1, . . . , n, i = k ist (xij ∨ xkj): j kann <strong>im</strong> Pfad nicht<br />

i-ter Knoten und k-ter Knoten sein.<br />

(c) Für i = 1, . . . , n: (xi1 ∨ xi2 ∨ · · · ∨ xin): Ein Knoten muß der i-te<br />

<strong>im</strong> Pfad sein.<br />

(d) Für i, j, k = 1, . . . , n, j = k ist (xij ∨ xik): j und k können nicht<br />

beide i-ter Knoten <strong>im</strong> Pfad sein.


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 42<br />

(e) Für alle (i, j) mit (i, j) ∈ E und k = 1, . . . , n − 1 (xki ∨ xk+1,j):<br />

Knoten j kann nicht unmittelbarer Nachfolger von Knoten i in<br />

dem Pfad sein (an irgendeiner Stelle k).<br />

R(G) = Φ sei Konjunktion aller dieser Klauseln.<br />

3. Behauptung: R ist Reduktion von HP auf SAT.<br />

Zu zeigen: Für jeden Graphen G gilt:<br />

R(G) erfüllbar ⇔ G hat Hamilton’schen Pfad<br />

und R kann mit Platz O(log n) berechnet werden.<br />

4. Sei R(G) erfüllbar, d. h. es existiert eine Wahrheitsbelegung T , die<br />

R(G) erfüllt: T (R(G)) = true. Dann erfüllt T alle Klauseln in R(G),<br />

also gibt es für jedes j genau ein i mit T (xij) = true, denn sonst<br />

könnten (x1j ∨ x2j ∨ · · · ∨ xnj) und (xij ∨ xkj) nicht alle erfüllt werden.<br />

Analog gibt es für jedes i genau ein j mit T (xij) = true (Klauseln<br />

(xi1 ∨ xi2 ∨ · · · ∨ xin) und (xij ∨ xik)).<br />

Das heißt aber, daß T eine Permutation Π(1), . . . , Π(n) mit<br />

Π(i) = j ⇔ T (xij) = true<br />

der Knoten von G <strong>im</strong>pliziert. Der i-te Knoten <strong>im</strong> Pfad ist Knoten j.<br />

Dazu gilt die Aussage (*): Für alle k = 1, . . . , n−1 ist (Π(k), Π(k+1)) ∈<br />

E. Begründung: Sei für k-ten Knoten <strong>im</strong> Pfad i Π(k) = i und für<br />

(k + 1)-ten Knoten <strong>im</strong> Pfad j Π(k + 1) = j, so muß gelten: T (xki) =<br />

true und T (xk+1,j) = true. Angenommen (i, j) ∈ E. Dann folgt (aus<br />

Punkt 2(e) der Konstruktion und da T (Φ) nach Voraussetzung erfüllt):<br />

true = T (xk,i ∨ xk+1,j) = T (false ∨ false) = false. Widerspruch.<br />

Also gilt mit (*): Π(1), Π(2), . . . , Π(n) ist Hamilton’scher Weg.<br />

5. Umgekehrt: Habe G einen Hamilton’schen Pfad Π(1), . . . , Π(n). Definiere<br />

dann eine Wahrheitsbelegung T für Φ mit T (xij) = true ⇔<br />

Π(i) = j und T (xij) = false ⇔ Π(i) = j.<br />

Man sieht schnell ein, daß T (R(G)) = true gilt.<br />

6. R kann mit Platz O(log n) berechnet werden: Eine Turingmaschine M<br />

berechnet R(G) wie folgt:<br />

Phase 1:<br />

• Band 1: Eingabe von Graph G: Knoten- und Kantenliste.<br />

• Band 2: Anzahl der Knoten n (binär), Platz: log n.<br />

• Band 3: Zähler i, j, k, Platz: log n.<br />

• Band 4: Systematische Ausgabe aller Klauseln der Konstruktion,<br />

die unabhängig von G sind: Punkte 1 bis 4 der Konstruktion<br />

(Ausgabe ist natürlich länger als log n).


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 43<br />

Phase 2:<br />

• Band 3: Zähler i, j, k, k + 1. Systematisches Erzeugen aller Klauseln<br />

(xki∨xk+1,j) nacheinander. Nachdem eine Klausel erzeugt ist,<br />

nachprüfen (auf Band 1), ob (i, j) ∈ E. Falls (i, j) ∈ E, Klausel<br />

löschen; andernfalls Ausgabe der Klausel auf Band 4 und Klausel<br />

auf Band 3 löschen. Platzbedarf hier: 8 log n + c ∈ O(log n). (c<br />

sind Trennsymbole, Klammern)<br />

SAT ist ein Problem aus der Logik. Wie kann man nun bei gegebenen Ausdruck<br />

Φ und gegebener Wahrheitsbelegung T den Wert T (Φ) berechnen?<br />

Eine Möglichkeit ist die Benutzung von logischen Schaltkreisen (Gates), etwa<br />

für den Ausdruck Φ = ((x1 ∨ x2) ∧ x3) folgendermaßen:<br />

❧<br />

x1<br />

x2 ❧ x3 ❧<br />

❄<br />

❥¬<br />

❄<br />

∨❥<br />

❄<br />

∧❥<br />

Definition 4.3 (Boole’scher Schaltkreis) Ein Boole’scher Schaltkreis<br />

(sogenannter Boolean Circuit) ist ein Graph C = (V, E) mit V = {1, . . . , n}.<br />

Ein Knoten g aus V heißt auch Gate.<br />

Jeder Knoten g ∈ V hat einen Eingangsgrad 0, 1, oder 2.<br />

Die Sorte des Knotens s(g) ∈ {true, false, ∨, ∧, ¬}∪{x1, x2, . . . } . Die Sorten<br />

<br />

Variablen<br />

true, false, xi haben den Eingangsgrad 0, ¬ hat den Eingangsgrad 1 und ∨, ∧<br />

haben den Eingangsgrad 2.<br />

Der letzte Knoten n ist der Ausgabeknoten; dieser hat keine ausgehenden<br />

Kanten (kann auf mehrere Knoten erweitert werden. Der Ausgangsgrad ist<br />

für alle anderen Knoten beliebig.<br />

Definition 4.4 (Wahrheitsbelegung) Eine Wahrheitsbelegung T zu einem<br />

Boole’schen Schaltkreis C = (V, E) ist eine Abbildung von V in die<br />

Menge {true, false}, für die folgendes gilt (g, g1, g2 ∈ V ):<br />

1. T (g) = true, falls s(g) = true<br />

2. T (g) = false, falls s(g) = false<br />

3. T (g) ∈ {true, false}, falls g eine Variable ist (also s(g) ∈ {x1, x2, . . . })<br />

4. T (g) = T (g1)XT (g2), falls s(g) = X ∈ {∨, ∧}, (g1, g) ∈ E und<br />

(g2, g) ∈ E<br />

5. T (g) = ¬T (g1), falls s(g) ∈ {¬} und (g1, g) ∈ E


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 44<br />

Als Wahrheitsbelegung des Schaltkreises C wird die Belegung des Ausgangsknotens<br />

definiert, also: T (C) := T (n).<br />

Bemerkung: Um dies auch formal tun zu dürfen, muß der Definitionsbereich<br />

von T erweitert werden.<br />

CIRCUIT VALUE: Sei C = (V, E), V enthält die freien Variablen, und die<br />

Eingabeknoten sind nur true und false. Frage: Ist T (C) = true?<br />

CIRCUIT SAT: Sei C = (V, E). Frage: Gibt es eine Wahrheitsbelegung T<br />

der Eingabeknoten (Variablen) derart, daß T (C) = true? (Ist C erfüllbar?)<br />

Beispiel 4.2 C-VAL = CIRCUIT VALUE ≤ CIRCUIT SAT = C-SAT<br />

Beweis: Die benötigte Reduktion ist R ≡ id.<br />

Alle Schaltkreise, die variablenfrei sind, sind Fälle von CIRCUIT VALUE.<br />

Die Antwort für diese Fälle ist gleich sowohl für C-VAL als auch für C-SAT.<br />

CIRCUIT SAT ist also Verallgemeinerung von C-VAL.<br />

Beispiel 4.3 CIRCUIT SAT ≤ SAT<br />

Beweis: Sei C = (V, E) und g ein Gate in V . Die benötigte Reduktion ist<br />

R(C) = Φ.<br />

Es ergibt sich folgende Tabelle:<br />

C Klauseln in Φ<br />

Variable x (¬g ∨ x) ∧ (g ∨ ¬x)<br />

true (g)<br />

false (¬g)<br />

NOT-Gate mit Vorgänger h (¬g ∨ ¬h) ∧ (g ∨ h) (= XOR (g, h))<br />

OR-Gate (¬h ∨ g) ∧ (¬h ′ ∨ g) ∧ (h ∨ h ′ g❥ ∨ ¬g)<br />

✠ ❘<br />

h h ′<br />

AND-Gate (¬g ∨ h) ∧ (¬g ∨ h ′ ) ∧ (¬h ∨ ¬h ′ ∨ g)<br />

g❥ ✠ ❘<br />

h h ′<br />

Output Gate (g)<br />

Es gilt: C erfüllbar ⇔ R(C) erfüllbar.<br />

Seien A, B, C Probleme, für die gelte: A ≤ B: B ist mindestens genauso<br />

schwer wie A; und B ≤ C: B ist mindestens genauso schwer wie C. Gilt<br />

dann auch A ≤ C?<br />

Ist unsere Sprechweise, die Transitivität beinhaltet, überhaupt gerechtfertigt?<br />

Satz 4.2 Seien L1 ≤ L2 und L2 ≤ L3. Dann gilt auch L1 ≤ L3.


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 45<br />

Beweis: Seien R eine Reduktion von L1 auf L2 und R ′ eine Reduktion von<br />

L2 auf L3. Dann ist R ◦ R ′ eine Reduktion von L1 auf L3, weil: x ∈ L1 ⇔<br />

R ′ (R(x)) ∈ L3.<br />

Zu zeigen bleibt: R ◦ R ′ kann mit Platz O(log n) ausgeführt werden.<br />

Seien MR und MR ′ die entsprechenden Turingmaschinen mit logarithmischen<br />

Platz.<br />

x<br />

✻<br />

MR<br />

✸<br />

❘<br />

❄<br />

R(x) ✛<br />

✻<br />

MR ′<br />

✸<br />

R ′ ❘<br />

❄<br />

(R(x))<br />

.<br />

.<br />

u. U. |x| k dieser Bandinhalt wäre zu lang,<br />

für ein k ≥ 1<br />

Trick: Der Input R(x) für MR ′ wird s<strong>im</strong>uliert. Zu jedem Zeitpunkt der Be-<br />

rechnung merkt sich M auf einem Extraband die Position i des Lesekopfes<br />

von MR ′ auf Eingabe R(x), wobei i binär dargestellt ist.<br />

Anfangs ist i = 1, gelesen wird ⊲. Wann <strong>im</strong>mer der Lesekopf von MR ′ um<br />

eine Position nach rechts geht, wird i inkrementiert.<br />

Die Berechnung von MR auf Eingabe x wird so lange fortgesetzt, bis der<br />

Schreibkopf von MR auf dem Ausgabeband die neue Position i erreicht und<br />

das nächste Ausgabesymbol produziert (und zwar das, welches endgültig<br />

stehen bleibt). Dieses Symbol liest MR ′ und arbeitet damit weiter. Solange<br />

auf Position i stehengeblieben wird, arbeitet MR ′ mit diesem Symbol.<br />

Kritischer Fall: Lesekopf von MR ′ geht nach links, weil das Symbol schon<br />

lange vergessen wurde. Dann wird i dekrementiert und MR wiederholt die<br />

gesamte Berechnung von Anfang bis der Schreibkopf von MR wieder das<br />

Symbol auf die neue Position geschrieben hat. Wenn dieses Symbol bekannt<br />

ist, geht die Berechnung von MR ′ weiter.<br />

Platzbedarf: O(log n), da log i ∈ O(log n) für alle i ≤ |k(x)| q.e.d.<br />

4.2 Vollständigkeit<br />

Die Relation ≤ ist transitiv. Welches sind die max<strong>im</strong>alen Elemente bezüglich<br />

dieser Halbordnung?<br />

Definition 4.5 (Vollständigkeit) Sei C eine Komplexitätsklasse und L<br />

eine Sprache in C (L ∈ C). L heißt C-vollständig :⇔<br />

∀L ′ ∈ C L ′ ≤ L


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 46<br />

• vollständige Sprachen (Probleme) sind die schwierigsten ihrer Klasse.<br />

• C ′ ⊆ C Komplexitätsklassen. C-vollständige Sprachen sind die Kandidaten,<br />

die am ehesten nicht in C ′ liegen, wenn C ′ unter Reduktion<br />

abgeschlossen ist.<br />

• C ′ ist unter Reduktion abgeschlossen, wenn für alle L mit L ≤ L ′ ,<br />

L ′ ∈ C ′ gilt: L ∈ C ′ .<br />

Satz 4.3 P, NP, coNP, L, NL, PSPACE und EXP sind alle unter Reduktion<br />

abgeschlossen.<br />

Beweis: Übungsaufgabe<br />

Satz 4.4 Seien C und C ′ Komplexitätsklassen, die unter Reduktion abgeschlossen<br />

sind. Falls es eine Sprache L gibt, die vollständig für beide Klassen<br />

ist, gilt C = C ′ .<br />

Beweis: Sei L C-vollständig. Dann können alle Sprachen in C auf L reduziert<br />

werden. Da L ∈ C ′ , folgt C ⊆ C ′ . Umgekehrt gilt analoges, da Abschluß<br />

(L) = C. q.e.d.<br />

Gibt es überhaupt ” natürliche“ vollständige Probleme?<br />

Zur Einführung unserer ersten P-vollständigen und NP-vollständigen Probleme<br />

benutzen wir die sogenannte Tafelmethode. Sei M = (K, Σ, δ, s) eine<br />

in polynomieller Zeit arbeitende Turingmaschine, die L entscheidet.<br />

Bei Eingabe von x kann die Berechnung als |x| k × |x| k Berechnungstafel<br />

dargestellt werden, wobei |x| k die Zeitschranke ist.<br />

Beispiel:<br />

⊲ 0s 1 1 ⊔ ⊔ ⊔ ⊔<br />

⊲ ⊔ 1q0 1 ⊔ ⊔ ⊔ ⊔<br />

⊲ ⊔ 1 1q0 ⊔ ⊔ ⊔ ⊔<br />

⊲ ⊔ 1 1 ⊔q0 ⊔ ⊔ ⊔<br />

⊲ ⊔ 1 1 0 ⊔q1 ⊔ ⊔<br />

⊲ ⊔ 1 1 0q2 ⊔ ⊔ ⊔<br />

⊲ ⊔ 1 1q2 0 ⊔ ⊔ ⊔<br />

⊲ ⊔ 1q2 1 0 ⊔ ⊔ ⊔<br />

⊲ ⊔q2 1 1 0 ⊔ ⊔ ⊔<br />

⊲ ⊔“yes“ 1 1 0 ⊔ ⊔ ⊔<br />

Die Zeilen stehen für die Zeitschritte, die Spalten für die Positionen auf dem<br />

Band der Turingmaschine. In den Spalten wird auch die Kopfposition mit<br />

Zustand vermerkt. Ein Eintrag (i, j) enthält den Inhalt der j-ten Position<br />

nach i Schritten.<br />

Wir gehen von einer 1-Band-Turingmaschine mit folgenden Besonderheiten<br />

aus:


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 47<br />

• Start auf Position 1.<br />

• Der Bandbegrenzer ⊲ wird nie erreicht, da Kopf auf ⊲ <strong>im</strong>mer Bewegung<br />

nach rechts <strong>im</strong>pliziert und dieser Schritt dann übersprungen wird,<br />

d. h., wir s<strong>im</strong>ulieren dann zwei Schritte durch einen.<br />

• Falls Haltezustand ” yes“ oder ” no“ erreicht wird, wird <strong>im</strong>mer an das<br />

linke Ende des Bandes <strong>zur</strong>ückgelaufen.<br />

• Falls Zeit |x| k noch nicht erreicht ist, werden die Zeilen wiederholt.<br />

Außerdem gilt für die Eingabe x: |x| ≥ 2. Eingaben der Länge |x| ≤ 1 werden<br />

sofort entschieden.<br />

Ein Halt erfolgt nach höchstens |x| k − 2 Schritten. Dies kann durch größeres<br />

k <strong>im</strong>mer erreicht werden.<br />

Die zugehörige Tafel akzeptiert dann die Eingabe x genau dann, wenn<br />

T |x| k −1,1 = ” yes“. Klar ist: M akzeptiert x ⇔ Tafel T akzeptiert x.<br />

Theorem 4.1 CIRCUIT VALUE ist P-vollständig .<br />

Beweis: CIRCUIT VALUE ist in P. Sei C = (V, E), V = {1, . . . , n}. Einfaches<br />

Durchrechnen der Gates 1, . . . , n ergibt T (C) = T (n) in Zeit O(n+n 2 ).<br />

Zu zeigen: Für jede Sprache L ∈P gibt es eine Reduktion R(x) von L auf<br />

CIRCUIT VALUE mit ∀x ∈ X ∗ R(x) ist variablenfreier Schaltkreis und x ∈<br />

L ⇔ R(x) hat Wert true.<br />

Sei M eine 1-Band-Turingmaschine, die L in Zeit n k entscheidet. Für i = 0,<br />

j = 0 oder j = |x| k −1 sind die Werte der Berechnungstafel a priori bekannt:<br />

i = 0: Eingabe x und ⊔<br />

j = 0: ⊲<br />

j = |x| k − 1: ⊔<br />

Sei nun i ≥ 1 und 1 ≤ j ≤ |x| k − 2. Der Wert von Tij hängt nur ab von den<br />

Werten Ti−1,j−1, Ti−1,j sowie Ti−1,j+1.<br />

i − 1, j − 1 i − 1, j<br />

i, j<br />

i − 1, j + 1<br />

Falls keines der Vorgängerfelder mit einem Zustand markiertes Feld ist, so<br />

ist Ti,j = Ti−1,j−1. Falls ein Vorgängerfeld mit einem Zustand markiert ist,<br />

so ergibt sich der neue Wert aus der Übergangstafel aus M. Sei Γ = Σ × K<br />

und m = ⌈log |Γ|⌉ + 1. Jedes γ ∈ Γ kann als m-Tupel (s1, . . . , sm), si ∈<br />

{0, 1} dargestellt werden. Die Berechnungstafel wird nun als Tafel binärer<br />

Eingänge Sijl gesehen (0 ≤ i ≤ |x| k − 1, 0 ≤ j ≤ |x| k − 1 und 1 ≤ l ≤ m).


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 48<br />

Jedes dieser Sijl hängt nur ab von 3m binären Einträgen von Si−1,j−1,1,<br />

Si−1,j−1,2, . . . , Si−1,j+1,m. Das heißt, es gibt Boole’sche Funktionen<br />

F1, . . . Fm mit<br />

Sijl = Fl(Si−1,j−1,1, . . . , Si−1,j+1,m), i, j > 0, 1 ≤ l ≤ m<br />

Jedes dieser Fl kann als Boole’scher Schaltkreis dargestellt werden, es kann<br />

also ein Boole’scher Schaltkreis C mit 3m Eingaben und m Ausgaben konstruiert<br />

werden, der die binäre Kodierung von Tij aus den binären Kodierungen<br />

von Ti−1,j−1, Ti−1,j sowie Ti−1,j+1 berechnet, und zwar für alle<br />

i = 1, . . . , |x| k , j = 1, . . . , |x| k − 1.<br />

C hängt nur von M ab, hat also eine konstante feste Größe unabhängig von<br />

der Länge von x.<br />

Konstruktion des Schaltkreises R(x):<br />

Eingabegates S0,0,1, S0,0,2, . . . , S0,0,m, S0,1,1, . . . , S 0,|x| k −1,m gemäß der Kodierung<br />

der Anfangskonfiguration bei Eingabe von x, wobei 0 für false und 1<br />

für true steht, und die entsprechenden binären Kodierungen der ersten und<br />

letzten Spalten (<strong>im</strong>mer (⊲, ɛ), (⊔, ɛ), ɛ ist kein Zustand).<br />

(|x| k − 1) · (|x| k − 2) Kopien des Schaltkreises C, genannt jeweils Cij.<br />

si−1,j−1,1<br />

sij1<br />

. . . si−1,j+1,m<br />

Cij<br />

. . .<br />

sijm<br />

Die Ausgabegates von Ci−1,j−1, Ci−1,j, Ci−1,j+1 werden dabei als Eingabegates<br />

von Cij identifiziert. Das Ausgabegate von R(x) soll das erste Ausgabegate<br />

von C |x| k −1,1 sein.<br />

Dabei gilt folgende Annahme: Die Berechnung von M endet <strong>im</strong>mer mit ” yes“<br />

oder ” no“. Das erste Bit von ” yes“ ist <strong>im</strong>mer 1, das von ” no“ <strong>im</strong>mer 0.<br />

Durch Induktion über i ist nun leicht zu zeigen, daß die Ausgabegates von<br />

Cij der binären Kodierung der i-ten Zeile in der Berechnungstafel entsprechen.<br />

Falls der Wert von R(x) true wird, heißt das, daß in M der ” yes“<br />

Zustand erreicht wurde, also x ∈ L. Falls x ∈ L, dann akzeptiert die Berechnungstafel,<br />

und damit wird der zugehörige Schaltkreiswert true.<br />

R(x) kann in O(log |x|) Platz erzeugt werden, Schaltkreis C in konstanter<br />

Zeit: Für Cij jeweils Merken der Indizes und Eingabeknoten E(i, j, h), h =<br />

1, . . . , 3m identifizieren mit Ausgabeknoten (Gates) von A(i − 1, j − 1, l),<br />

A(i − 1, j, l), A(i − 1, j + 1, l) für l = 1, . . . , m.<br />

Das heißt, es handelt sich nur um Berechnungen mit Zahlen mit max<strong>im</strong>aler<br />

Länge log |x| k = O(k log |x|) = O(log |x|) (k ist konstant).<br />

Es werden systematisch alle Indexpaare (i, j) unter Wiedergebrauch des<br />

Platzes durchgegangen.


4 REDUKTIONEN UND VOLLSTÄNDIGKEIT 49<br />

Die Generierung der numerierten Gates Cij benötigt jeweils O(1) Platz, also<br />

insgesamt O(log |x|) Platz. q.e.d.<br />

Theorem 4.2 (Cook, 1971) SAT ist NP-vollständig.<br />

Beweis: Wir wissen schon, daß CIRCUIT SAT ≤ SAT. Wir zeigen:<br />

∀L ∈ NP gilt: L ≤ LCIRCUIT SAT<br />

woraus dann folgt: L ≤ LSAT (wegen Satz 4.2).<br />

Sei L ∈NP. Wir konstruieren einen Schaltkreis R(x) mit Eingabegates (entweder<br />

Konstanten oder Variablen) mit<br />

x ∈ L ⇔ R(x) ist erfüllbar<br />

(d. h. wird unter einer Belegung der Variablen true).<br />

Sei M = (K, Σ, ∆, s) eine nichtdeterministische Turingmaschine, die L in<br />

n k akzeptiert. M sei 1-Band-Turingmaschine, und für jeden Zustand q und<br />

jedes Symbol σ ∈ Σ sei |∆(σ, q)| = 2. Dies ist <strong>im</strong>mer zu erreichen:<br />

• Sei die Anzahl der Auswahlmöglichkeiten etwa m > 2, dann nehmen<br />

wir m − 2 Zustände dazu, um diese Wirkung zu erreichen.<br />

• Falls m = 1, dann schreiben wir die Nachfolgetripel zwe<strong>im</strong>al auf.<br />

• Falls m = 0, werden Zustand, Symbol und Position nicht verändert<br />

(zwe<strong>im</strong>al hinschreiben)<br />

Das heißt, wir können annnehmen, daß M bei jedem Übergang <strong>im</strong>mer zwei<br />

Auswahlmöglichkeiten hat: 0 und 1. Insgesamt ist dann bei einem Berechnungspfad<br />

eine Folge von Auswahlen (c0, c1, . . . , c |x| k−1) ∈ {0, 1} |x|k entstanden.<br />

Für eine feste Sequenz c = (c0, c1, . . . , c |x| k−1) ist dann die Berechnung<br />

deterministisch. Für Schritt i wählen wir Auswahl ci für den Übergang.<br />

Das heißt, wir können die Berechnungstafel T (M, x, c) aufstellen, die zu<br />

Maschine M, Input x und Auswahlsequenz c gehört.<br />

Alle inneren Tij hängen nur von Ti−1,j−1, Ti−1,jTi−1,j+1 und der Wahl ci−1<br />

ab. Das heißt, der Schaltkreis Cij sieht wie folgt aus:<br />

si−1,j−1,1<br />

sij1<br />

. . . si−1,j+1,m<br />

Cij<br />

. . .<br />

sijm<br />

ci−1


5 NP-VOLLSTÄNDIGE PROBLEME 50<br />

Das heißt, C hat jetzt 3m + 1 Eingaben statt 3m.<br />

R(x) kann wieder in Platz O(log |x|) erstellt werden, da nur Zahlen ≤ |x| k<br />

in die Berechnung eingehen.<br />

Es folgt sofort, R(x) ist erfüllbar, d. h., es gibt Sequenz von Eingaben<br />

c0, . . . , c |x| k −1, so daß genau dann Wert (R(x)) = true ist, wenn x ∈ L<br />

gilt. q.e.d.<br />

Anmerkung: Wenn eine Belegung c0, . . . , c |x| k −1 erst einmal festgelegt ist,<br />

dann haben wir nur noch ein CIRCUIT VALUE Problem zu lösen. (Es gibt<br />

aber exponentiell viele Belegungen!)<br />

Bemerkungen:<br />

• Oft wird von den Transformationen nur verlangt, daß sie in polynomieller<br />

Zeit ausführbar sind (Karp) (für Klassen P, NP und aufwärts)<br />

bzw. in log n Platz für P und darunter.<br />

• Auch nichtdeterministische Reduktionen sind untersucht worden.<br />

5 NP-vollständige Probleme<br />

Wir haben nun zwei NP-vollständige Probleme kennengelernt: SAT und<br />

CIRCUIT SAT. Im folgenden werden weitere vorgestellt.<br />

Worin liegt die Bedeutung der NP-vollständigen Probleme?<br />

1. Sei L NP-vollständig. Falls L ∈ P gilt, würde P = NP folgen.<br />

Ein Nachweis, daß auch nur ein NP-vollständiges Problem in P liegt,<br />

ist bisher nicht erbracht und ist nach heutiger Kenntnis eher unwahrscheinlich.<br />

2. NP-Vollständigkeit ist selbst eine Eigenschaft von Probleme und Sprachen,<br />

die diese charakterisieren. Sie gelten als ” sehr schwer“ lösbar.<br />

Wenn wir von einem NP-vollständigem Problem den bestmöglichen<br />

Rechenaufwand auch nicht exakt kennen, so können wir doch sagen,<br />

daß alle schwierigen Probleme in NP etwa gleich schwer sind (Relativ<br />

<strong>zur</strong> Reduktion mit Platzaufwand O(log n)).<br />

Sei L ∈ NP und M NP-vollständig. Falls M ≤ L gilt, dann ist L aufgrund<br />

der Transitivität der Reduktion NP-vollständig.<br />

Woher weiß man nun, daß ein Problem NP-vollständig ist?<br />

• Nachsehen in Büchern<br />

• Beweisen mit folgendem Beweismuster: PROB liege vor<br />

1. PROB ∈ NP


5 NP-VOLLSTÄNDIGE PROBLEME 51<br />

2. Suche geeignetes NP-vollständiges Problem VOLL<br />

3. Konstruiere Reduktion R: VOLL → PROB<br />

4. Zeige, daß R mit O(log n) Platz konstruiert werden kann<br />

1 und 4 sind meist leicht zu zeigen, die Hauptarbeit liegt in 2 und 3.<br />

1 und 4 werden <strong>im</strong> folgenden oft nicht extra gezeigt, da offensichtlich.<br />

5.1 Varianten von SAT<br />

Ein wichtiges Problem, das NP-vollständig ist, ist 3SAT .<br />

kSAT ist das Problem SAT, wobei in jeder Klausel höchstens k Literale<br />

vorkommen.<br />

Satz 5.1 3SAT ist NP-vollständig.<br />

Beweis: CIRCUIT SAT ≤ 3SAT (schon in Beispiel 4.3 gezeigt). In der Tat<br />

haben in der Reduktion alle erzeugten Klauseln höchstens 3 Variablen.<br />

Satz 5.2 3SAT bleibt NP-vollständig,<br />

1. falls alle Klauseln genau drei Literale enthalten<br />

2. falls jede Variable höchstens dre<strong>im</strong>al auftaucht und jedes Literal<br />

höchstens zwe<strong>im</strong>al<br />

Beweis:<br />

1. Klauseln mit ein oder zwei Literalen: Auffüllen mit Kopien eines schon<br />

vorkommenden Literals, z. B. (x ∨ ¬y) ⇒ (x ∨ x ∨ ¬y)<br />

2. Sei x Variable, die in einem Ausdruck aus 3SAT k-mal auftaucht. Ersetze<br />

x be<strong>im</strong> ersten Auftauchen durch x1, be<strong>im</strong> zweiten Auftauchen<br />

durch x2, usw.<br />

Es entstehen neue Variablen x1, x2, . . . , xk, die bei Wahrheitsbelegung<br />

den gleichen Wert annehmen müssen. Das geschieht durch (konjunktives)<br />

Hinzufügen des Ausdrucks Φ = (¬x1 ∨ x2) ∧ (¬x2 ∨ x3) ∧ · · · ∧<br />

(¬xk ∨ x1).<br />

Für alle i = 1, . . . k gilt: T (Φ) = true ⇔ T (¬xi ∨ xi+1) = true<br />

Bemerkung: Grenzlinie zwischen P und NP: 2SAT ist in P (sogar in NL).<br />

Beweis wird weggelassen.<br />

Was passiert, wenn ein Problem aus 2SAT nicht erfüllbar ist?<br />

Sinnvolle Frage: Wie ist die max<strong>im</strong>ale Anzahl von Klauseln, die erfüllt werden<br />

können?


5 NP-VOLLSTÄNDIGE PROBLEME 52<br />

MAX2SAT : Sei Φ Boole’scher Ausdruck, wobei alle Klauseln höchstens<br />

zwei Literale enthalten, und k eine ganze Zahl. Gibt es eine Belegung T<br />

derart, daß mindestens k Klauseln erfüllt werden?<br />

Theorem 5.1 MAX2SAT ist NP-vollständig.<br />

Beweis:<br />

1. MAX2SAT ∈ NP: Rate Belegung und teste!<br />

2. 3SAT ≤ MAX2SAT:<br />

Betrachte zunächst für eine Klausel (x ∨ y ∨ z) folgendes Produkt von<br />

zehn Klauseln ( ” ∧“ wird als Produkt interpretiert): (*)<br />

(x)(y)(z)(w)<br />

(¬x ∨ ¬y)(¬y ∨ ¬z)(¬z ∨ ¬x)<br />

(x ∨ ¬w)(y ∨ ¬w)(z ∨ ¬w)<br />

Wieviele Klauseln können in diesem Ausdruck erfüllt werden?<br />

Beachte: (*) ist symmetrisch bezüglich x, y, z, aber nicht bezüglich w.<br />

Somit müssen nur die Fälle<br />

(a) 3 Variablen aus {x, y, z} sind true<br />

(b) 2 Variablen aus {x, y, z} sind true<br />

(c) 1 Variable aus {x, y, z} ist true<br />

(d) Keine Variable aus {x, y, z} ist true<br />

betrachtet werden.<br />

(a) T (x) = T (y) = T (z) = true, T (w) = true oder = false. Dann<br />

können max<strong>im</strong>al sieben Klauseln erfüllt werden.<br />

T (w) = true: Zeile 1: 4, Zeile 2: 0, Zeile 3: 3<br />

T (w) = false: Zeile 1: 3, Zeile 2: 0, Zeile 3: 3<br />

(b) T (x) = false, T (y) = T (z) = true, T (w) = true oder = false. Es<br />

können wiederum max<strong>im</strong>al sieben Klauseln erfüllt werden:<br />

• T (w) = true: Zeile 1: 3, Zeile 2: 2, Zeile 3: 2<br />

• T (w) = false: Zeile 1: 2, Zeile 2: 2, Zeile 3: 3<br />

(c) Nur eines, etwa T (x) = true, T (y) = T (z) = false, T (w) = true<br />

oder false: Sieben Klauseln erfüllbar.<br />

(d) T (x) = T (y) = T (z) = false, T (w) = false oder = true ⇒ sechs<br />

Klauseln erfüllbar.


5 NP-VOLLSTÄNDIGE PROBLEME 53<br />

Das heißt: Falls wir eine Belegung T finden mit T (x ∨ y ∨ z) = true,<br />

dann können wir mit Hilfe von w <strong>im</strong>mer sieben Klauseln erfüllen, sonst<br />

höchstens sechs.<br />

Sei Φ irgendein Fall von 3SAT. R(Φ): Für jede Klausel Ci = (α∨β ∨γ)<br />

konstruiere zehn Klauseln nach Methode (*) mit Zusatzvariable wi<br />

(statt w). Zehn Klauseln entsprechen einer Gruppe. Falls Φ m Klauseln<br />

hat, hat R(Φ) 10m Klauseln.<br />

Die max<strong>im</strong>ale Anzahl der erfüllbaren Klauseln ist also k = 7m.<br />

Behauptung: R(Φ) hat Belegung, die mindestens 7m Klauseln erfüllt ⇔ Φ<br />

ist erfüllbar.<br />

Seien 7m Klauseln in R(Φ) unter T erfüllt. Jeder Gruppe kann höchstens<br />

sieben erfüllte Klauseln haben. Also hat jede Gruppe genau sieben erfüllte<br />

Klauseln, d. h. mindestens ein Literal in jeder Ausgangsklausel Ci muß mit<br />

true belegt sein. Also ist Φ erfüllt.<br />

Φ ist erfüllt unter T . Daraus folgt, daß in jeder Gruppe sieben Klauseln<br />

erfüllbar sind und somit R(Φ) eine Schranke k = 7m erreicht.<br />

Logarithmischer Platz: Die Gruppen werden systematisch nacheinander erzeugt.<br />

Die Indices sind alle in O(log n) darstellbar. q.e.d.<br />

Es gibt noch weitere Varianten von SAT, die NP-vollständig sind, z. B.<br />

können wir verlangen, daß in 3SAT in jeder Klauseln, die Variablen weder<br />

alle true noch alle false sein dürfen: NAESAT (not-all-equal SAT). Solche<br />

Probleme sind aus beweistechnischen Gründen oft interessant.<br />

5.2 Graphentheoretische Probleme<br />

Hier werden <strong>im</strong> folgenden nur ungerichtete Graphen G = (V, E),<br />

[i, j] ∈ E behandelt.<br />

i<br />

<br />

j<br />

<br />

INDEPENDENT SET (INDSET): Sei G = (V, E) ein ungerichteter<br />

Graph, k ∈ N. Frage: Gibt es eine unabhängige Menge I mit |I| = k? (I ist<br />

eine unabhängige Menge von Knoten: ∀i, j ∈ I [i, j] ∈ E).<br />

Theorem 5.2 INDEPENDENT SET (INDSET) ist NP-vollständig.<br />

Beweis: 3SAT ≤ INDSET. In Theorem 5.1 haben wir Gruppen von zehn<br />

Klauseln als Bausteine benutzt. Hier benutzen wir Dreiecke als Grundbausteine,<br />

d. h., wir werden nur Graphen betrachten, die in Dreiecke partitioniert<br />

werden können. Wir betrachten also nur eine Untermenge von Problemen<br />

in INDSET und zeigen, daß diese schon NP-vollständig ist.<br />

Konstruktionsbeispiel: Φ = (x1 ∨x2 ∨x3)∧(¬x1 ∨¬x2 ∨¬x3)∧(¬x1 ∨x2 ∨x3)


5 NP-VOLLSTÄNDIGE PROBLEME 54<br />

x1<br />

<br />

¬x1<br />

¬x1<br />

<br />

x2 <br />

x3<br />

¬x2<br />

¬x3 x2 <br />

x3<br />

Allgemein: Φ = C1 ∧C2 ∧· · ·∧Cm mit Ci = (αi1 ∨α2i ∨α3i), αij sind Literale<br />

der Form x oder ¬x.<br />

R(Φ) = (G, K), K = m, wobei G = (V, E) ein Graph mit<br />

und<br />

V = {vij|i = 1, . . . , m; j = 1, 2, 3}<br />

E = {[vij, vik]|i = 1, . . . , m; j = k; 1 ≤ j < k ≤ 3}∪{[vij, vlk]|i = l, αij = ¬αlk}<br />

Das heißt, für jedes Auftreten eines Literals in Φ gibt es einen Knoten. Die<br />

erste Menge von Kanten definiert Dreiecke den Klauseln entsprechend; die<br />

zweite Menge von Kanten verbindet zueinander gehörige entgegengesetzte<br />

Literale.<br />

Behauptung: Es gibt eine unabhängige Menge I mit K Knoten in G genau<br />

dann, wenn Φ erfüllbar ist.<br />

Sei I unabhängig und |I| = K. Aus K = m folgt, daß I in jedem Dreieck<br />

genau einen Knoten hat (niemals zwei, da sonst nicht unabhängig). Diese m<br />

Knoten, die mit Literalen bezeichnet sind, haben keine Kanten zwischeneinander,<br />

d. h. sie gehören nicht zu entgegengesetzten Literalen. Setze alle zu<br />

den Knoten aus I gehörenden Literale auf true: Φ ist erfüllt.<br />

Umgekehrt: Sei T Belegung für Φ mit T (Φ) = true. Wähle in jeder Klausel<br />

Ci ein Literal mit Wert true aus. Jedes dieser m Literale gehört zu einem<br />

Knoten in den entsprechenden Dreiecken. Da sie jeweils den Wert true haben,<br />

können sie nicht zu Literalenpaaren der Form x und ¬x gehören (aus<br />

verschiedenen Klauseldreiecken). Also gibt es zwischen Knoten keine Kanten,<br />

woraus folgt, daß I unahängig ist. q.e.d.<br />

Zu unabhängigen Mengen gibt es zwei weitere eng verwandte Probleme:<br />

CLIQUE: Sei G = (V, E) ein Graph, k ∈ N. Eine Clique ist ein vollständiger<br />

Untergraph, d. h., alle Knoten sind untereinander mit Kanten direkt<br />

verbunden. Frage: Gibt es Cliquen der Größe k?


5 NP-VOLLSTÄNDIGE PROBLEME 55<br />

NODE COVER: Sei G = (V, E) ein Graph, k ∈ N. Frage: Gibt es eine<br />

Überdeckung der Größe ≤ k? Eine Knotenüberdeckung ist eine Teilmenge<br />

U ⊆ V mit |U| ≤ k derart, daß für alle [u, v] ∈ E gilt: u ∈ U oder v ∈ U.<br />

Theorem 5.3 CLIQUE und NODE COVER sind NP-vollständig.<br />

Beweis:<br />

1. INDSET ≤ CLIQUE: Sei G = (V, E) ein Graph und k ein Fall von<br />

INDSET. Wähle die Relation R(G, k) = ¯ G mit k Fall von CLIQUE.<br />

¯G = (V, Ē) ein Graph mit Ē = {[u, v]|[u, v] ∈ E} ist. I ist unbhängig<br />

in G genau dann, wenn I einen vollständigen Untergraphen in ¯ G <strong>im</strong>pliziert.<br />

2. I ist unabhängig in G = (V, E), |I| = k genau dann, wenn V − I eine<br />

Überdeckung der Größe |V | − k in G ist.<br />

” ⇒“: Für alle [a, b] ∈ E gilt: a ∈ V − I oder b ∈ V − I (sonst a, b ∈ I,<br />

was ein Widerspruch <strong>zur</strong> Unabhängigkeit wäre)<br />

” ⇐“: V − I ist Überdeckung. Also gilt für alle a, b ∈ I: [a, b] ∈ E<br />

(andernfalls wäre a ∈ V − I oder b ∈ V − I).<br />

5.3 Mengen- und Zahlenprobleme<br />

Bisher spielten Zahlen für uns fast nur als Indizes eine Rolle (Ausnahme ist<br />

etwa TSP). Allerdings waren bei der Reduktion die Distanzen auch nur 1<br />

oder 2. Es gibt aber eine Anzahl interessanter Probleme, bei denen (große)<br />

Zahlen eine große Rolle spielen.<br />

SUMME VON UNTERMENGEN (SUM): Sei A = {a1, . . . , an} eine<br />

Teilmenge von N und M ∈ N. Frage: Existiert eine Menge B ⊆ A mit<br />

<br />

ai∈B ai = M?<br />

Theorem 5.4 SUM ist NP-vollständig.<br />

Beweis:<br />

1. SUM ∈ NP: Rate B und teste.<br />

2. Wir zeigen NODE COVER ≤ SUM: Sei R(G, k) = A; M mit<br />

G = (V, E), V = {v1, . . . , vn}, E = {e1, . . . , em}, A =<br />

{a1, . . . , an, b1, . . . , bm}. Für alle j = 1, . . . , n gilt:<br />

aj = 4 m +<br />

m<br />

ɛij · 4 i−1 <br />

1 vj ist Knoten von ei<br />

mit ɛij =<br />

0 sonst<br />

i=1<br />

Für alle i = 1, . . . , m gilt: bi = 4 i−1 und M = k · 4 m + 2 · m<br />

i=1 4i−1 .<br />

Behauptung: G hat Knotenüberdeckung S ⊆ V mit |S| ≤ k genau


5 NP-VOLLSTÄNDIGE PROBLEME 56<br />

dann, wenn ein B ⊆ A mit <br />

x∈B x = M existiert.<br />

” ⇒“: o.B.d.A. sei |S| = k (Zunahme von Knoten). Für i = 1, . . . , m<br />

sei φi = <br />

vj∈S ɛij. 1 ≤ φi ≤ 2: Zu jeder Kante ei gehören mindestens<br />

ein vj ∈ S (Überdeckung) und höchstens zwei Knoten aus S.<br />

Sei B1 = {aj|vj ∈ S}, B2 = {bi|1 ≤ i ≤ m, φi = 1}, B = B1 ∪ B2<br />

(Füllelemente, falls ei nur von einem v ∈ S getroffen). Es gilt:<br />

<br />

x = <br />

aj + <br />

x∈B<br />

vj∈S<br />

φi=1<br />

= <br />

<br />

4 m +<br />

vj∈S<br />

= |S| · 4 m +<br />

= k · 4 m +<br />

bi<br />

m<br />

i=1<br />

ɛij4 i−1<br />

<br />

+ <br />

4 i−1<br />

φi=1<br />

⎜ ⎟<br />

m ⎜ ⎟<br />

⎜ ɛij⎟<br />

4<br />

⎜ ⎟<br />

⎝vj∈S<br />

⎠<br />

<br />

i−1 + <br />

4<br />

φi=1<br />

i−1<br />

i=1<br />

⎛<br />

φi<br />

⎞<br />

m<br />

φi4 i−1 + <br />

4 i−1<br />

i=1<br />

= k4 m + <br />

= k4 m + 2<br />

= M<br />

i,φi=2<br />

φi=1<br />

2 · 4 i−1 + <br />

m<br />

4 i−1<br />

i=1<br />

i,φi=1<br />

4 i−1 + <br />

i,φi=1<br />

4 i−1<br />

” ⇐“: Es existiere B ⊆ A mit <br />

x∈B x = M. Sei B1 = B ∩ {a1 . . . , an}<br />

und B2 = B ∩ {b1, . . . , bm}. Behauptung: S = {vj|aj ∈ B1} ist Kno-


5 NP-VOLLSTÄNDIGE PROBLEME 57<br />

tenüberdeckung mit |S| = k.<br />

M = k · 4 m + 2<br />

= <br />

aj∈B1<br />

m<br />

4 i−1<br />

i=1<br />

aj + <br />

= <br />

<br />

4 m +<br />

vj∈S<br />

= |S| · 4 m +<br />

bi∈B2<br />

m<br />

i=1<br />

bi<br />

ɛij4 i−1<br />

<br />

+ <br />

bi∈B2<br />

⎜<br />

m ⎜<br />

<br />

⎜ ɛij 4<br />

⎜<br />

⎝vj∈S<br />

<br />

i−1<br />

⎟ +<br />

⎟<br />

⎠<br />

i=1<br />

⎛<br />

⎞<br />

≤2<br />

<br />

≤ m i=1 3·4i−1 =4m−1 bi<br />

m<br />

|{bi} ∩ B2| ·4<br />

<br />

≤1<br />

i−1<br />

Also gilt: |S| = k, da der Rest < 4m ist. Außerdem gibt es bei der<br />

Summation keine Überträge, d. h. für alle i = 1, . . . , m gilt:<br />

2 = <br />

ɛij + |{bi} ∩ B2|<br />

<br />

vj∈S<br />

≤1<br />

⇒ ∀i <br />

ɛij ≥ 1<br />

vj∈S<br />

⇒ ∀i ∃vj ∈ S mit ɛij ≥ 1<br />

i=1<br />

⇒ ∀i ∃vj ∈ S mit vj ist Knoten von ei<br />

⇒ S ist Überdeckung mit |S| = k<br />

q.e.d.<br />

Mit SUM kann man zeigen, daß eine Reihe von weiteren Zahlenproblemen<br />

NP-vollständig sind.<br />

PARTITION: Sei A = {a1, . . . , an} eine Teilmenge von N. Frage: Existiert<br />

eine Menge D ⊆ A (Partitionsmenge) mit <br />

ai∈D ai = <br />

aj∈A\D aj =<br />

1 n 2 i=1 ai?<br />

Es gilt: SUM ≤ PARTITION, denn: Sei A wie oben, M ein Fall aus<br />

SUM. Dann kann man folgende Relation R aufstellen: R(A, M) = A ′ =<br />

A ∪ {an+1, an+2}, wobei an+1 = M + 1 und an+2 = n i=1 ai + 1 − M sind.<br />

Man sieht sofort, daß n+2 i=1 ai = 2 n i=1 ai + 2.<br />

Sei nun B ⊆ A mit <br />

ai∈B ai = M (also Lösung von SUM). Setze D =<br />

B ∪ {an+2} ⊆ A ′ .


5 NP-VOLLSTÄNDIGE PROBLEME 58<br />

Dann gilt (*):<br />

<br />

ai = <br />

ai + an+2 = M +<br />

ai∈D<br />

ai∈B<br />

n<br />

ai + 1 − M =<br />

i=1<br />

n<br />

ai + 1<br />

also ist D Partitionsmenge.<br />

Sei D Partitionsmenge von A ′ . O.b.d.A. ist an+2 ∈ D (sonst ∈ A ′ \D). Also<br />

ist an+1 ∈ D, weil sonst <br />

ai∈D ai ≥ an+1 + an+2 = n i=1 ai + 2 > ai + 1<br />

(keine Partition).<br />

Setze B = D\{an+2}. Mit (*) folgt sofort, daß<br />

n<br />

<br />

n<br />

<br />

ai = ai + 1 − ai + 1 − M = M<br />

ai∈B<br />

i=1<br />

<br />

a∈D a<br />

<br />

Rucksackproblem (KNAPSACK): Sei X = {w1, . . . , wn} ⊆ N eine<br />

Menge von Gewichten bzw. Größen von Stücken, Y = {v1, . . . , vn} ⊆ N<br />

eine Menge, die den Wert (value) dieser Stücke angibt, und seien W eine<br />

Gewichts- und K eine Kostenschranke. Frage: Existiert eine Menge<br />

I ⊆ {1, . . . , n} mit <br />

i∈I wi ≤ W und <br />

i∈I vi ≥ K; anders ausgedrückt:<br />

kann ich einen Rucksack so beladen, daß ich einen best<strong>im</strong>mten Mindestwert<br />

mitbekomme?<br />

PARTITION ≤ KNAPSACK, denn:<br />

Sei R({a1, . . . , an} ) = X, Y, W, K mit wi = vi = 2ai für i = 1, . . . , n und<br />

<br />

A<br />

W = K = n i=1 ai.<br />

Ist n i=1 ai ungerade, so gibt es keine Lösung für beide Probleme.<br />

Ist n i=1 ai gerade, so gilt:<br />

<br />

ai∈D<br />

ai = 1<br />

2<br />

i=1<br />

n<br />

ai ⇔ <br />

wi = <br />

vi =<br />

i=1<br />

i∈I<br />

i∈I<br />

i=1<br />

n<br />

ai = <br />

2ai<br />

mit I = {i|ai ∈ D}.<br />

Das Rucksackproblem und auch das Partitionsproblem haben auf den ersten<br />

Blick verblüffend einfache Lösungen.<br />

Satz 5.3 Jeder Fall von KNAPSACK mit n Stücken und Gewichtsschranke<br />

W kann in O(nW ) Schritten gelöst werden.<br />

Beweis: Sei V (W, i) max<strong>im</strong>aler Wert, der erreicht werden kann mit Stücken<br />

aus den ersten i Stücken, die genau auf Gewicht W aufsummiert werden.<br />

⎧ <br />

⎫<br />

⎨ <br />

<br />

⎬<br />

V (W, i) = max vj<br />

<br />

⎩ J<br />

⊆ {1, . . . , i}, wj = W<br />

⎭<br />

j∈J<br />

i=1<br />

j∈J<br />

i∈I


5 NP-VOLLSTÄNDIGE PROBLEME 59<br />

Für i = 0 gilt: V (W, 0) = 0, J = ∅. Offenbar gilt für i ≥ 0:<br />

V (W, i + 1) = max{V (W, i), vi+1 + V (W − wi+1, i)}<br />

(Falls W − Wi+1 < 0, dann V (W, i + 1) = V (W, i))<br />

Berechnung von Wertematrix V (W × (n + 1)-Matrix) ist in O(nW ). Der<br />

vorliegende Fall hat genau dann eine Lösung ( ” Ja“-Antwort), wenn es j, i<br />

gibt mit V (j, i) ≥ k. q.e.d.<br />

Das heißt aber nicht, P = NP! nW ist keine polynomielle Funktion der<br />

Eingabe!<br />

Im allgemeinen ist die Eingabe von Knapsack beschrieben durch 2n + 2<br />

Zahlen (w1, . . . , wn, v1, . . . , vn, W, K). Nun kann beispielsweise W so groß<br />

sein, daß W die Länge der Eingabe best<strong>im</strong>mt. N<strong>im</strong>mt man als Eingabelänge<br />

n log W und W = 2 n an, dann ist nW = n2 log W = w 2 keine polynomielle<br />

Funktion der Eingabelänge. Sind aber alle Gewichte und Werte von Stücken<br />

durch ein Polynom p(n) beschränkt, dann ist die Lösung tatsächlich polynomiell.<br />

Solche Algorithmen heißen pseudopolynomielle Algorithmen. Gibt<br />

es solche Algorithmen <strong>im</strong>mer?<br />

Bei Problemen wie SAT, CLIQUE, NODE COVER traten bisher nur Zahlen<br />

als Indizes auf, die polynomiell beschränkt waren; d. h., daß hier die Zahlen<br />

von vornherein klein waren.<br />

Es gibt aber auch Probleme wie etwa TSP(D), wo die Zahlen exponentiell<br />

groß sein können (relativ <strong>zur</strong> Anzahl der Städte). Trotzdem finden wir dort<br />

(derzeit) keine pseudopolynomiellen Lösungen. Den Grund werden wir etwas<br />

später sehen.<br />

Falls ein Problem PROB NP-vollständig bleibt, wenn es nur auf Fälle F<br />

beschränkt wird, bei denen alle Zahlen ≤ p(n) für Eingabelänge n sind,<br />

dann ist PROB NP-vollständig <strong>im</strong> strengen Sinne. (Manchmal auch stark<br />

NP-vollständig)<br />

Mengenprobleme: Jetzt noch zu einigen Mengenproblemen.<br />

Ein wichtiges Basisproblem ist 3D-MATCHING (Tripartites Matching,<br />

3DM): Seien B, G, H Mengen mit |B| = |G| = |H| = n und T eine Relation<br />

mit T ⊆ B × G × H. Frage: Gibt es ein dreid<strong>im</strong>ensionales Matching T ′ ⊆ T ,<br />

d. h. ein T ′ mit |T ′ | = n und ∀(b1, g1, h1), (b2, g2, h2) ∈ T ′ b1 = b2, g1 = g2<br />

und h1 = h2?<br />

Man kann zeigen: 3SAT ≤ 3DM.<br />

Folgende Probleme hängen mit 3DM eng zusammen:<br />

SET COVERING: Sei F = {S1, S2, . . . , Sn}, Si ⊆ U und B ∈ N. Frage:<br />

Gibt es eine Menge von höchstens B Mengen in F , deren Vereinigung gerade<br />

U ist?


6 CONP 60<br />

EXACT COVER BY 3-SETS: Seien F = {S1, . . . , Sn}, Si ∈ U, |Si| =<br />

3, |U| = 3m. Frage: Gibt es m disjunkte Mengen in F , deren Vereinigung U<br />

ist?<br />

Sofort ist einsichtig, daß<br />

3DM 1.<br />

≤ EXACT COVER BY 3-SETS 2.<br />

≤ SET COVERING<br />

1. 3DM ist Spezialfall von EXACT COVER BY 3-SETS: U = B ∪ G ∪<br />

H, (b, g, h) ∈ T entspricht {b, g, h} ∈ F und T ′ entspricht exakter<br />

Überdeckung F ′ .<br />

2. EXACT COVER BY 3-SETS ist Spezialfall von SET COVERING<br />

(Schranke m).<br />

5.4 Weitere NP-vollständige Probleme<br />

1. HAMILTON PATH (HP): Sei G = (V, E) ein Graph. Frage: Gibt<br />

es einen Weg c1, . . . , cn, cj ∈ V = {1, . . . , n} durch alle Knoten mit<br />

[cj, cj+1] ∈ E, j = 1, . . . , n − 1?<br />

2. TSP(D): HP ≤ TSP (D), denn:<br />

Sei G = (V, E) ein<br />

<br />

Fall aus HP. R(G) = C, (dij), B mit C = V, B =<br />

1 falls [i, j] ∈ E<br />

n + 1 und dij =<br />

. G hat Hamilton’schen Weg<br />

2 sonst<br />

genau dann, wenn es eine Tour durch alle Städte mit Länge ≤ n + 1<br />

gibt.<br />

Alle Zahlen sind in der Reduktion polynomiell beschränkt, d. h., TSP<br />

(D) ist stark NP-vollständig!<br />

3. INTEGER PROGRAMMING: Sei A ganzzahlige m × n-Matrix, D<br />

ein m-stelliger Vektor. Frage: Gibt es einen ganzzahligen n-stelligen<br />

Vektor X mit AX ≤ D?<br />

SET COVERING ≤ INTEGER PROGRAMMING<br />

6 coNP<br />

6.1 NP und coNP<br />

Für die Frage, ob ein Problem (oder eine Sprache) in NP liegt, ist in dieser<br />

<strong>Vorlesung</strong> oft so argumentiert worden:<br />

Sei Φ ein Boole’scher Ausdruck und Fall von SAT. Rate Belegung und teste.<br />

Gibt es ein Zertifikat oder Zeugen, daß Φ wahr werden kann? Falls Φ wahr<br />

ist, gibt es <strong>im</strong>mer einen derartigen Zeugen.<br />

Dies gilt für Probleme in NP allgemein.


6 CONP 61<br />

Definition 6.1 Sei R ⊆ Σ ∗ × Σ ∗ eine binäre Relation auf Wörtern.<br />

R heißt polynomiell entscheidbar ⇔ ∃ deterministische Turing-Maschine,<br />

die die Sprache {x; y|(x, y) ∈ R} in polynomieller Zeit entscheidet.<br />

R heißt polynomiell balanciert ⇔ ∃k ∀(x, y) ∈ R gilt |y| ≤ |x| k .<br />

Theorem 6.1 Sei L ⊆ Σ ∗ . L ∈ NP ⇔ Es gibt eine polynomiell entscheidbare<br />

und polynomiell balancierte Relation R derart, daß<br />

L = {x|∃y ∈ Σ ∗ mit (x, y) ∈ R}<br />

Beweis:<br />

” ⇐“: Falls R existiert, dann wird L von folgender nichtdeterministischer<br />

Turing-Maschine M entschieden:<br />

Für Eingabe x rät M ein y (erzeugt nichtdeterministisch ein y) mit |y| ≤ |x| k .<br />

Für das Wort x; y wird dann die deterministische Turing-Maschine für R benutzt,<br />

um zu testen, ob (x, y) ∈ R. M akzeptiert, falls (x, y) ∈ R, und weist<br />

<strong>zur</strong>ück, falls (x, y) ∈ R. Das heißt, M akzeptiert x in nichtdeterministisch<br />

polynomieller Zeit genau dann, wenn x ∈ L.<br />

” ⇒“: Sei L ∈ NP. Das heißt, es existiert eine nichtdeterministische Turing-<br />

Maschine N, die L in Zeit |x| k für ein k entscheidet. Definiere R wie folgt:<br />

(x, y) ∈ R ⇔ y ist eine Kodierung einer akzeptierenden Berechnung von N<br />

bei Eingabe x. (Dies kann z. B. die Aneinanderreihung aller Konfigurationen<br />

y = C0, C1, . . . , C” yes“<br />

für ein i ≤ |x| k einer akzeptierenden Berechnung sein.<br />

i<br />

Jedes |Ci| ∈ O(|x| k ), also y ∈ O(|x| k · |x| k ) = O(|x| 2k )).<br />

R ist polynomiell balanciert, da y ≤ c|x| 2k . R ist auch polynomiell entscheidbar,<br />

da in linearer Zeit (in Bezug auf das Wort x; y) getestet werden kann,<br />

ob y tatsächlich eine akzeptierende Berechnung von x beschreibt. Da N L<br />

entscheidet, gilt L = {x|(x, y) ∈ R} q.e.d.<br />

Bemerkung: y wird dabei auch Zertifikat, Zeuge oder auch Testwort genannt.<br />

Es gibt <strong>im</strong>mer einen derartigen Zeugen, falls x ∈ L, d. h., falls die<br />

Antwort für unser Entscheidungsproblem ” yes“ lautet.<br />

In coNP sind gerade die Probleme, für die es negative Zertifikate gibt, die<br />

bezeugen, daß ein Fall nicht dazugehört bzw. die Antwort ” no“ hat. Das<br />

heißt, <strong>im</strong> Fall der negativen Antwort gibt es <strong>im</strong>mer ein kurzes (polynomielles)<br />

Zertifikat.<br />

Beispiele:<br />

1. co-HAMILTON PATH (coHP): Sei G = (V, E) ein Graph. Frage: Hat<br />

G keinen Hamilton’schen Weg?<br />

Für G ∈ LcoHP ist es schwierig, ein Zertifikat zu finden. Aber für<br />

G ∈ LcoHP (d. h. G ∈ LHP) hat man ein Zertifikat, das leicht zu testen<br />

ist: rate Pfad v1, . . . , vn und teste.


6 CONP 62<br />

2. VALIDITY (Allgemeingültigkeit): Sei Φ ein Boole’scher Ausdruck.<br />

Frage: Ist Φ allgemeingültig, d. h., ist Φ wahr für alle Belegungen?<br />

Antwort ” yes“. Welches Zertifikat soll man angeben?<br />

Antwort ” no“: Rate Belegung T und teste, ob T (φ) = false.<br />

VALIDITY und coSAT hängen eng zusammen:<br />

Das heißt:<br />

Φ ist allgemeingültig ⇔ ¬Φ ∈ LcoSAT<br />

Φ ∈ LVALIDITY ⇔ Für alle Belegungen T gilt: T (¬Φ) = false<br />

Zur Erinnerung: coNP = { ¯ L|L ∈ NP} und natürlich ¯ L = Σ ∗ \L, NP =<br />

{L| ¯ L ∈ coNP}.<br />

Satz 6.1 Eine Sprache L ist NP-vollständig ⇔ ¯ L = Σ ∗ \L ist coNPvollständig.<br />

Beweis: Sei L NP-vollständig, d. h. ∀M ∈ NP gilt: ∃R Reduktion mit<br />

∀x ∈ Σ ∗ : (x ∈ M ⇔ R(x) ∈ L)<br />

∀x ∈ Σ ∗ : (x ∈ M ⇔ R(x) ∈ L)<br />

∀x ∈ Σ ∗ : (x ∈ ¯ M ⇔ R(x) ∈ ¯ L)<br />

Das heißt, ∀ ¯ M ∈ coNP gilt: ∃R mit ∀x ∈ Σ ∗ x ∈ ¯ M ⇔ R(x) ∈ ¯ L, d. h., ¯ L<br />

ist coNP-vollständig. q.e.d.<br />

Gilt nun NP = coNP? Diese Frage ist noch offen! Falls P = NP, gilt NP =<br />

coNP. Falls NP = coNP, folgt für die P-NP-Frage ersteinmal nichts.<br />

Satz 6.2 Falls L coNP-vollständig und L ∈ NP, gilt coNP = NP.<br />

Beweis: Sei M ∈ coNP. Dann existiert eine Reduktion von M auf L. Wegen<br />

L ∈ NP folgt: M ∈ NP, also coNP ⊆ NP. Entsprechend gilt wegen Satz 6.1<br />

und ¯ L ∈ coNP für alle M ∈ NP: M ≤ ¯ L ∈ coNP, womit NP ⊆ coNP folgt.<br />

q.e.d.<br />

Wir wissen: P ⊆ NP ∩ coNP. Wir wissen nicht: NP = coNP?<br />

6.2 Pr<strong>im</strong>zahlen<br />

Problem PRIMES: Sei n ∈ N. Frage: Ist n Pr<strong>im</strong>zahl? PRIMES ist in coNP.<br />

Man findet leicht ein negatives Zertifikat n ∈ LPRIMES: Rate Teiler und<br />

teste.<br />

Problem coPRIMES (Composite Numbers): Sei n ∈ N. Frage: Gibt es a, b ∈<br />

N, 1 < a, b < n mit ab = n? coPRIMES ist in NP.


6 CONP 63<br />

Satz 6.3 (Fermat) Sei p eine beliebige ungerade Zahl ∈ N.<br />

p ist pr<strong>im</strong> ⇔<br />

∃r, 1 < r < p mit<br />

1. r p−1 = 1 mod p<br />

2. r p−1<br />

q = 1 mod p für alle Pr<strong>im</strong>zahlen q, die p − 1 teilen<br />

Theorem 6.2 (Pratt) PRIMES ∈ NP ∩ coNP.<br />

Beweis: Zu zeigen bleibt: PRIMES ∈ NP.<br />

Mit dem Satz von Fermat (Satz 6.3) können wir ein Zertifikat raten:<br />

Schritt 1: Rate r und teste, ob r p−1 = 1 mod p.<br />

Schritt 2: Rate q1, . . . , qk, Pr<strong>im</strong>faktoren von p−1. Teste, ob q1q2 . . . qk = p−1.<br />

Teste für alle i = 1, . . . , k, ob qi pr<strong>im</strong>. Das heißt, das Zertifikat wird rekursiv<br />

aufgebaut: C(p) = (r; q1, C(q1), q2, C(q2), . . . , qk, C(qk))<br />

Beispiel:<br />

Länge von C(p):<br />

C(67) = (2; 2, C(2), 3, C(3), 11, C(11))<br />

C(11) = (8; 2, C(2), 5, C(5))<br />

|C(p)| ≤ |r| +<br />

C(5) = (3; 2, C(2), 2, C(2))<br />

C(3) = (2, C(2))<br />

C(2) = (1)<br />

k<br />

i=1<br />

(|qi + C(qi)|) + 2k + 2<br />

<br />

Trennzeichen, Klammern<br />

Behauptung: |C(p)| ≤ 5 log 2 p.<br />

Für p = 2 bzw. p = 3 ist die Behauptung klar: |C(2)| = |(1)| = 3<br />

Weiterhin ist |r| ≤ log p, und für die Anzahl k der Teiler von p − 1 gilt<br />

k < log p. Außerdem ist q1 = 2 und qi ≥ 2. Damit ist Πqi ≥ 2 k und<br />

somit k < log p. Da Π k i=1 qi = p − 1, q1 = 2 und |qi| ≤ log qi + 1 gilt, folgt<br />

k<br />

i=1 |qi| ≤ 2 log p und k<br />

i=2 log qi ≤ log p−1<br />

2 .


6 CONP 64<br />

Induktionsvoraussetzung: |C(qi)| ≤ 5 log 2 qi (da qi < p)<br />

⇒<br />

|C(p)| ≤ 5 log p + 2 + |C(2)| + 5<br />

k<br />

log qi ≤ log<br />

i=2<br />

= 5 log p + 5 + 5<br />

p − 1<br />

2<br />

k<br />

log 2 qi < (log p − 1) 2<br />

i=2<br />

k<br />

i=2<br />

< log p − 1<br />

log 2 qi<br />

k<br />

i=2<br />

log 2 qi<br />

Also ist |C(p)| ≤ 5 log 2 p − 10 log p + 5 + 5 + 5 log p = 5 log 2 p + 10 − 5 log p.<br />

<br />

≤0 für p≥5<br />

Behauptung: C(p) kann in polynomieller Zeit getestet werden.<br />

Sei l = ⌈log p⌉. Berechne die Residuen r2 = rr, r4 = r2r2 , . . . , r2l =<br />

r2l−1r2l−1 (alle modulo p, da sonst die Zahlen zu groß würden). Es werden<br />

jeweils l Multiplikationen mit Zahlen der Länge ≤ l benötigt, Kosten<br />

jeweils O(l2 ). Max<strong>im</strong>al l Multiplikationen und Residuenbildungen werden<br />

für rx O(l<br />

mod p, 1 ≤ x ≤ p − 1 und beliebiges x gebraucht. Insgesamt also<br />

3 ).<br />

Das heißt, für r p−1 mod p und r p−1<br />

q i mod p wird insgesamt O(l 4 ) Zeit<br />

benötigt, etwa c log 4 p.<br />

Behauptung: T (C(p)) ≤ c log 5 p.<br />

Beweis durch Induktion:<br />

T (C(p)) ≤<br />

Schritt 1<br />

<br />

c log 4 Schritt 2<br />

<br />

k<br />

p + T (C(qi))<br />

≤ c log 4 p + c<br />

i=1<br />

k<br />

i=1<br />

log 5 qi<br />

≤ c log 4 <br />

k<br />

p + c(log p − 1) log qi<br />

Es ist log qi ≤ log p−1<br />

2 < log p − 1 und log qi ≤ log(p − 1) ≤ log p.<br />

Daher gilt:<br />

i=1<br />

T (C(p)) ≤ c log 4 p + c(log p − 1) log 4 p<br />

= c log 5 p − c log 4 p + c log 4 p<br />

= c log 5 p<br />

4<br />

q.e.d.


7 SCHLU<strong>SS</strong>BETRACHTUNGEN 65<br />

Bemerkungen:<br />

• Falls PRIMES NP-vollständig wäre, hätte man somit NP = coNP als<br />

Ergebnis!<br />

• Teststring, Zertifikat hier von polynomieller Länge (bisher meist linear,<br />

hier quadratisch in Bezug auf den Input).<br />

Was passiert, wenn man schon weiß, daß die zu testende Zahl von best<strong>im</strong>mter<br />

Form ist? Etwa eine Mersenne’sche Pr<strong>im</strong>zahl, also z = 2 p − 1 für eine<br />

Pr<strong>im</strong>zahl p. Man weiß, daß z von dieser Form sehr oft keine Pr<strong>im</strong>zahl ergibt.<br />

Wir können hier aber einen schnellen Test machen.<br />

Satz 6.4 (Lucas) Sei p eine Pr<strong>im</strong>zahl. Es gilt:<br />

Mp = 2 p − 1 ist pr<strong>im</strong> ⇔ up = 0 mod Mp<br />

Dabei ist u2 = 4 und ui+1 = u2 i − 2.<br />

Lucas Test für Mersenne’sche Pr<strong>im</strong>zahlen:<br />

begin u := 4<br />

for i = 3 to p do<br />

u := (u * u - 2) mod Mp<br />

if u = 0 mod Mp then ’Mp ist pr<strong>im</strong>’<br />

else ’Mp ist nicht pr<strong>im</strong>’<br />

end<br />

Komplexität: O(p 3 ).<br />

Bemerkung: Berechnung von a mod Mp geht besonders leicht, da Mp =<br />

p−1<br />

i=0 2i .<br />

7 Schlußbetrachtungen<br />

7.1 P gegen NP<br />

Wir haben gesehen, daß es nützlich ist, Probleme als NP-vollständig zu<br />

klassifizieren. Die Aussage ist: Falls ein Problem NP-vollständig ist, dann<br />

kennen wir keinen polynomiellen Lösungsalgorithmus (und wir wissen nicht,<br />

ob überhaupt einer existieren kann!). Wie verläuft nun die Trennlinie in NP?<br />

Theorem 7.1 Falls P = NP, dann gibt es eine Sprache L ∈ NP mit L ∈<br />

P und L ist nicht NP-vollständig.<br />

Beweis: Papad<strong>im</strong>itriou Seite 330-332.


7 SCHLU<strong>SS</strong>BETRACHTUNGEN 66<br />

coNP NP<br />

✬<br />

✬<br />

✩<br />

coNPvollständig<br />

• PRIMES<br />

NPvollständig<br />

✫<br />

• Validity<br />

P-vollständig<br />

• CIRCUIT<br />

VALUE<br />

✫<br />

✪<br />

• SAT<br />

• TSP (D)<br />

• GRAPH<br />

ISOMORPHIE<br />

✩<br />

✪<br />

GRAPH ISOMORPHIE ist ein wichtiges Problem, das bisher nicht so<br />

gut eingeordnet werden konnte (wichtig für Logik-Überprüfung be<strong>im</strong> Chip-<br />

Entwurf): Gegeben seien zwei Graphen G1 = (V1, E1) und G2 = (V2, E2).<br />

Frage: Sind G1 und G2 isomorph?<br />

Anders formuliert: Existiert eine Funktion f : V1 1−1<br />

→ V2, bei der für alle<br />

v1, u1 ∈ V1 gilt:<br />

[v1, u1] ∈ E1 ⇔ [f(v1), f(u1)] ∈ E2<br />

7.2 Orakel<br />

Gibt es Welten, in denen man die Frage P = NP leichter beantworten kann?<br />

Vorstellung: Ein Algorithmus arbeitet an einem Problem, weiß an einer Stelle<br />

nicht so recht weiter, der Fortgang hängt davon ab, ob ein boole’scher<br />

Ausdruck erfüllbar ist oder nicht.<br />

Die Antwort darauf wird unmittelbar gegeben. Ein ” freundliches“ Orakel<br />

löst uns SAT sofort.<br />

Definition 7.1 Eine Turing-Maschine M mit Orakelmenge A ist eine<br />

Mehrband-Turing-Maschine mit einem speziellen Frageband und speziellen<br />

Zuständen q? – Fragezustand, q ” yes“ und q ” no“ – Antwortzustände.<br />

q? geht über entweder in q ” yes“, falls das Wort auf dem Frageband in A liegt,<br />

oder in q ” no“, falls das Fragewort nicht in A liegt.<br />

Turing-Maschine M A<br />

⊲ x1 . . .<br />

♦<br />

✎<br />

a1 . . .<br />

ak<br />

⊲<br />

✲<br />

⊲<br />

. . .<br />

. . .<br />

⊲ . . .<br />

Fragewort (∈ A → q ” yes“, ∈ A → q ” no“)


7 SCHLU<strong>SS</strong>BETRACHTUNGEN 67<br />

Die Komplexität ist genauso definiert wie bei Klassen ohne Orakel (deterministisch<br />

und nicht-deterministisch). Unrealistisch ist allerdings, daß jede<br />

Frage aus dem Orakel als nur ein Schritt zählt.<br />

Definition 7.2 Sei C eine deterministische oder nichtdeterministische<br />

Komplexitätsklasse. Dann ist C A die Klasse von Sprachen, die durch Maschinen<br />

desselben Typs wie für C akzeptiert wird, aber versehen mit einem<br />

Orakel A.<br />

Theorem 7.2 Es gibt Orakel A und B mit<br />

1. P A = NP A<br />

2. P B = NP B<br />

Beweis:<br />

1. Sei A eine PSPACE-vollständige Sprache. Dann gilt:<br />

PSPACE a b c<br />

A A<br />

⊆ P ⊆ NP ⊆ NPSPACE d<br />

⊆ PSPACE, also P A = NP A<br />

(a) Sei L ∈ PSPACE. Man nehme eine deterministische Turing-Maschine,<br />

die L auf A in polynomieller Zeit reduziert, und stelle<br />

dann die Frage aus Orakel A genau einmal.<br />

(b) Trivial (da jede deterministische Turing-Maschine auch nichtdeterministische<br />

Turing-Maschine)<br />

(c) Jede nichtdeterministische Turing-Maschine M mit Orakel A, die<br />

in polynomieller Zeit arbeitet, kann durch eine nichtdeterministische<br />

Turing-Maschine M ′ mit polynomiellem Platz, die auch A<br />

selbst beantwort, s<strong>im</strong>uliert werden.<br />

(d) Satz von Savitch<br />

2. Papad<strong>im</strong>itriou S. 340 bis 342<br />

7.3 PSPACE<br />

Wie sehen nun ” natürliche“ vollständige Probleme in PSPACE aus?<br />

QBF (quantifizierte Boole’sche Formel): Sei E =<br />

Q1x1Q2x2 . . . Qmxm eine Boole’sche Formel mit Φ(x1, . . . , xm) – Boole’scher<br />

Ausdruck und Qi ∈ {∃, ∀}. Frage: Ist E wahr?<br />

QBF (auch QSAT, quanitifisiertes SAT ) ist PSPACE-vollständig.<br />

WORT-CS: Sei G eine kontextsensitive Grammatik und w ein Wort ∈ Σ ∗ .<br />

Frage: Ist w ∈ L(G)?<br />

WORT-CS ist PSPACE-vollständig.


7 SCHLU<strong>SS</strong>BETRACHTUNGEN 68<br />

Kontextsensitive Sprachen: L(G) = L(M) mit M nichtdeterministische<br />

Turing-Maschine mit Platz O(n) (linear beschränkte Turing-Maschine.<br />

Sei L ∈ PSPACE, d. h. es existiert eine Turing-Maschine N, die L in p(n)<br />

Platz akzeptiert, d. h. w ∈ L wird in p(|w|) Platz entschieden.<br />

Trick: Padding. Jedes Wort w ∈ Σ ∗ wird mit Reduktion R (log space) zu<br />

einem Wort R(w) = w# . . . # mit |R(w)| = p(|w|) aufgeblasen. # sind<br />

hierbei Sondersymbole, Pseudoblanks. Das Wort R(w) wird nun in linearem<br />

Platz entschieden.<br />

Viele verallgemeinerte Spiele wie GO sind auch PSPACE schwer!<br />

7.4 Parallele Komplexitätsklassen<br />

Ein Modell für Parallelität, das schon in diesem <strong>Skript</strong> aufgetreten ist: Familie<br />

von (Boole’schen) Schaltkreisen C = (C0, C1, . . . ), Ci mit i Inputgates.<br />

Betrachtet werden nur uniforme Familien von Schaltkreisen: Es existiert<br />

Turing-Maschine mit logarithmischen Platz, die für jede Eingabe 1 n die<br />

Ausgabe Cn produziert. (Intuitiv: eine uniforme Familie von Schaltkreisen<br />

entspricht der gleichen algorithmischen Idee). Sie dient dazu, unsinnige Konstruktionen<br />

zu vermeiden (auch platzkonstruierbar).<br />

Parallele Komplexität:<br />

Definition 7.3 (Größe und Tiefe eines Schaltkreises) Sei C ein<br />

Schaltkreis. Dann ist depth(C) die Länge des längsten Weges in C (genannt<br />

Tiefe von C) und size(C) die Anzahl der Gatter von C (genannt Größe von<br />

C).<br />

Definition 7.4 Sei C = (C0, C1, . . . ) eine uniforme Familie von Schaltkreisen,<br />

f, g : N → N Funktionen. Die parallele Zeit von C ist kleiner oder<br />

gleich f(n), falls für alle n die Tiefe von Cn kleiner oder gleich f(n) ist,<br />

falls also gilt:<br />

∀n ∈ N depth(Cn) ≤ f(n).<br />

Die Gesamtarbeit von C ist kleiner oder gleich g(n), falls für alle n die<br />

Größe von Cn kleiner oder gleich groß ist, falls also gilt:<br />

∀n ∈ N size(Cn) ≤ g(n).<br />

Definition 7.5 Seien f, g : N → N Funktionen und L eine Sprache. Es<br />

gilt:<br />

L ∈ PT/WK(f(n), g(n)) ⇔<br />

Es existiert eine uniforme Schaltkreisfamilie C, die L in paralleler Zeit<br />

O(f(n)) und mit O(g(n)) Arbeit entscheidet.<br />

Man kann zeigen: REACHABILITY ∈ PT/WK (log 2 n, n 3 log n).


7 SCHLU<strong>SS</strong>BETRACHTUNGEN 69<br />

Weitere Klassen: NC (NICK’S CLA<strong>SS</strong>), NCj = ∞ k=1 PT/WK<br />

(log j n, nk ) (polynomielle Arbeit, parallele Zeit O(log 3 n)). NC = ∞ j=1 NCj.<br />

NC sieht man heute vom komplexitätstheoretischen Ansatz her als die Klasse<br />

an, in der Probleme stecken, die mit vernünftigem Hardwareaufwand schnell<br />

zu lösen sind.<br />

Theorem 7.3 NC1 ⊆ L ⊆ NL ⊆ NC2 ⊆ NC ⊆ P<br />

Man weiß derzeit nicht, ob irgendein echtes Enthaltensein vorliegt!<br />

P-vollständige Probleme, wie CIRCUIT VALUE, sind diejenigen Kandidaten,<br />

die am ehesten nicht in NC liegen. Man spricht dann auch von inhärent<br />

sequentiellen Problemen.<br />

Was weiß man: REACHABILITY und 2SAT sind NL-vollständig.<br />

RLP<br />

✠<br />

P-vollständig<br />

P<br />

NC<br />

NC2<br />

NL<br />

L<br />

NC1<br />

P-vollständig: MAXFLOW(D), LINEAR PROGRAMMING (RLP)<br />

Ellipsoidmethode (Khachiyan, 70): A ∈ Z m×n , B ∈ Z m ∃Y ∈ Q n mit AY ≤<br />

B?<br />

Literaturliste<br />

Bücher <strong>zur</strong> <strong>Vorlesung</strong> <strong>Komplexitätstheorie</strong>:<br />

• Papad<strong>im</strong>itriou, Christos H., Computational Complexity, Addison-<br />

Wesley Publishing Company, 1994<br />

• Garey, M. R., Johnson, D. S., Computers and Intractabilty, A Guide<br />

to the Theory of NP-Completeness, Freeman and Company, 1979<br />

• Hopcroft, Ullman, Einführung in die Automatentheorie, Formale Sprachen<br />

und <strong>Komplexitätstheorie</strong>, 3. Auflage 1994<br />

• Reischuk, Karl Rüdiger, Einführung in die <strong>Komplexitätstheorie</strong>, Teubner,<br />

1990


Index<br />

Übergangsfunktion, 11, 15<br />

Adjazenzmatrix, 3<br />

akzeptieren, 14, 24<br />

Algorithmus, 2<br />

pseudopolynomiell, 59<br />

aufzählbar<br />

rekursiv, 14<br />

balanciert<br />

polynomiell, 61<br />

berechenbar<br />

rekursiv, 14<br />

berechnen, 14<br />

Bipartites Matching, 9, 10<br />

Boole’scher Schaltkreis, 43<br />

Boolean Circuit, 43<br />

Breitensuche (breadth-first), 3<br />

CIRCUIT SAT, 44<br />

CIRCUIT VALUE, 44, 47, 50, 69<br />

CLIQUE, 54, 55<br />

co-HAMILTON PATH, 61<br />

coHP, 61<br />

coNP, 60, 62<br />

coPRIMES, 62<br />

coSAT, 62<br />

CS, 39<br />

entscheidbar<br />

polynomiell, 61<br />

rekursiv, 14<br />

entscheiden, 14, 24<br />

Entscheidungsproblem, 2, 7, 14<br />

EXACT COVER BY 3-SETS, 60<br />

EXP, 28, 32<br />

Fall, 1<br />

Familie, 68<br />

Fermat, Satz von, 63<br />

Gesamtarbeit, 68<br />

Graph, 1, 3<br />

70<br />

GRAPH ISOMORPHIE, 66<br />

Haltesprache, 29–31<br />

HAMILTON PATH, 41, 60<br />

Heiratsproblem, 9<br />

Hierachie-Theorem, 32, 33<br />

HP, 41, 60<br />

Immerman, Szelepscényi, Theorem<br />

von, 37, 38<br />

INDEPENDENT SET, 53<br />

INDSET, 53<br />

Instanz, 1<br />

INTEGER PROGRAMMING, 60<br />

KNAPSACK, 58<br />

Kodierung, 15<br />

Komplement, 28<br />

Komplexitätsklasse, 16<br />

Konfiguration, 13, 15<br />

L, 28, 35<br />

Lucas, Satz von, 65<br />

MATCHING, 9<br />

3D-MATCHING, 59<br />

MAXFLOW, 7–10<br />

Modell, 68<br />

NC, 69<br />

Netzwerk, 5<br />

NICK’S CLA<strong>SS</strong>, 69<br />

NL, 28, 35<br />

NODE COVER, 55<br />

NP, 24, 27, 34, 35, 60, 62<br />

NPSPACE, 28<br />

NSPACE, 27, 37, 39<br />

NTIME, 24, 25, 27<br />

O-Notation, 3<br />

Opt<strong>im</strong>ierungsproblem, 7<br />

P, 20, 24, 27, 32, 34, 35, 62


INDEX 71<br />

P-NP-Frage, 10, 62, 66<br />

Padding, 68<br />

PARTITION, 57<br />

PATH, 36<br />

Platz, 21, 26<br />

Platzhierachie, 32<br />

polynomiell verwandt, 15<br />

Pratt, Theorem von, 63<br />

PRIMES, 62<br />

PSPACE, 28, 35, 37, 67<br />

QBF, 67<br />

QSAT, 67<br />

RAM, 2, 22, 26<br />

REACHABILITY, 2, 8, 9, 14, 21,<br />

26, 28, 35, 36<br />

Reduktion, 9, 10, 40<br />

Rucksackproblem, 58<br />

SAT, 41, 43, 49, 60<br />

2SAT, 51<br />

3SAT, 51<br />

MAX2SAT, 52<br />

NAESAT, 53<br />

quantifisiertes, 67<br />

Savitch, Theorem von, 36<br />

SET COVERING, 59<br />

SPACE, 21, 27, 36, 37<br />

SUM, 55<br />

SUMME VON UNTERMEN-<br />

GEN, 55<br />

Tafelmethode, 46<br />

Testwort, 61<br />

Tiefe, 68<br />

Tiefensuche (depth-first), 3<br />

TIME, 16, 27<br />

Transitive Hülle, 13<br />

Traveling Salesman Problem, 10<br />

TSP, 28, 60<br />

Turing-Maschine, 2, 11, 13–15, 21,<br />

23, 26, 29<br />

k-Band, 15, 16, 21<br />

mit Ein- und Ausgabe, 21<br />

mit Orakelmenge, 66<br />

nichtdeterministisch, 23, 24,<br />

26<br />

universell, 29<br />

VALIDITY, 62<br />

Vollständigkeit, 45<br />

coNP-vollständig, 62<br />

NP-vollständig, 49, 59, 62, 65<br />

P-vollständig, 47<br />

Wachstum<br />

nicht polynomielles, 4<br />

polynomielles, 4<br />

Wahrheitsbelegung, 43<br />

Wert, 6<br />

worst case, 5<br />

WORT-CS, 67<br />

Zeit, 16<br />

parallel, 68<br />

Zeithierachie, 32<br />

Zertifikat, 61<br />

Zeuge, 61

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!