Komplexität von Algorithmen SoSe 2013 Klausur [Beispiel] Lutz Schröder, Daniel Gorı́n Bitte vermerken Sie auf Ihrer Abgabe Ihren Namen und Ihre Matrikelnummer. Ooops – einige dieser Aufgaben sind offenbar im wesentlichen identisch mit bereits gestellten Übungsaufgaben. Das wird uns in der echten Klausur sicher so nicht passieren. Aufgabe 1 Eine Rekurrenz (4 Punkte) Nehmen Sie an, die Laufzeit T (n) eines Algorithmus sei durch die Rekurrenzrelation ( a n=1 T (n) ≤ √ n c n + T (d 2 e) n > 1 bestimmt. Leiten Sie hieraus eine obere Schranke für T (n) her. Gehen Sie dazu wie folgt vor: Beweisen Sie zunächst per Induktion eine exakte Lösung (mit = statt ≤) für den Fall, dass n eine Potenz von 2 ist, und leiten Sie dann daraus eine Abschätzung für den allgemeinen Fall her. Aufgabe 2 Divide and Conquer (5 Punkte) Der Strassen-Algorithmus zur Multiplikation von n × n-Matrizen A, B geht wie folgt vor: 1. Füge nötigenfalls aus Nullen bestehende Zeilen und Spalten zu A und B dazu, so dass A und B 2k × 2k -Matrizen werden (mit k = dlog(n)e). 2. Unterteile A und B in gleich große Blöcke A11 A12 A= A21 A22 B= B11 B12 B21 B22 (d.h. die Aij , Bij sind 2k−1 × 2k−1 -Matrizen). 3. Berechne folgende Matrizen: M1 = (A11 + A22 )(B11 + B22 ) M2 = (A21 + A22 )B11 M3 = A11 (B12 − B22 ) M4 = A22 (B21 − B11 ) M5 = (A11 + A12 )B22 M6 = (A21 − A11 )(B11 + B12 ) M7 = (A12 − A22 )(B21 + B22 ), wobei die vorkommenden Matrixmultiplikationen durch rekursiven Aufruf des Algorithmus berechnet werden, wenn k−1 > 0, und für k−1 = 0 durch einfache Multiplikation rationaler Zahlen. Matrixaddition wird einfach komponentenweise durchgeführt. KompAlg, SoSe 2013 4. Bilde dann das Ergebnis C = AB in Blockschreibweise als C= M 1 + M 4 − M5 + M7 M 3 + M 5 M 2 + M4 M 1 − M 2 + M3 + M6 . Leiten Sie eine Rekurrenz für die Anzahl C(m) von primitiven Operationen her, die der Algorithmus durchführt, wobei m = 2n2 die Größe der Eingabematrizen ist. Geben Sie dann das asymptotische Verhalten von C(m) an, wie es sich aus dem Master Theorem ergibt. Aufgabe 3 Amortisierte Analyse (5 Punkte) Der Code in Abb. 1 implementiert eine sogenannte double-ended Queue oder deque (also eine Verallgemeinerung einer Queue, so dass Elemente an beiden Enden hinzugefügt oder entfernt werden können) unter Einsatz von zwei Stacks. Intuitiv repräsentiert jeder Stack eine eigene Sicht auf die Queue (jeweils vom vorderen oder vom hinteren Ende), wobei beide Sichten überlappen können. Wir werden die Komplexitäten der jeweiligen Methoden in Bezug auf die Größe der deque messen (siehe auch die size-Methode in Abb. 1). a. Bestimmen Sie die exakten worst-case-Komplexitäten der öffentlichen Methoden des DequeTyps (also aller Methoden bis auf genPop) und drücken Sie diese in Θ-Notation aus. Begründen Sie ihre Lösung klar verständlich. b. Beweisen Sie mittels der Potentialmethode, dass die öffentlichen Methoden des Deque-Typs in amortisiert konstanter Zeit laufen. Aufgabe 4 NL-Vollständigkeit (5 Punkte) Ein gerichteter Graph heisst stark zusammenhängend, wenn es zu jedem Knoten des Graphen einen gerichteten Pfad zu jedem anderen Knoten gibt. Wir betrachten das folgende Entscheidungsproblem: SCONN = {G ∈ {0, 1}∗ | G ist die Adjazenzmatrix eines stark zusammenhängenden gerichteten Graphen} 1. Zeigen Sie, dass SCONN ∈ NL. 2. Zeigen Sie, dass PATH logspace SCONN. Erläutern Sie den Platzverbrauch ihrer Reduktion sorgfältig. 3. Beweisen Sie unter Verwendung der obigen Resultate, dass SCONN NL-vollständig ist. Hinweis: Überlegen Sie sich bei Teilaufgabe 2 für ein Tupel hG, s, ti, ob das Hinzufügen von Kanten zu G, die zu s hinführen, sowie von solchen, die von t ausgehen, die Existenz eines Pfades zwischen s und t beeinflussen und welche Auswirkungen dies auf den starken Zusammenhang des modifizierten Graphen hat. 2 KompAlg, SoSe 2013 Class Deque of Element frontEnd , backEnd : Stack of Element o n l y I n F r o n t , onlyInBack = 0 : N inBothEnds = 0 : N invariant o n l y I n F r o n t + inBothEnds invariant onlyInBack + inBothEnds // i n v a r i a n t : assume we remove t h e // and t h e t o p o n l y I n B a c k e l e m e n t s // e l e m e n t s o f b o t h s t a c k s a r e t h e ≤ | frontEnd | ≤ | backEnd | t o p o n l y I n F r o n t e l e m e n t s from frontEnd , from backEnd ; t h e n t h e t o p inBothEnds same , b u t i n r e v e r s e o r d e r . Function s i z e : N ; return o n l y I n F r o n t + onlyInBack + inBothEnds Procedure pushFront ( x : Element ) frontEnd . push ( x ) ; o n l y I n F r o n t++ Procedure pushBack ( x : Element ) backEnd . push ( x ) ; onlyInBack++ Function popFront : Element assert s i z e > 0 ( x , o n l y I n F r o n t ’ ) := genPop ( frontEnd , o n l y I n F r o n t , backEnd , onlyInBack ) o n l y I n F r o n t := o n l y I n F r o n t ’ return x Function popBack : Element assert s i z e > 0 ( x , onlyInBack ’ ) := genPop ( backEnd , onlyInBack , frontEnd , o n l y I n F r o n t ) onlyInBack := onlyInBack ’ return x // A u x i l i a r y method , n o t p a r t o f t h e p u b l i c i n t e r f a c e Function genPop ( thisEnd , onlyInThisEnd , otherEnd , onlyInOtherEnd ) : Element a s s e r t onlyInThisEnd + onlyInOtherEnd + inBothEnds > 0 i f onlyInThisEnd > 0 then x := t h i s E n d . pop return ( x , onlyInThisEnd − 1 ) i f inBothEnds > 0 then x := t h i s E n d . pop inBothEnds := inBothEnds − 1 return ( x , onlyInThisEnd ) // onlyInOtherEnd > 0 ; we now p u t t h o s e e l e m e n t s i n b o t h ends inBothEnds := onlyInOtherEnd ; onlyInOtherEnd := 0 t h i s E n d . p opA ll f o r i := 1 to inBothEnds do t h i s E n d . push ( otherEnd . pop ) s := make copy of t h i s E n d // O( | t h i s E n d | ) otherEnd . pop All f o r i := 1 to inBothEnds do otherEnd . push ( s . pop ) // t h i s w i l l end s i n c e now inBothEnds > 0 return genPop ( thisEnd , onlyInThisEnd , otherEnd , onlyInOtherEnd ) Abbildung 1: Eine double-ended queue, implementiert mittels zweier Stacks 3 KompAlg, SoSe 2013 Aufgabe 5 NEXPSPACE (3 Punkte) Für f platzkonstruierbar, f (n) ≥ log(n) ist jedes auf einer nichtdeterministischen TM in Platz f (n) lösbare Problem auf einer deterministischen TM in Platz O(f (n)2 ) lösbar (Satz von Savitch). Folgern Sie hieraus, dass NEXPSPACE=EXPSPACE gilt, wobei EXPSPACE (NEXPSPACE) die Klasse der in deterministisch (nichtdeterministisch) exponentiellem Platz (also Platz 2p(n) für ein Polynom p(n)) lösbaren Probleme bezeichnet. Lässt sich dieses Argument auch verwenden, um zu zeigen, dass NLOGSPACE=LOGSPACE gilt? Benotung Bestanden ab 7 Punkte; Note 1,0 ab 19 Punkte. 4