II. 4. Komplexität von Algorithmen Man möchte die „Güte“ von Algorithmen messen. Es kann viele Gütekriterien geben. Wichtige sind Rechenzeit und Speicherplatz. Wir wählen als Rechnermodell (natürlich) die TM, und zwar eine TM mit k zweiseitig – unendlichen Bändern. II.4.1. Grundlagen Definition: Wenn für jedes Inputwort der Länge n die Turingmaschine M höchstens T(n) Schritte macht, bevor sie hält, so heißt M eine T(n)–beschränkte TM oder eine TM der Zeitkomplexität T(n). Die von M akzeptierte Sprache heißt ebenfalls von der Zeitkomplexität T(n). Definition: Wenn M für jedes Inputwort der Länge n auf jedem Band höchstens S(n) Zellen (Felder) examiniert, so heißt M von der Speicherkomplexität S(n). Die von M akzeptierte Sprache heißt dann ebenfalls von der Speicherkomplexität S(n). Beispiel: Wir betrachten die Sprache L = { wcwR : w∈ { 0, 1 }* } Es gibt eine TM M mit 2 Bändern, die das Input links von c auf Band 2 kopiert. Wenn c gefunden ist, wird die zweite LSV im gerade kopierten Wort nach links und die erste LSV gleichzeitig im Input weiter nach rechts bewegt und die Zeichen unter den LSV’s werden verglichen. Wenn alle Symbole gleich und Strings gleich lang, so wird akzeptiert. Offenbar macht M höchstens n+1 Schritte für Input der Länge n. Daher hat L die Zeitkomplexität n+1. L hat auch die Speicherkomplexität n+1. Bemerkung: 1. Bei obiger Definition ist stets S(n) ≥ n. 2. Wir nehmen an, dass T(n) ≥ n+1 ist, denn das ist die Zeit, um das Input zu lesen und festzustellen, dass das Ende erreicht ist. TM, die das nicht tun, betrachten wir nicht. Zeitkomplexität T(n) heißt also max( n+1, [T(n)]+1 ). Definition: Eine NTM M hat die Zeitkomplexität T(n), wenn sie für jedes Inputwort der Länge n bei jeder Folge von Wahlmöglichkeiten höchstens T(n) Schritte macht. M hat die Speicherkomplexität S(n), wenn bei jeder Folge von Wahlmöglichkeiten M auf jedem Band höchstens S(n) Zellen examiniert bei einem Inputwort der Länge n. Entsprechend für die akzeptierten Sprachen. Definition: Die Familie aller Sprachen der Zeitkomplexität T(n) wird mit DTIME(T(n)) bezeichnet ; die Familie aller Sprachen nichtdet. Zeitkomplexität T(n) wird mit NTIME(T(n)) bezeichnet. Analog für DSPACE(S(n)) und NSPACE(S(n)). Solche Familien heißen auch Komplexitätsklassen. Beispiel: L = { wcwR : w ∈ {0, 1}* } ∈ DTIME(n) und also auch ∈ NTIME(n). Im folgenden betrachten wir nur Zeitkomplexität. Ein wesentlicher Teil der Komplexitätstheorie befasst sich mit den Beziehungen zwischen Komplexitätsklassen. Beispiele sind die folgenden Sätze: Satz: Ist L ∈ DTIME(T(n)), so wird L akzeptiert in T2(n) Zeit von einer TM mit einem Band. (o. B.) Satz: Ist L ∈ NTIME(f(n)), so gibt es eine (von L abhängige) Konstante c, so dass L in DTIME(cf(n)) liegt. (o. B.) II.4.2. Praktisch unlösbare Probleme Nach II.2 wissen wir, dass es Probleme gibt, die mit einem Computer nicht lösbar sind. Jetzt werden wir sehen, dass es unter den entscheidbaren Problemen so schwierige gibt, dass sie – jedenfalls was praktische Belange angeht – auch nicht in voller Allgemeinheit mit einem Computer gelöst werden können. Von einigen dieser Probleme kann man beweisen, dass sie expotentiell viel Zeit zur Lösung erfordern. Bei anderen ist zwar bislang ein solcher Beweis nicht gelungen, doch liegt die Vermutung nahe, dass exponentiell viel Zeit zur Lösung erforderlich ist. Der Hauptgrund für solche Vermutung ist folgender: Gäbe es nur für eines dieser Probleme einen „schnellen“ Algorithmus zur Lösung, so gäbe es automatisch für alle diese Probleme einen „schnellen“ Algorithmus. Da aber inzwischen viele Hunderte von (vielfach praktisch relevanten) Problemen nachweislich zu dieser Klasse gehören und für viele dieser Probleme seit Jahrzehnten intensiv nach „schnellen“ Algorithmen vergeblich gesucht wurde, kommt man zu dieser Vermutung. Die Klassen Π und ΝΠ Frage: Wann ist ein Problem effizient (bzgl. Zeit) lösbar? Naheliegend: Wenn es in einer Zeit lösbar ist, die polynomial von der Länge des Imputs abhängt. Zwar scheint zweifelhaft, dass ein Algorithmus der Komplexität n100 effizient ist, doch stellt sich andererseits heraus, dass die meisten praktischen Probleme mit polynomialer Komplexität gelöst werden können in Zeiten mit sehr niedrigen Polynomgraden. Wir definieren deshalb Π als die Klasse aller Sprachen, die durch DTM mit polynomialer Zeitkomplexität akzeptiert werden, d. h. Π = U DTIME ( p( n )) . p ( n ) Polynom Analog definiert man ΝΠ = U NTIME ( p ( n )) . p ( n ) Polynom Trivialerweise gilt Π ⊆ ΝΠ. Es gibt (, wie wir noch sehen werden) viele Probleme in ΝΠ, von denen man nicht weiß, ob sie in Π liegen. Die Frage, ob Π = ΝΠ gilt, ist offen (Vermutung ist, dass das nicht gilt) und wird als das herausragende ungelöste Problem der Informatik angesehen. Definition: Die Sprache L’ heißt reduzierbar auf die Sprache L in polynomialer Zeit, L' ≤ L , wenn es eine TM M mit der Zeitkomplexität T(n) gibt, so dass T(n) ein Polynom in n ist und M erzeugt aus dem Input x das Output y, so dass x ∈ L' g .d .w. y ∈ L . Lemma 1: Sei L' ≤ L. Dann gilt (a) L ∈ Π ⇒ L' ∈ Π (b) L ∈ ΝΠ ⇒ L' ∈ ΝΠ Beweis: (von (a); (b) analog). Werde also L akzeptiert in der Zeit p2(n) und sei L’ in der Zeit p1(n) reduzierbar durch M = (∑, K) auf L, wobei p1(n) und p2(n) Polynome sind. Sei dann x ∈ ∑ * mit |x| = n und y das Output der Reduktion mit Input x. Dann ist y≤ p1(n) (da höchstens ein Symbol / Schritt ausgegeben werden kann). Um nun zu testen, ob y ∈ L, sind höchstens p2(p1(n)) Schritte nötig, also insgesamt kommt man mit p1(n) + p2(p1(n)) Schritten aus, um zu testen, ob x ∈ L’. Dies ist aber ein Polynom in n. Lemma 2 Beweis: Die Hintereinanderausführung (Komposition) von 2 Reduktionen in polynomialer Zeit ist wieder eine solche. Analog zum Beweis von Lemma 1. Man könnte die Frage Π = ΝΠ so angehen wollen, indem man nach einem „schwersten“ Problem in ΝΠ fragt. "Schwerstes" Problem in dem Sinne, dass jedes andere Problem aus ΝΠ „leicht“ auf dieses „schwerste“ Problem reduziert werden kann. „Leicht“ wäre hier offenbar mit „in polynomialer Zeit“ gleichzusetzen. Diese Überlegung führt zur Definition:: Eine Sprache L heißt ΝP-vollständig, wenn L ∈ ΝΠ und jede Sprache aus ΝΠ ist in polynomialer Zeit auf L reduzierbar. Eine Sprache L heißt NP-schwer, wenn jede Sprache aus ΝΠ in polynomialer Zeit auf L reduzierbar ist. Bemerkung: 1. Hätte man eine NP-vollständige Sprache L, so wäre nach Definition Π = ΝΠ gleichbedeutend mit L ∈ Π (wegen Lemma1). 2. Hat man eine NP-vollständige Sprache L0, so kann man die NPVollständigkeit einer anderen Sprache L1 ∈ ΝΠ dadurch beweisen, dass man zeigt, dass L0 in polynomialer Zeit auf L1 reduzierbar ist. (wegen Lemma 2) 3. Mann kann den Vollständigkeitsbegriff allgemein fassen und zwar bezüglich einer beliebigen Klasse von Sprachen (oben ΝΠ) und bezüglich allgemeiner Reduktionen (oben Reduktion in polynomialer Zeit) Einige ΝP-vollständige Probleme Um für eine erste Sprache NP-Vollständigkeit zu zeigen, muss man nachweisen, dass jede Sprache aus ΝΠ auf diese in polynomialer Zeit reduziert werden kann. Wir wählen hierzu das (auch historisch erste) sogenannte Erfüllbarkeitsproblem für Boolsche Ausdrücke: B. A. (aussagenlogische Formeln) werden gebildet aus Variablen, Klammern und den logischen Operatoren ∧ (logisch UND),∨ (logisch ODER) und ¬ (Negation) mit der Rangfolge ¬, ∧, ∨. Gelegentlich benutzen wir auch die Implikation → mit der Bedeutung x → y ≡ ¬x ∨ y. Die Variablen sind der Werte 0 (false) und 1 (true) fähig, wie auch B. A., wobei sich der Wert eines B. A. nach den üblichen Regeln bestimmt (E1 ∧ E2 hat den Wert 1 g. d. w. E1 und E2 den Wert 1 haben usw.). Ein B. A. heißt erfüllbar, wenn es eine Belegung seiner Variablen gibt derart, dass sein Wert 1 ist. z. B. ist x1 ∧ x2 erfüllbar (x1 = 1, x2 = 1), aber x1 ∧ ¬x1 ist nicht erfüllbar. Das Erfüllbarkeitsproblem ist nun: Ist der B. A. E erfüllbar? Wir stellen das Problem mittels einer Sprache Lerf wie folgt dar: Seien die Variablen des Ausdruckes x1, ..., xk. xi sei codiert durch das Symbol x gefolgt von der dualen Darstellung von i, z.B. x3: x11. Das Alphabet von Lerf ist dann {∨, ∧, ¬, (, ), x, 0,1} Lerf ist die Menge aller codierten erfüllbaren B. A. Es gilt nun der Satz von Cook: Das Erfüllbarkeitsproblem ist NP-vollständig. Man zeigt dazu a) Lerf ∈ ΝΠ b) Für L ∈ ΝΠ gilt: L ≤ Lerf Weitere ΝΠ-vollständige Probleme sind: − Erfüllbarkeitsproblem für B. A. in 3KNF – L3erf − Hamilton-Kreis-Problem: Gibt es im ungerichteten Graphen G = (K,R) einen Hamilton-Kreis, d. h. einen Kreis, der durch jeden Knoten genau einmal hindurchgeht? − Problem des Handlungsreisenden: Gegeben ist ein ungerichteter vollständiger Graph G, dessen Kanten mit natürlichen Zahlen gewichtet sind, und eine natürliche Zahl λ. Gibt es eine Rundreise, d. h. einen Hamiltonkreis des Gesamtgewichtes ≤ λ? (Oder als Optimierungsproblem formuliert: Man konstruiere eine Rundreise minimalen Gewichts) Die Beweise erfolgen immer gemäß Bemerkung 2, d. h. man zeigt für die fragliche Sprache L: L ∈ ΝΠ und wählt eine NP-vollständige Sprache L’ und zeigt L’ ≤ L. Beispiel: Knotenhüllenproblem Gegeben sei ein ungerichteter Graph G=(K,R) mit Knotenmenge K und Kantenmenge R. Eine Teilmenge A ⊆ K heißt Knotenhülle von G, wenn für jede Kante (v, w) ∈ R v oder w in A liegt. Das Knotenhüllenproblem ist: Gegeben ein Graph G und eine natürliche Zahl k. Besitzt G eine Knotenhülle der Größe ≤ k? ( d. h. eine Knotenhülle A mit A ≤ k). Darstellung als Sprache: k binär, dann Liste der Knoten ki, codiert z. B. k2 als k10, dann Liste der Kanten (ki, kj), codiert z. B. (k2, k3) als (k10k11). Lkh besteht aus allen solchen Strings, die k und G repräsentieren, so dass G eine Knotenhülle der Größe ≤ k besitzt. Satz 4.4 Lkh ist NP-vollständig. Beweis: Lkh ∈ ΝΠ: Wähle nichtdeterministisch k Knoten und teste, ob diese eine Hülle bilden dies ist möglich in einer Zeit, die proportional zum Quadrat der Länge des Inputstringes ist. Jetzt wird gezeigt, dass L3erf ≤ Lkh: Sei E = E1 ∧ E2 ∧ .. . ∧ Eq ein B. A: in 3KNF mit Ei = (α i1 ∨ α i 2 ∨ α i 3 ) , α ij Literale. Wir konstruieren einen ungerichteten Graphen G = (K,R) mit K= {(i, j ) : 1 ≤ i ≤ q, 1 ≤ j ≤ 3} R = R1 ∪ R2 = {((i , j ), (i, k )) : j ≠ k }∪ {((i, j ), (k , l )) : i ≠ k ∧α ij = ¬α kl } Beispiel: E = ( x1 ∨ x 2 ∨ x 3 ) ∧ ( x1 ∨ x 3 ∨ x 4 ) : (1,1) x1 x1 (1,2) x2 x (1,3) x3 x4 Behauptung: (2,1) (2,2) (2,3) G besitzt eine Knotenhülle der Größe ≤ 2q g. d. w. E ist erfüllbar. Beweis: a) Sei E erfüllbar. Dann gibt es eine Belegung, so dass für jedes i (1 ≤ i ≤ q) ein α iν i den Wert 1 hat. Man streiche die q Knoten (i, ν i ) aus K. Die verbleibenden 2q Knoten bilden eine Überdeckung A von G: Sei (v,w) ∈ R. Wenn (v,w) ∈ R1, so ist v ∈ A oder w ∈ A, da nur einer der drei Knoten (i,1), (i,2), (i,3) in A fehlt. Wenn (v,w) = ((i,j), (k,l) ∈ R2 und (i,j) ∉ A, so αij= 1 und also αkl = 0, also (k,l) ∈ A. b) G habe Knotenhülle A der Größe ≤ 2q. Für jedes i enthält A dann genau 2 Knoten der Form (i,j), denn anderenfalls hätte eine Kante der Form ((i,j), (i,k)) keinen Knoten in A. D. h. für jedes i fehlt in A genau ein Knoten (i, νi). Dann sei α iν i gerade mit 1 belegt. Es entsteht kein Konflikt, denn α iν i = ¬α jν j für i ≠ j ist ausgeschlossen, weil dann ((i,ν i ), ( j ,ν j )) ∈ R2 und keiner der Knoten in A ist. Man überlegt sich leicht, dass eine TM in polynomialer Zeit aus E das zugehörige Wort von Lkh erzeugt. Im Beispiel wäre eine mögliche Belegung x1 = 0, x2 = 0, x3 = 0, x4 = 1 Wenn man etwa x1 und x3 streicht, so erhält man eine Hülle.