Komplexitätstheorie Spezialgebiet für Komplexe Systeme Yimin Ge 5ahdvn Inhaltsverzeichnis 1 Begriffe und Definitionen 1 2 Beispiele 2 3 Die 3.1 3.2 3.3 3.4 1 Klassen P und N P Die Komplexitätsklasse P . . . . . Die Klasse F P und Reduzierbarkeit Die Komplexitätsklasse N P . . . . N P-Vollständigkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 6 8 9 Begriffe und Definitionen Definition 1. Sei f : D → R eine Funktion mit Definitionsbereich D. Dann sei O(f ) := {g : D → R | ∃C ∈ R+ : ∀x ∈ D : |g(x)| ≤ C|f (x)|}. Bemerkung 1. Im Rahmen der Komplexitätstheorie ist meist D = N. Bemerkung 2. In der Literatur ist es üblich, statt f ∈ O(g) die vereinfachte, genau genommen aber mathematisch nicht ganz korrekte Notation f (x) = O(g(x)) zu verwenden. Ich werde im Rahmen dieses Artikels ebenfalls von dieser Notation Gebrauch machen. Beispiel 1. Es gilt n2 + 1 = O(n2 ) n3 + n + cos(n) = O(n3 ) 11n3 + 3n2 + 4n + 9 = O(n3 ) n2 log2 (n) + 3n2 = O(n2 log n). 1 Wir sehen zB anhand des letzten Beispiels, dass die Angabe einer Logarithmenbasis für die O-Notation nicht notwendig ist, da diese sich nur auf die Konstante auswirkt. Im folgenden bezeichne ein Problem eine allgemeine Aufgabe, eine Instanz des Problems bezeichnet hingegen einen konkreten Fall. Ferner wird zwischen Entscheidungsproblemen und Suchproblemen unterschieden. Beispielsweise ist die Faktorisierung einer natürlichen Zahl ein Suchproblem, die Faktorisierung von 1234567 eine Instanz des Problems. Definition 2. Sei A ein Algorithmus und T (n) die Laufzeit von A in Abhängigkeit von der Eingabelänge n. Dann heißt A polynomial, wenn es eine positive ganze Zahl k gibt, sodass T (n) = O(nk ). Es zeigt sich, dass die Eigenschaft, ob ein Algorithmus polynomial ist, nicht vom konkreten Modell der Berechnung (Turingmaschine, RAM, Workstation, etc) abhängt. Definition 3. Ein Problem heiße polynomial, wenn es einen polynomialen Lösungsalgorithmus besitzt. Definition 4. Sei L eine formale Sprache über einem Alphabet Σ. Dann sagen wir, dass L von der Ordnung g(n) ist, falls es eine Algorithmus mit Laufzeit T (n) = O(g(n)) gibt, der feststellt, ob ein gegebenes Wort w ∈ Σ∗ in L enthalten ist. Insbesondere bezeichnen wir also L als polynomial, wenn es einen polynomialen Algorithmus gibt, der feststellt, ob ein gegebenes Wort w ∈ Σ∗ in L liegt. Man sieht leicht, dass jedes Entscheidungsproblem äquivalent zu einer formalen Sprache ist (und umgekehrt), denn die Frage, ob ein gegebenes Wort zu einer Sprache gehört ist trivialerweise ein Entscheidungsproblem und umgekehrt kann die Eingabe jedes Entscheidungsproblems mit einem Wort über einem Alphabet vernünftig kodiert werden (ohne näher auf den Begriff der Vernünftigkeit einer Kodierung einzugehen). Die Frage, auf welche Eingaben die Antwort des Entscheidungsproblems “Ja” lautet, kann also auf die Sprache dieser kodierter Eingaben zurückgeführt werden. Es gilt also Satz 1. Entscheidungsproblem ≡ formale Sprache. 2 Beispiele Betrachten wir nun einige einfache Beispiele (in C), um die Analyse der Komplexität eines Algorithmus zu demonstrieren. Beispiel 2 (Bubblesort). Gegeben sei folgender Sortieralgorithmus (Bubblesort) für die Sortierung eines Arrays: 2 /∗ ∗ ∗ @param i n t ∗ array Feld , w e l c h e s s o r t i e r t werden s o l l ∗ @param int n Größe d e s Arrays ∗/ void b u b b l e s o r t ( i nt ∗ a r r a y , i nt n ) { i nt i , j , tmp ; for ( i =0; i < n ; i ++) { for ( j =0; j < n−1− i ; j ++) { i f ( a r r a y [ j ] > a r r a y [ j + 1 ]) { tmp = a r r a y [ j ] ; a r r a y [ j ]= a r r a y [ j + 1 ] ; a r r a y [ j +1]=tmp ; } } } } Wir haben zwei Schleifen, eine äußere (Laufvariable i) und eine innere (Laufvariable j). Die äußere Schleife wird auf jeden Fall genau n Mal, die innere beim ersten Durchlauf n−1 Mal, beim zweiten Durchlauf n−2 Mal usw durchlaufen. In jedem dieser Schleifendurchgänge wird eine Operation durchgeführt, die unabhängig von der Eingabelänge n ist und deren Zeitkomplexität daher nach oben sicherlich als konstant abgeschätzt werden kann. Für die Laufzeit T (n) von Bubblesort gilt daher n(n − 1) = O(n2 ) T (n) = O(K ((n − 1) + (n − 2) + · · · + 1)) = O K 2 für eine Konstante K. Beispiel 3 (Binäre Suche). Gegeben sei folgender Suchalgorithmus (Binäre Suche) für ein sortiertes Array: /∗ ∗ ∗ @param i n t ∗ array Feld , i n dem g e s u c h t werden s o l l ∗ @param int n Größe d e s Arrays ∗ @param int pattern Suchmuster ∗ @return int −1 f a l l s n i c h t gefu n den , s o n s t i n d e x ∗/ i nt b i n a r y S e a r c h ( i nt ∗ a r r a y , i nt n , i nt p a t t e r n ) { i nt l e f t =0 , middle , r i g h t=n , i n d e x =−1; while ( l e f t <= r i g h t && index <0 ) { middle = ( l e f t +r i g h t ) / 2 ; i f ( a r r a y [ middle ] < p a t t e r n ) { l e f t = middle +1; 3 } e l s e i f ( a r r a y [ middle ] > p a t t e r n ) { r i g h t = middle −1; } else { i n d e x = middle ; } } return i n d e x ; } In diesem Beispiel wird das Feld ihrer Größe nach so lange halbiert, bis das Element gefunden wird oder die Halbierung nicht mehr möglichi ist. Im schlimmsten Fall, wenn also das Element nicht im Array vorkommt, wird die Halbierung so oft wie möglich durchgeführt. Für disen Fall werden log2 (n) Schritte benötigt. Alle weiteren Programmteile hängen nicht von der Eingabegröße n ab und können daher nach oben mit einer Konstante abgeschätzt werden. Für die Laufzeit T (n) gilt daher T (n) = O(K log2 (n)) = O(log(n)) für eine Konstante K. 3 Die Klassen P und N P Obwohl wesentlich feinere Differenzierungen hinsichtlich der Komplexität von Problemen möglich sind, sind vor allem zwei Komplexitätsklassen von großer Bedeutung, nämlich die Klasse P aller effizeint lösbarer Probleme und die Klasse N P aller Probleme, für die eine Überprüfung, ob eine gebotene Lösung zu einer Probleminstanz tatsächlich eine Lösung ist, polynomial ist. Es ist bis heute unbekannt ob P = N P gilt. Diese Frage gehört zu den 7 Millenium-Problemen, deren Lösung jeweils eine Million US-Dollar wert sind. Es gibt allerdings eine Vielzahl sogennanter N P-vollständiger Probleme, von denen man weiß, dass jedes Problem in N P auf diese (effizient) zurückgeführt werden können. Falls also gezeigt werden kann, dass eines dieser Probleme in P liegt, würde P = N P folgen. Nach Satz 1 ist jedes Entscheidungsproblem äquivalent zu einer formalen Sprache. Wir können uns also bei der Behandlung der Komplexitätsklassen auf formale Sprachen und deren Akzeptanz beschränken. 3.1 Die Komplexitätsklasse P Intuitiv kann die Komplexitätsklasse P als Klasse aller Entscheidungsprobleme, für die es ein Polynom P (n) und einen Algorithmus gibt, der für jede Eingabe der Länge n höchstens P (n) Einzelschritte bzw. Zeiteinheiten benögtigt, um die Instanz dieses Entscheidungsproblems zu lösen, auffassen. 4 Wie bereits erwähnt benötigt die genaue Frage nach der Zeitkomplexität bzw nach dem konkrenten Polynom P die genaue Spezifikation der zu Grunde liegenden Maschine. Im Rahmen dieses Artikels werden wir uns der gewöhnlichen, deterministischen Turing-Maschine bedienen. Ohne näher auf den Beweis einzugehen sei aber betont, dass die konkrete Maschinenimplementierung für die Frage, ob ein Problem in P liegt, absolut irrelevant ist. Definition 5. Wir sagen, dass eine deterministische Turingmaschine eine Zeitkomplexität von T (n) hat (wobei T (n) eine Funktion aus N ist), wenn die TM für jede Eingabe der Länge n in höchstens T (n) Schritten anhält. Definition 6. Wir bezeichnen mit P die Klasse aller formalen Sprachen, für die es eine deterministische Turingmaschine M und ein Polynom P (n) gibt, sodass L = L(M) gilt und M die Zeitkomplexität P (n) hat. Das in Abschnitt 2 genannte Beispiel zur binären Suche (als Entscheidungsproblem formuliert entspricht dies der Frage, ob ein gegebenes Element in eimem (sortierten) Feld enthalten ist) ist trivialerweise polynomial, denn es gilt sicherlich log(n) < Kn für hinreichend große Konstanten K. Bemerkung 3. Da es für eine Turingmaschine keine Möglichkeit gibt, sprunghaft den Lese/Schreibkopf zu ändern, sondern den Kopf immer nur um eine Position nach links oder eine Position nach rechts bewegen kann, muss die Ordnung, die wir für die Implementierung einer Turingmaschine erhalten, im Allgemeinen nochmals mit n multipliziert werden (ein Sprung entspricht ca n Einzelschritten). Dies ist jedoch für die Frage, ob ein gegebener Algorithmus polynomial (und das entsprechende Problem daher in P liegt) irrelevant. Weitere Beispiele für Probleme aus P sind: Beispiel 4 (Palindrom). Gegeben sei ein beliebiges Wort über einem beliebigen Alphabet. Die Frage sei nun, ob dieses Wort ein Palindrom ist. Betrachten wir dazu folgende Implementierung in C: i nt pa lindr o m ( char ∗ s , i nt n ) { i nt i ; for ( i =0; i < n / 2 ; i ++) { i f ( s [ i ] != s [ n−1−i ] ) return 0 ; } return 1 ; } Dieser Algorithmus ist linear, denn es gibt nur eine Schleife, die n/2 Mal durchlaufen wird und alle anderen Operationen unabhängig von der Eingabelänge sind. Das Palindrom-Problem ist also aus P. Man kann den Algorithmus auch sehr einfach auf einer Turingmaschine (mit zusätzlichem Gedächtnis) mit einer Zeitkomplexität von O(n2 ) implementieren. 5 Beispiel 5 (2-Färbung). Gegeben sei ein ungerichteter Graph G = (V, E), für den festgestellt werden soll, ob eine Färbung der Knoten (oBdA in Rot und Blau) existiert, sodass keine zwei durch eine Kante verbundenen Knoten gleich gefärbt sind. Es ist offensichtlich, dass keine solche Färbung existiert, wenn es einen Zyklus ungerader Länge gibt. Falls es keine Zyklen ungerader Länge gibt, so kann der Graph mit folgendem Algorithmus gefärbt werden: wir wählen einen beliebigen Knoten v und färben ihn rot. Anschließend werden alle Nachbarn von v blau gefärbt. Da es keine Zyklen ungerader Länge und insbesondere also kein Dreieck gibt, verursacht dies keine Probleme. Anschließend werden alle Nachbarn der zuletzt gefärbten Knoten rot gefärbt. Da es keine Zyklen der Länge 5 gibt, verursacht dies keine Probleme. Dies wird so lange fortgesetzt bis alle Knoten, die von v aus erreicht werden können, gefärbt sind. Danach wird die gesamte Prozedur wieder für einen noch nicht gefärbten Knoten durchgeführt. Dies wird so lange wiederholt, bis alle Knoten gefärbt sind. Dieser Algorithmus ist linear, da jeder Knoten nur einmal behandelt wird. Für die Feststellung, ob die Färbung möglich ist, wird eine zusätzliche Überprüfung pro Kante benötigt. Damit ist die Laufzeit des Algorithmus aus O(n + k), wobei n die Anzahl der Knoten und k die Anzahl der Kanten seien. Das Problem der 2-Färbung ist somit aus P. Es ist im Übrigen nicht schwer, obigen Algorithmus auf einer Turingmaschine zu implementieren und zu zeigen, dass er polynomial ist. 3.2 Die Klasse F P und Reduzierbarkeit Wir haben die Klasse P für Entscheidungsprobleme definiert. Analog kann man die Klasse F P für effizient (dh polynomial) lösbare Berechnungsprobleme einführen. Definition 7. Wir bezeichnen mit F P die Klasse aller Funktionen f : Σ∗ → Γ∗ mit Alphabeten Σ und Γ, für die es ein Polynom P (n) und eine deterministische Turingmaschine mit der Zeitkomplexität P (n) gibt, die für jedes Wort w ∈ Σ∗ das Wort f (w) auf das Band schreibt. Beispiel 6 (2-Färbung). Gesucht sei ein Algorithmus, der jedem ungerichteten Graphen eine Zweifärbung berechnet, sofern dies möglich ist. Wir haben in Beispiel 5 einen linearen Algorithmus zur Konstruktion angegeben. Das Berechnungsproblem der Zweifärbung ist somit in F P. Definition 8. Sei L eine Sprache über einem Alphabet Σ und L′ eine Sprache über einem Alphabet Γ. Dann sagen wir, dass L auf L′ in polynomialer Zeit reduzierbar (oder einfach reduzierbar ) ist, wenn es eine Funktion f : Σ∗ → Γ∗ aus F P gibt, sodass für alle x ∈ Σ∗ x∈L f (x) ∈ L′ ⇔ gilt. Falls L auf L′ in polynomialer Zeit reduzierbar ist, schreiben wir auch L ⊳ L′ . 6 Bemerkung 4. Es ist wichtig, dass f in F P liegt, denn sonst wäre jede beliebige Sprache L auf jede beliebige andere Sprache L′ trivial reduzierbar, indem wir nämlich zwei verschiedene, beliebige Wörter w und w ′ über Γ wählen und ( w falls x ∈ L f (x) = w ′ falls x 6∈ L setzen. Beispiel 7 (Kanten-2-Färbbarkeit). Wir wollen zu einem gegebenen ungerichteten Graphen G wissen, ob sich seine Kanten derart mit zwei Farben (oBdA rot und blau) färben lassen, sodass keine zwei Kanten, die einen gemeinsamen Knoten haben, gleich gefärbt sind. Dieses Entscheidungsproblem kann wie folgt auf das Entscheidungsproblem der 2-Färbung (siehe Beispiel 5) reduziert werden: wir konstruieren einen dualen Graphen Ĝ, dessen Knoten die Kanten von G sind und zwei Kanten von G genau dann in Ĝ verbunden sind, wenn sie in G einen gemeinsamen Knoten besitzen. Wir sehen, dass jede 2-Färbung von Ĝ eine Kanten-2-Färbung von G ergibt und umgekehrt. Folglich ist Ĝ genau dann 2-färbbar, wenn G Kanten-2-färbbar ist. Um zu zeigen, dass das Problem der Kanten-2-Färbbarkeit in P liegt, muss noch gezeigt werden, dass die Reduktion in polynomialer Zeit durchführbar ist. Falls die Graphen mit Adjazenzmatrizen implementiert sind, kann einer Matrix M auf folgende Weise die entsprechende Matrix M̂ zugeordnet werden: Die Zeilen und Spalten von M̂ sind mit allen Paaren (i, j) markiert, für die i ≤ j und Mij = 1 gilt. Weiters hat M̂ in der Zeile mit (i, j) und der Spalte mit (i′ , j ′ ) genau dann eine 1, wenn wenn i = i′ oder j = j ′ gilt. Diese Konstruktion kann mit einer Laufzeit von O(n2 ) durchgeführt werden, wobei n die Anzanhl der Knoten ist (also M die Größe n × n hat). Aus der Abgeschlossenheit von Polynomen bezüglich der Komposition folgt unmittelbar Satz 2. Die ⊳-Relation ist transitiv, d.h. falls L1 ⊳ L2 und L2 ⊳ L3 für drei Sprachen L1 , L2 , L3 gilt, so folgt auch L1 ⊳ L3 . Beweis. Seien Σ1 , Σ2 , Σ3 jeweils die Alphabete, denen L1 , L2 , L3 zugrunde liegen. Wegen L1 ⊳ L2 und L2 ⊳ L3 gibt es Funktionen f1 : Σ∗1 → Σ∗2 und f2 : Σ∗2 → Σ∗3 , sodass für alle x ∈ Σ∗1 x ∈ L1 ⇔ f1 (x) ∈ L2 und für alle x ∈ Σ∗2 x ∈ L2 ⇔ f2 (x) ∈ L3 gilt. Weiters gibt es wegen f1 , f2 ∈ F P Turingmaschinen M1 bzw. M2 mit Zeitkomplexitäten P1 (n) bzw P2 (n), die f1 bzw. f2 berechnen, wobei P1 (n) und P2 (n) Polynome sind. Es sei h := f2 ◦ f1 . Dann gilt für alle x ∈ Σ∗1 , dass x ∈ L1 ⇔ h(x) ∈ L3 . 7 Es bleibt somit zu zeigen, dass h in F P liegt. Betrachten wir dazu eine Turingmaschine M , die zunächst M1 und anschließend M2 mit der Ausgabe von M1 simuliert. Offensichtlich berechnet M die Funktion h. Die Ausgabe von M1 hat höchstens die Länge n + P1 (n), also benötigt M höchstens P1 (n) + P2 (n + P1 (n)) Schritte, also liegt h in F P. Satz 3. Seien L ⊂ Σ∗ und L′ ⊂ Γ∗ Sprachen, sodass L in polynomialer Zeit auf L′ reduzierbar ist. Falls L′ in P liegt, dann gehört auch L zu P. Beweis. Laut Voraussetzung gibt es eine deterministische Turingmaschine M ′ , die L′ ⊂ Γ akzeptiert und ein Polynom P (n) als Zeitkomplexität hat. Weiters gibt es eine Funktion f : Σ∗ → Γ∗ und eine deterministische Turingmaschine M mit polynomialer Zeitkomplexität Q(n), die f berechnet. Wir betrachten nun eine Turingmaschine M , die zunächst M simuliert, d.h. für jede Eingabe x aus Σ∗ wird das Wort f (x) auf das Band geschrieben, wenn M anhält. Anschließend wird das restliche Band geleert. Dieser Prozess hat die Zeitkomplexität O(Q(n)). Anschließend wird M ′ simuliert. Dieser Prozess hat die Zeitkomplexität O(P (Q(n))), da das Ergebnis von M ′ maximal Q(n) lang ist. Es folgt daher, dass M eine Zeitkomplexität von O(Q(n) + P (Q(n))) hat. M akzeptiert aber genau dann, wenn M ′ akzeptiert. Andererseits akzeptiert aber nach Konstruktion M genau die Sprache L, also gilt L = L(M ) und daher L ∈ P. 3.3 Die Komplexitätsklasse N P Intuitiv kann man die Komplexitätsklasse N P als die Klasse aller Entscheidungsprobleme (oder formaler Sprachen), die zwar nicht notwendigerweise in polynomialer Zeit lösbar sind, allerings die Eigenschaft haben, dass in polynomialer Zeit überprüft werden kann, ob eine “angebotene” Lösung die Aufgabe wirklich löst, erklären. Beispiel 8 (Zerlegbarkeit). Gegeben sei eine positive ganze Zahl n > 1. Gefragt ist, ob es positive ganze Zahlen p, q < n gibt, sodass n = pq gilt. Dies ist ein Problem, das in der Mathematik seit tausenden von Jahren behandelt wird. Trotzdem ist nicht bekannt, ob das Problem der Zerlegbarkeit in P liegt. Allerdings liegt das Problem offensichtlich in N P, denn falls Zahlen p, q als Zerlegung von n “angeboten” werden, so kann effizient überprüft werden, ob tatsächlich n = pq gilt (die Multiplikation zweier Zahlen p, q hat einen Aufwand von O(log p + log q) und ist damit sicherlich polynomial. Definition 9. Wir sagen, dass eine nichtdeterministische Turingmaschine M die Zeitkomplexität T (n) hat, falls es für jede Eingabe der Länge n, die M akzeptiert, eine akzeptierende Berechnung gibt, die höchstens T (n) Berechnungsschritte benötigt. 8 Definition 10. Wir bezeichnen mit N P die Klasse aller formaler Sprachen, die von einer nichtdeterministischen Turingmaschine mit polynomialer Zeitkomplexität akzeptiert (oder gelöst) werden können. Ohne Beweis sei folgender Satz erwähnt: Satz 4. Jede nichtdeterministische Turingmaschine mit Zeitkomplexität T (n) kann von einer deterministischen Turingmaschine mit der Zeitkomplexität O(K T (n) ) simuliert werden, wobei K eine Konstante ist. 3.4 N P-Vollständigkeit Wie bereits erwähnt ist nicht bekannt, ob P = N P gilt. Es gibt allerdings einige Probleme in N P, die bei dieser Frage einen besonderen Stellenwert haben, nämlich sogenannte N Pvollständige Probleme. Das sind, kurz gesagt, Probleme, auf die alle Probleme in N P effizient zurückgeführt werden können. Könnte man zeigen, dass ein N P-vollständiges Problem in P liegt, so wäre P = N P bewiesen. Definition 11. Eine Sprache L heißt N P-hart, falls es für jede Sprache L′ der Klasse N P eine Reduktion in polynomialer Zeit auf L gibt, wenn also für alle L′ aus N P L′ ⊳ L gilt. Eine N P-harte Sprache L heißt N P-vollständig, wenn L aus N P ist. Satz 5. Sei L eine N P-vollständige Sprache. Dann ist jede Sprache in N P, auf die L in polynomialer Zeit reduziert werden kann, ebenfalls N P-vollständig. Beweis. Sei L0 ⊂ Γ∗ eine Sprache der Klasse N P und sei f : Σ∗ → Γ∗ eine Reduktion von L ⊂ Σ∗ auf L′ in polynomialer Zeit. Wir zeigen, dass L0 N P-vollständig ist. Sei L′ ⊂ (Σ′ )∗ eine beliebige Sprache aus N P. Dann gibt es eine Reduktion g : (Σ′ )∗ → Σ∗ in polynomialer Zeit. Es folgt, dass für alle x ∈ (Σ′ )∗ gilt: x ∈ L′ ⇔ g(x) ∈ L ⇔ f (g(x)) ∈ L0 . Es genügt also zu zeigen, dass f ◦ g eine Funktion in F P ist, also polynomial berechnet werden kann. Es sei M eine Turingmaschine, die f berechnet und M eine Turingmaschine, die g berechnet. M habe die Zeitkomplexität p(n) und M habe die Zeitkomplexität q(n), wobei p(n) und q(n) Polynome sind. Wir betrachten eine Zweiband-Turingmaschine, die auf Band 1 M simuliert (dieser Prozess benötigt maximal q(n) Schritte) und anschließend das Wort auf Band 2 kopiert (dieser Prozess benötigt maximal n + q(n) Schritte), wo M simuliert wird (dieser Prozess benötigt maximal p(q(n)) Schritte). Somit kann f (g(x)) mit einer Zeitkomplexität von O(n + q(n) + p(q(n))) berechnet werden, also liegt f ◦ g in F P. 9 Zum Abschluss sei noch (ohne Beweis) eine Liste bekannter N P-vollständiger Probleme angegeben: 1. (Erfüllbarkeit): Für jede boolsche Formel f (x1 , . . . , xn ) soll entschieden werden, ob sie erfüllbar ist, es also eine Belegung x1 , . . . , xn ∈ {0, 1} gibt, sodass f (x1 , . . . , xn ) = 1 gilt. 2. (3-Erfüllbarkeit): Für jede boolsche Formel f (x1 , . . . , xn ) in konjunktiver Normalform mit höchstens drei Literalen je Klausel soll entschieden werden, ob sie erfüllbar ist. Interessant dabei ist, dass das Problem der allgemeinen Erfüllbarkeit polynomial (sogar linear) auf das Problem der 3-Erfüllbarket reduziert werden kann, indem jede Klausel (in KNF), die mehr als 3 Literlale hat, durch mehrere Klauseln zu je 3 Literalen ersetzt werden kann (genauer: für jede Klausel der Länge n benötigt man n − 2 Klauseln der Länge 3). 3. (3-Färbung): Es ist für jeden ungerichteten Graphen zu bestimmen, ob eine Färbung der Knoten in drei Farben existiert, sodass je zwei verbundene Knoten unterschiedlich gefärbt sind. Während das Problem der 2-Färbung in P liegt (vgl. Beispiel 5), weiß man, dass das Problem der 3-Färbung N P-vollständig ist. 4. (k-Färbung für k ≥ 3): Analog zur 3-Färbung, allerdings mit k statt 3 Farben. 5. (Hamiltonkreis): Für jeden ungerichteten Graphen ist zu bestimmen, ob er einen Hamiltonkreis besitzt. Ein Hamiltonkreis ist dabei ein Kreis, der jeden Knoten eines Graphen genau einmal besucht. 6. (Travelling Salesman Problem): Dies ist ein N P-vollständiges Problem mit großer praktischer Relevanz. Die Eingabe ist eine Liste S1 , . . . , Sn von Städten mit einer Matrix dij ≥ 0, i, j = 1, . . . , n die die Distanz von Si zu Sj repräsentieren (oder die Kosten der Reise von Si nach Sj ). Die Aufgabe ist, zu entscheiden, ob alle Städte besucht werden können, ohne dass die Gesamtkosten eine gegebene Zahl k überschreiten. Quellen [1] Jirı́ Adámek, Vorlesungsskript Theoretische Informatik, Oktober 2005, http://www.iti.cs.tu-bs.de/TI-INFO/milius/teaching/SKRIPTE/ti_bachelor. pdf, http://www.iti.cs.tu-bs.de/TI-INFO/milius/teaching/SKRIPTE/ti_bachelor2. pdf 10