590 likes | 1.05k Views
Grundlagen der Algorithmen und Datenstrukturen Kapitel 12. Prof. Dr. Christian Scheideler Stv: Stefan Schmid SS 2008. Heute. Prof Scheideler auf Konferenz... Vorlesung: - Techniken beim Algorithmenentwurf („check list“?) - ev. Nachbesprechung Midterm - Fragen Endterm?.
E N D
Grundlagen der Algorithmen und DatenstrukturenKapitel 12 Prof. Dr. Christian Scheideler Stv: Stefan Schmid SS 2008 Kapitel 12
Heute... Prof Scheideler auf Konferenz... Vorlesung: - Techniken beim Algorithmenentwurf („check list“?) - ev. Nachbesprechung Midterm - Fragen Endterm? Kapitel 12
Generische Optimierungsverfahren Techniken: • Systematische Suche – lass nichts aus • Divide and Conquer – löse das Ganze in Teilen • Dynamische Programmierung – mache nie etwas zweimal • Greedy Verfahren – schau niemals zurück • Lokale Suche – denke global, handle lokal Kapitel 12
Systematische Suche Prinzip: durchsuche gesamten Lösungsraum Auch bekannt als „Brute Force“ Vorteil: sehr einfach zu implementieren Nachteil: sehr zeitaufwendig und sollte daher nur für kleine Instanzen verwendet werden Kapitel 12
Systematische Suche Beispiele: • Suche in unsortierter Liste • Broadcasting in unstrukturierten verteilten Systemen (Peer-to-Peer Systeme) • Selection Sort (nimm wiederholt kleinstes Element aus Eingabesequenz) • Rucksackproblem (siehe nächste Folie) Kapitel 12
Systematische Suche Rucksackproblem: • Eingabe:n Objekte mit Gewichten w1,…,wn und Werten v1,…,vn und Rucksack mit Kapazität W • Ausgabe: Objektmenge M maximalen Wertes, die in Rucksack passt Anwendungen: Nikolaus, Räuber, … Kapitel 12
Systematische Suche Lösung zum Rucksackproblem:Probiere alle Teilmengen von Objekten aus und merke die Menge M von Objekten mit i 2 M wi <= W, die bisher den maxima-len Wert hatte Aufwand:O(2n), da es 2nMöglichkeiten gibt, Teilmengen aus einer n-elementigen Menge zu bilden. Kapitel 12
Divide and Conquer Prinzip: teile Problem in Teilprobleme auf, die unabhängig voneinander gelöst werden können Vorteil: Implementierung oft einfach, da rekursiv Nachteil: eventuell werden Teilprobleme doppelt gelöst Kapitel 12
Doppelte Berechnungen... Fibonacci Zahlen: f0 = 0, f1 = 1 fn = fn-1 + fn-2 Kapitel 12
Divide and Conquer Beispiele: • Mergesort • Quicksort • Binary Search • Arithmische Operationen wie Matrixmulti-plikation oder Multiplikation großer Zahlen • Nächstes-Paar-Problem Kapitel 12
A00 A01 B00 B01 A= B= A10 A11 B10 B11 Divide and Conquer Matrixmultiplikation nach Strassen: • Eingabe: nxn-Matrizen A und B • Ausgabe: nxn-Matrix C mit C=A¢B Wir nehmen vereinfachend an, n sei Zweier-potenz. Dann A und B darstellbar durch jeweils 4 (n/2)x(n/2)-Matrizen: Wie wäre Schulmethode? Laufzeit? Kapitel 12
C00 C01 C= C10 C11 Divide and Conquer Für Matrix C gilt: mit • C00=M1+M4-M5+M7 • C01=M3+M5 • C10=M2+M4 • C11=M1+M3-M2+M6 mit Matrizen M1,…,M7 wie in nächster Folie Kapitel 12
Divide and Conquer Matrizen M1,…,M7: • M1=(A00+A11) ¢ (B00+B11) • M2=(A10+A11) ¢ B00 • M3=A00 ¢ (B01-B11) • M4=A11¢ (B10-B00) • M5=(A00+A01) ¢ B11 • M6=(A10-A00) ¢ (B00+B01) • M7=(A01-A11) ¢ (B10+B11) 7 rekursiveAufrufe Kapitel 12
Divide and Conquer Laufzeit von Strassens Algorithmus: T(1)=O(1), T(n)=7T(n/2) + O(n2) Also Laufzeit O(nlog2 7) = O(n2,81) Laufzeit der Schulmethode (brute force): O(n3) Kapitel 12
Divide and Conquer Nächstes-Paar-Problem: • Eingabe: Menge S von n Punkten P1=(x1,y1),…,Pn=(xn,yn) im 2-dimensio-nalen Euklidischen Raum • Ausgabe: Punktpaar mit kürzester Distanz Annahme: n ist Zweierpotenz Wie wäre Brute Force Methode? Laufzeit? Geht es besser? Vermutung? Kapitel 12
Divide and Conquer Algo für Nächstes-Paar-Problem: • Sortiere Punkte gemäß x-Koordinate(z.B. Mergesort, Zeit O(n log n) ) • Löse danach Nächstes-Paar-Problem rekursiv durch Algo ClosestPair Kapitel 12
Divide and Conquer Algo ClosestPair(S): • Eingabe: nach x-Koordinate sortierte Punktmenge S • |S|=2: sortiere S gemäß y-Koordinate und gib Distanz zwischen den zwei Punkten in S zurück • |S|>2: • teile S in der Mitte (Position n/2) in S1 und S2 • d1:=ClosestPair(S1); d2:=ClosestPair(S2) • d:=min{ClosestCrossPair(S1,S2,min(d1,d2)), d1, d2} • Führe Merge(S1,S2) durch, so dass S am Ende nach y-Koordinate sortiert ist (S1, S2 bereits sortiert) • gib d zurück Kapitel 12
Divide and Conquer ClosestCrossPair(S1,S2,d): Nur Punktpaare in Streifen interessant d=min{d1,d2} d d d2 d1 Nur max. 4 Punktein dxd-Quadrant Punkte nach y-Koordinate sortiert S2 S1 Kapitel 12
Divide and Conquer ClosestCrossPair: • Durchlaufe die (nach der y-Koordinate sortierten) Punkte in S1 und S2 von oben nach unten (wie in Merge(S1,S2)) und merke die Mengen M1 und M2 der 8 zuletzt gesehenen Punkte in S1 und S2 im d-Streifen • Bei jedem neuen Knoten in M1, berechne Distanzen zu Knoten in M2, und bei jedem neuen Knoten in M2, berechne Distanzen zu Knoten in M1 • Gib am Ende minimal gefundene Distanz zurück Kapitel 12
Divide and Conquer Last 8 points => y distance from current point at for other points > d => can be ignored! d=min{d1,d2} d d d2 d1 S2 S1 Kapitel 12
Divide and Conquer New point => compare to those stored points (max 8) which are on other side! d=min{d1,d2} d d d2 d1 S2 S1 Kapitel 12
Divide and Conquer Laufzeit für Nächstes-Paar-Algo: • Mergesort am Anfang: O(n log n) • Laufzeit T(n) von ClosestPair Algo:T(1)=O(1), T(n)=2T(n/2)+O(n) Gesamtlaufzeit: O(n log n) Brute force: O(n2) Kapitel 12
Dynamische Programmierung Prinzip:rekursive Durchsuchung des Lösungsraums mittels Speicher Vorteil: verhindert doppelte Berechnung von Teillösungen Nachteil: benötigt eventuell sehr viel Speicher Kapitel 12
Dynamische Programmierung Beispiele: • Berechnung des Binomialkoeffizienten • Rucksackproblem Kapitel 12
n k Dynamische Programmierung Berechnung des Binomialkoeffizienten: • Eingabe: n,k>=0, n>=k • Ausgabe: C(n,k) mit C(n,k) = Rekursive Formel für C(n,k): • C(n,0)=C(n,n)=1 für alle n>=0 • C(n,k)=C(n-1,k-1)+C(n-1,k) für n>k>0 Kapitel 12
. . . . . . Dynamische Programmierung 0 1 2 …. k-1 k 0 1 1 1 1 2 1 2 1 zu berechnendeEinträge (<n¢k); linke Spalte und Diagonale alles 1 zu Beginn, Rest folgt rekursiv. k 1 k … 1 C(n-1,k-1) C(n-1,k) n-1 C(n,k) n Kapitel 12
Dynamische Programmierung Berechnung des Binomialkoeffizienten:for i:=0 to n do for j:=0 to min(i,k) do if j=0 or j=i then C[i,j]:=1 else C[i,j]:=C[i-1,j-1]+C[i-1,j]return C[n,k] Laufzeit: O(n ¢ k) Kapitel 12
Dynamische Programmierung Rucksackproblem: • Eingabe:n Objekte mit Gewichten w1,…,wn und Werten v1,…,vn und Rucksack mit Kapazität W • Ausgabe: Objektmenge M maximalen Wertes, die in Rucksack passt Kapitel 12
Dynamische Programmierung V[i,w]: optimaler Wert, der für die Objekte 1 bis i bei Rucksackvolumen w erreichbar ist Rekursive Berechnung von V[i,w]: • Für die Teilmengen, die das i-te Objekt nicht enthalten ist der Wert der optimalen Lösung gleich V[i-1,w] • Für die Teilmengen, die Objekt i enthalten, ist der Wert der optimalen Lösung gleich vi+V[i-1,w-wi] (wi abziehen, sonst würde Gesamtgewicht zu gross!) Kapitel 12
Dynamische Programmierung Idee also: Wenn wir für Teilmenge der Objekte 1..i-1 optimale Packung für Maximalgewichte 1...w haben, können wir optimale Packung für Objekte 1..i mit Maximalgewicht w sehr schnell berechnen. Kapitel 12
Dynamische Programmierung Rekursive Formel für V[i,w]: • V[0,w]=0 für alle w>=0 • V[i,0]=0 für alle i>=0 • V[i,w]=V[i-1,w] falls w-wi<0 • V[i,w]=max{V[i-1,w], vi+V[i-1,w-wi]} sonst Kapitel 12
Dynamische Programmierung Rekursive Berechnung von V[i,w]: 0 w-wi w W 0 0 0 0 0 i-1 0 V[i-1,w-wi] V[i-1,w] i 0 V[i,w] Ziel n 0 V[n,W] Kapitel 12
Dynamische Programmierung Berechnung der Tabelle: O(n¢W) Zeit Brute force: O(2n) Frage: Wie schaut optimale Packung aus? Fazit: solange W klein, viel bessere Laufzeit als brute force. Falls W groß, dann unterteile Objekte in große (wi>=W/(42) ) und kleine Objekte. Wende auf die großen Objekte dynamische Programmierung an (kleine Tabelle) und auf die kleinen eine Greedy Methode an, die wir später noch beschreiben werden. Damit ist in Zeit O(n ¢ poly(1/)) Lösung ermittelbar, die um maximal 1+ von Optimum abweicht. Kapitel 12
Greedy Verfahren Prinzip: teile Problem in mehrere kleine Entscheidungen auf, nimm immer lokales Optimum für jede kleine Entscheidung Vorteil: sehr schnell Nachteil: kann weit von optimaler Lösung entfernt sein Kapitel 12
Greedy Verfahren Beispiele: • Dijkstra-Algorithmus für kürzeste Wege • Jarnik-Prim-Algorithmus für minimale Spannbäume • Huffman-Bäume • Rucksackproblem Kapitel 12
Greedy Verfahren Alice muss Bob regelmässig wichtige Nachricht zukommen lassen. Bob wohnt leider ein paar Kilometer weit weg, es besteht aber Sichtkontakt. Alice hat eine Taschenlampe, und möchte die Nachricht „morsen“ mittels eines binären Alphabets (lang = „0“, kurz = „1“) Alice und Bob können eine Kodierung abmachen, wissen aber im voraus nur, dass die Nachrichten in deutsch sein werden, nicht aber deren Inhalt. Kodierung? Kapitel 12
Greedy Verfahren Huffman-Baum: • Eingabe: Wahrscheinlichkeitsverteilung p auf einem Alphabet A (e.g., A = {a,b,c,d,...}) • Ausgabe: optimaler Präfixcode f:A ! {0,1}* für A, d.h.a 2 A |f(a)|¢p(a) minimal Präfixcode: Kodierung f:A ! {0,1}*, für die es keine Zeichen a,b2 gibt, für die f(a) ein Präfix von f(b) ist (d.h. f(b) anfängt mit f(a) ) Präfixcodes wichtig für eindeutige Dekodierung! Kapitel 12
Greedy Verfahren Einsicht: jeder Präfixcode lässt sich als Binärbaum darstellen mit Zeichen in A an Blättern Beispiel: A={a,b,c,d} Zu was wird 101110 decodiert? • Kodierung f: • f(a) = 0 • f(b) = 110 • f(c) = 10 • f(d) = 111 0 1 0 1 a c 0 1 b d Kapitel 12
Greedy Verfahren Huffman-Baum: Baum für optimale Kodierung Strategie: • Anfangs ist jedes Zeichen in A ein Baum für sich • Wiederhole, bis ein einziger Baum übrig: • Bestimme die beiden Bäume T1 und T2mit kleinsten Wahrscheinlichkeitswerten a p(a) ihrer Zeichen • Verbinde T1 und T2zu neuem Baum T 0 1 T T1 T2 Kapitel 12
Zeichen A B C D _ Wkeit p 0,1 0,2 0,2 0,15 0,35 1,0 1 0 0,4 0,6 0 0 1 1 C 0,2 D 0,2 0,25 0,35 A 0 1 B 0,1 0,15 _ Greedy Verfahren Beispiel für Huffman-Baum: Kapitel 12
Greedy Verfahren Rucksackproblem: • Eingabe:n Objekte mit Gewichten w1,…,wn und Werten v1,…,vn und Rucksack mit Kapazität W • Ausgabe: Objektmenge M maximalen Wertes, die in Rucksack passt Kapitel 12
Greedy Verfahren Greedy Strategie: • Berechne Profitdichten d1=v1/w1,.., dn=vn/wn • Sortiere Objekte nach Profitdichten • Angefangen von dem Objekt mit höchster Profitdichte, füge Objekte zu Rucksack hinzu, bis kein Platz mehr da Problem: Greedy Strategie kann weit vom Optimum entfernt liegen Kapitel 12
Greedy Verfahren Beispiel: zwei Objekte mit v1=1 und v2=W-1 und w1=1 und w2=W, Rucksackkapazität ist W Greedy-Methode: berechnet d1=1 und d2 = 1-1/W und wird nur Objekt 1 in Rucksack packen, da Objekt 2 nicht mehr passt Optimale Lösung: packe Objekt 2 in Ruck-sack (viel besser da Wert W-1 statt 1) Kapitel 12
Greedy Verfahren Verbesserte Greedy-Methode: • Seien die Objekte 1 bis n absteigend nach Profitdichte sortiert • Bestimme maximale Objektmenge {1,…,i} wie bisher mit j<=i wj <=W • Gib entweder {1,…,i} oder {i+1} aus, je nachdem, welche Menge den maximalen (absoluten) Wert hat Kapitel 12
Greedy Verfahren Behauptung: die Lösung der verbesserten Greedy-Methode ist höchstens einen Faktor 2 von der optimalen Lösung entfernt Beweis: • Wenn beliebige Bruchteile der Objekte gewählt werden könnten, wäre die optimale Lösung {1,…,i+1} (da maximale Profitdichte), wobei von Objekt i+1 nur der Bruchteil genommen wird, der noch in den Rucksack passt. • Für den optimalen Wert OPT gilt demnach:OPT <= j<=i+1 vj. • Also ist max{j<=i vj, vi+1} >= OPT/2 da beides zusammen grössergleich OPT, und wir grösseres nehmen Kapitel 12
Lokale Suche Generische Verfahren (mit Nachbarschaft): • Backtracking • Branch-and-Bound • Hill climbing • Simulated annealing • Tabu search • Evolutionäre Verfahren (Mutation, Mating & Survival of the Fittest) Kapitel 12
Backtracking Prinzip:systematische Tiefensuche im Lösungsraum, bis gültige Lösung gefunden Vorteil: einfach zu implementieren Nachteil: kann sehr lange dauern Kapitel 12
Backtracking Beispiele: • n-Damen Problem • Hamiltonscher Kreis Problem Kapitel 12
Backtracking n-Damen Problem: • Eingabe:n 2 IN • Ausgabe: Antwort auf die Frage, ob sich n Damen so auf einem nxn-Schachbrett stellen lassen, dass keine die andere schlagen kann Kapitel 12
Backtracking Tiefensuche überSpalten (Nummerngeben Reihenfolgean, in der Zustände besucht werden) Beispiel für n=4 0 1 5 Keine Lösung 3 6 2 Keine Lösung für 3. Dame! 7 4 Keine Lösung Lösung Keine Lösung 8 Kapitel 12