Übung Theoretische Informatik I L. Priese, M. Schuth, R. Menzel, E. Hebisch Aufgabe 1 SS 2005 Blatt 12, Abgabe bis Freitag den 29.07.05 NP-Vollständigkeit 4 Punkte Beweisen Sie, dass folgende Probleme NP-vollständig sind. a) Independent Set Gegeben: Graph G = (V, E) und K ∈ N mit K ≤ |V |. Frage: Gibt es eine unabhängige Menge von Knoten V 0 ⊆ V mit |V 0 | ≥ K? Hinweis: Eine Menge V 0 von Knoten ist unabhängig, wenn gilt: ∀u, v ∈ V 0 : u 6= v ⇒ (u, v) ∈ /E IS ∈ N P : Eine indeterminierte Turingmaschine kann eine Menge V 0 ⊆ V mit |V 0 | ≤ K raten und in max. O(n3 ) Schritten überprüfen, ob die Knoten unabhängig sind. Sie betrachtet dazu jedes Paar (v, v 0 ) (das ist in O(n2 )) und vergleicht jedes Paar in E mit (v, v 0 ). Das ist dann insgesamt in O(n3 ). Wir reduzieren Clique auf IS: / E. Sei G = (V, E) mit ∀u, v : (u, v) ∈ E ⇔ (u, v) ∈ Dann transformieren wir Clique in IS: f (< G, K >) =< G, K > denn V 0 ist Clique in G ⇔ ∀u, v ∈ V 0 : (u, v) ∈ E ⇔ ∀u, v ∈ V 0 : (u, v) ∈ /E ⇔ alle Knoten von V 0 sind unabhängig in G ⇔ (G, K) ist IS. b) Partition into Hamiltonian Subgraphs (PIHS) Gegeben: Graph G = (V, E) und K ∈ N mit K ≤ |V |. Frage: Können die Knoten von G in k ≤ K disjunkte Mengen V1 , ..., Vk aufgeteilt werden, so dass Vi für 1 ≤ i ≤ k einen Hamilton-Kreis enthält? Hinweis: Die Mengen V1 , ..., Vk sind disjunkt, wenn kein Element v in mehr als einer Menge vorkommt. PIHS ist in NP: Eine indeterminierte TM kann eine Aufteilung für die Knoten raten, dann eine Knotenfolge raten und in polynomieller Zeit überprüfen, ob diese Knotenfolge in G einen Kreis bildet. Reduktion auf Hamiltonkreis: Wir geben f : Hamiltonkreis → P IHS an mit f (G) = (G, 1). Sei G = (V, E) (G, 1) ∈ P IHS ⇔ V1 = V enthält einen Hamiltonkreis ⇔ G ∈ Hamiltonkreis Aufgabe 2 Komplexität 4 Punkte Gegeben sei eine n×n-Matrix M = (mi,j )i≤n,j≤n über den natürlichen Zahlen, wobei jede Zeile und Spalte geordnet sei, d.h. für alle zulässigen Werte von i und j gelte jeweils mi,j ≤ m(i+1),j und mi,j ≤ mi,(j+1) . Bestimmen Sie einen möglichst effektiven Algorithmus um festzustellen, ob eine bestimmte Zahl k ∈ N in der Matrix M vorkommt, und berechnen Sie die Anzahl der Rechenschritte, die Ihr Algorithmus schlimmstenfalls benötigt. Der (vermutlich) effektivste Algorithmus arbeitet wie folgt: Man beginnt an der unteren linken Ecke (wahlweise auch an der oberen rechten Ecke) der Matrix. Ein Vergleich der hier stehenden mit der gesuchten Zahl führt zu einem von drei möglichen Ergebnissen. Stimmen die Zahlen überein, so terminiert der Algorithmus mit Antwort ja. Ist die gesuchte Zahl größer als die gefundene, geht man auf das Matrixfeld rechts vom aktuellen Feld, sonst auf das Feld darüber. Dann beginnt der Algorithmus von vorn, wieder mit dem Vergleich. Verläßt man irgendwann die Matrix nach rechts oder oben, terminiert der Algorithmus mit Antwort nein. Man man sich hier zunutze, daß oberhalb von jeder Zahl nur kleinere, rechts von jeder Zahl nur größere Zahlen stehen. Rechenschritte: Wir zählen jeden Vergleich als eine Operation. Dann braucht man höchstens 2n Schritte, d.h. der Algorithmus liegt in O(n).