Gliederung der Vorlesung 1. Analyse von Algorithmen 1.1 Motivation 1.2 Laufzeit von Algorithmen 1.3 Asymptotische Notationen 2. Entwurf von Algorithmen 2.1 Divide & Conquer 2.2 Dynamisches Programmieren 2.3 Probabilistische Algorithmen 3. Berechnungstheorie 3.1 Turing-Maschinen (TM) 3.2 RAM 3.3 Churchsche These 3.4 Unentscheidbarkeit 4. Grundlegende Ergebnisse aus der Komplexitätstheorie 4.1 Komplexitätsmaße/-klassen 4.2 Speed-up und Bandkompression 4.3 4.4 Nichtdeterministische TM 5. P = NP? Problem 5.1 Alternative Definition der Klasse NP 5.2 NP-vollständige Probleme 6. NP-vollständig Was nun? 6.1 Heuristiken 6.2 Approximationsalgorithmen 1
zur Erinnerung DTIME(t(n)) Klasse aller Sprachen, die mit O(t(n))-zeitbeschränkten Turing-Maschinen erkannt werden können DTAPE(s(n)) Klasse aller Sprachen, die mit O(s(n))-platzbeschränkten Turing-Maschinen erkannt werden können relevanter Aspekt Kann man weitere Sprachen erkennen, wenn mehr Ressourcen (/* Rechenzeit bzw. Speicherplatz */) zur Verfügung stehen? Hinweis: die betrachteten Turing-Maschinen können beliebig viele Bänder haben 2
die Antwort ist nicht ganz trivial, da mehr Ressourcen nicht immer mit mehr Leistungsfähigkeit einhergehen... Zu jeder vollständig definierten, berechenbaren Funktion r: N N gibt es monoton steigende, vollständig definierte berechenbare Funktionen s,t: N N, so daß gilt: DTAPE(s(n)) = DTAPE(r(n) s(n))) DTIME(t(n)) = DTIME(r(n) t(n)))... es gibt Funktionen, die als Zeit- bzw. Platzschranken nicht taugen!!! 3
für sinnvolle Zeit- bzw. Platzschranken gilt, was man erwartet, d.h. mehr Ressourcen implizieren mehr Leistungsfähigkeit Es seien s, S: N N vollständig definierte, berechenbare Funktionen mit s(n) o(s(n)). Ferner sei S eine sinnvolle Platzschranke. Dann gibt es eine Sprache L mit folgenden Eigenschaften: L DTAPE(S(n)) L DTAPE(s(n))) Es seien t, T: N N vollständig definierte, berechenbare Funktionen mit t(n) 2 o(t(n)). Ferner sei T eine sinnvolle Zeitschranke. Dann gibt es eine Sprache L mit folgenden Eigenschaften: L DTIME(T(n)) L DTIME(t(n))) 4
Begriff sinnvolle Platzschranke Es sei S: N N eine vollständig definierte, berechenbare Funktion. S heißt bandkonstruierbar, falls es eine Turing-Maschine M gibt, so daß für jedes n und jede Eingabe x mit x = n gilt: S M (x) = S(n). man kann M benutzen, um bei Eingabe von x auf einem Band einen Speicherbereich der Größe S( x ) zu markieren wenn man überprüfen will, ob eine Turing-Maschine M bei Eingabe von x mehr Speicherplatz... als S( x ) benötigt, genügt es zu überprüfen, ob M den markierten Bandbereich verläßt 5
Beispiele für bandkonstruierbare Funktionen S(n) = log(n) S(n) = n S(n) = n 3 S(n) = 2 n S(n) = 2 n2... 6
Hierarchiesatz für Platzkomplexitätsklassen Es seien s, S: N N vollständig definierte, berechenbare Funktionen mit s(n) o(s(n)). Ferner sei S bandkonstruierbar. Dann gibt es eine Sprache L mit folgenden Eigenschaften: L DTAPE(S(n)) L DTAPE(s(n)))... das wird mittels Diagonalisierung bewiesen 7
Hierarchiesatz für Platzkomplexitätsklassen der Beweis ist technisch einfach, da folgender Zusammenhang gilt DTAPE(s(n)) = DTAPE 1 (s(n))... man muß sich bei der Konstruktion der separierenden Sprache L nur mit 1-Band-Turing-Maschinen rumschlagen Effekt: man erhält eine sehr feine Hierarchie 8
Grundidee: man definiert eine Sprache L, so daß für jede 1-Band-TM M gilt: wenn M O(s(n))-bandbeschränkt ist, so ist L(M) L das geht wie üblich, d.h. für jede 1-Band-TM M sucht man nach einem x M mit einer der folgenden Eigenschaften: 1) M benötigt bei Eingabe von x M mehr Speicherplatz als erlaubt (/* Schranke: S( x M ) */) 2) M benötigt nicht mehr Speicherplatz als erlaubt und geht 2a) in den Endzustand q a oder 2b) in den Endzustand q r oder 2c) in keinen Endzustand Ansatz: falls 2a) eintritt, soll x M L gelten; sonst x M L 9
Problem wie bekommt man mit, daß 2c) eintritt... dieser Aspekt ist wichtig, weil nachzuweisen ist, daß es eine O(S(n))-platzbeschränkte TM gibt, die L entscheidet Es sei S: N N eine vollständig definierte, berechenbare Funktion. Dann ist die folgende Menge E entscheidbar: E = { cp(e,x) e ist Gödelnummer einer S(n)-bandbeschränkten TM M für die gilt: f M (x) ist definiert }... das Halteproblem für S(n)-bandbeschränkte Turing-Maschinen ist entscheidbar 10
das Halteproblem für S(n)-bandbeschränkte Turing-Maschinen ist entscheidbar, weil... Fakt 1: Fakt 2: Anzahl der bei Eingabe von x erreichbaren Konfigurationen einer solchen TM M ist beschränkt, sagen wir durch m falls M mehr als m Schritte rechnet, so muß M in eine Endlosschleife geraten sein (/* es tritt 2c) ein */) Realisierung: berechne m und laß M maximal m Schritte laufen 11
der Rest ist Technik und ein wenig Hintergrundwissen in Abhängigkeit von der TM M, von der Eingabe x und der Platzschranke S( x ) kann die Zeitschranke m berechnet werden... und zwar mit einer O(S(n))-platzbeschränkten TM die Arbeit von M bei Eingabe von x kann unter Verwendung einer geeignet gewählten universellen TM U simuliert werden (/* die universelle TM U bekommt als Eingabe die Gödelnummer e von M und x */)... eine geeignet gewählte universelle TM U benötigt nicht zu viele Ressourcen Hinweis: hier wird s(n) o(s(n)) gebraucht, da M O(s(n))-platzbeschränkt ist 12
Es gibt eine universelle Turing-Maschine U, die für alle e, x N folgendes leistet: wenn e Gödelnummer einer Turing-Maschine M ist, so gilt: f U (e,x) = f M (x) S U (bin(e)bbin(x)) c * S M (bin(x)) für ein c > 0 T U (bin(e)bbin(x)) c * T M (bin(x)) für ein c > 0... das leistet bereits unsere universelle 3-Band-TM Hinweis: c und c stören nicht (/* Bandkompressions- bzw. Speed-up-Theorem */) 13
Begriff sinnvolle Zeitschranke Es sei T: N N eine vollständig definierte, berechenbare Funktion. T heißt zeitkonstruierbar, falls es eine Turing-Maschine M gibt, so daß für jedes n und jede Eingabe x mit x = n gilt: T M (x) = T(n). man kann M benutzen, um bei Eingabe von x auf einem einem Speicherbereich T( x ) viele Zellen zu markieren wenn man überprüfen will, ob eine Turing-Maschine M bei Eingabe von x mehr Rechenzeit... als T( x ) benötigt, genügt es in jedem Schritt eine Markierung zu löschen; falls alle Markierungen gelöscht sind, ist klar, daß M die Zeitschranke überschritten hat 14
Beispiele für zeitkonstruierbare Funktionen T(n) = n T(n) = n 3 T(n) = 2 n T(n) = 2 n2...... die Zeitschranke T(n) = log(n) ist offenbar nicht konstruierbar 15
Hierarchiesatz für Zeitkomplexitätsklassen Es seien t, T: N N vollständig definierte, berechenbare Funktionen mit t(n) 2 o(t(n)). Ferner sei T zeitkonstruierbar. Dann gibt es eine Sprache L mit folgenden Eigenschaften: L DTIME(T(n)) L DTIME(t(n)))... das wird mittels Diagonalisierung bewiesen 16
Hierarchiesatz für Zeitkomplexitätsklassen hier wird es technisch schwieriger, da man sich bei der Konstruktion der separierenden Sprache L mit allen k-band-turing-maschinen rumschlagen muß... und das bekommt man nicht so richtig gut in den Griff man kann aber folgenden Zusammenhang ausnutzen DTIME(t(n)) DTIME 1 (t(n) 2 ) und sich wieder auf 1-Band-Turing-Maschinen konzentrieren Effekt: man erhält eine nicht so feine Hierarchie 17