4.6 Muster 2 für den Algorithmenentwurf: teile-und-herrsche Auch: „divide-and-conquer“ (divide et impera) Idee Rekursive Rückführung auf ein identisches Problem mit kleinerer Eingabemenge
Teile-und-herrsche-Algorithmen Prinzip 1. Teile das gegebene Problem in mehrere getrennte Teilprobleme auf 1.1 löse diese einzeln 1.2 und setze die Lösungen des ursprünglichen Problems aus den Teillösungen zusammen (nicht immer trivial!) 2. Wende dieselbe Technik rekursiv auf jedes der Teilprobleme an, dann auf deren Teilprobleme usw., bis die Teilprobleme so klein sind, dass man eine Lösung leicht explizit angeben kann. 3. Strebe dabei an, dass jedes Teilproblem von derselben Art ist wie das ursprüng-liche Problem, so dass es mit demselben Algorithmus gelöst werden kann.
Beispiel: Binäre Suche in einer Liste Algorithmus „binäre Suche“ Wähle den mittleren Eintrag der Liste und prüfe, ob der gesuchter Wert in der ersten oder in der zweiten Hälfte der Liste ist. Fahre rekursiv mit der Hälfte fort, in der sich der Eintrag befindet. Wenn es nur noch einen Eintrag gibt, ist dieser der Gesuchte, oder er existiert nicht.
Binäre Suche: Beispiel (1) Suche nach der 33 in der sortierten Liste: 1 4 6 9 12 15 16 21 22 29 33 36 38 40 44 u m o Die 33 ist rechts von der 21: 1 4 6 9 12 15 16 21 22 29 33 36 38 40 44 u m o Die 33 ist links von der 36: 1 4 6 9 12 15 16 21 22 29 33 36 38 40 44 u m o
Binäre Suche: Beispiel (2) Die 33 ist rechts von der 29: 1 4 6 9 12 15 16 21 22 29 33 36 38 40 44 u m o 33 gefunden. Komplexität In jedem Schritt wird die Größe des Intervalls halbiert. Das bedeutet: wir brauchen bei n Elementen log2n Schritte, bis wir den Wert gefunden haben.
Beispiel 2: MergeSort algorithm MergeSort (F) → FS Eingabe: eine zu sortierende Folge F Ausgabe: eine sortierte Folge FS if F einelementig then return F else teile F in F1 und F2; F1 := MergeSort (F1); F2 := MergeSort (F2); return Merge (F1, F2) fi
Komplexität von MergeSort Erste Phase: n -1 Teile-Operationen (1,2,4,8,…) Zweite Phase: 1. Schritt: n/2 Verschmelzungen mit jeweils 2-1 Vergleichen: n/2 2. Schritt: n/4 Verschmelzungen mit jeweils 4-1 Vergleichen: 3*n/4 3. Schritt: n/8 Verschmelzungen mit jeweils 8-1 Vergleichen: 7*n/8 … log2n Schritte werden insgesamt gebraucht. Also in der Summe für die zweite Phase log2n Schritte mit jeweils größen- ordnungsmäßig n Verschmelzungen/Vergleichen Für beide Phasen also O(n + n log n) = O (n log n) Operationen.
Beispiel 3: Spielpläne für Turniere Gegeben: n = 2k Spieler (2, 4, 8, 16 … Spieler) mindestens n - 1 Turniertage (jeder Spieler spielt an jedem Tag nur einmal). Aber es gibt genügend Plätze für alle parallelen Spiele. Jeder Spieler spielt gegen jeden anderen. Algorithmus teile-und-herrsche: Annahme: Turnierplan Tk bekannt (zum Beispiel für k=1, zwei Spieler) Aufgabe: konstruiere Tk+1 für m = 2k+1 = 2n (Rekursionsprinzip)
Beispiel 3: Spielplan T2 Tag 1 Tag 2 Tag 3 Spieler 1 Spieler 2 Spielplan als Matrix, Eintrag si ,j enthält den Spieler, der gegen Spieler i am Tag j spielt. Tag 1 Tag 2 Tag 3 Spieler 1 Spieler 2 Spieler 3 Spieler 4 2 1 4 3
Idee des Algorithmus (1) Konstruiere Tk+1 aus Tk wie folgt: 1 · · · n - 1 n · · · m - 1 1 · n = 2k Tk Sk n + 1 m = 2k+1 Zk
Idee des Algorithmus (2) Tk : Matrix Tk mit jeweils um n erhöhten Elementen Zk : (n × n)-Matrix, konstruiert durch zyklisches Verschieben der Zeile (1, 2, ..., n) für jede neue Zeile Sk : (n × n)-Matrix, konstruiert durch zyklisches Verschieben der Spalte (n + 1, ..., m) für n = 2k und m = 2k+1 für jede neue Spalte 1 2 3 4 5 8 7 6 2 3 4 1 6 5 8 7 3 4 1 2 7 6 5 8 4 1 2 3 8 7 6 5
Spielplan T1 Für eine kleine Problemgröße kann die Lösung direkt angegeben werden: Tag 1 Spieler 1 Spieler 2 2 1
Spielplan T3 Daraus werden T2 und T3 durch zweimaliges Anwenden des Algorithmus‘ errechnet. T3 Tag 1 Tag 2 Tag 3 Tag 4 Tag 5 Tag 6 Tag 7 Spieler 1 Spieler 2 Spieler 3 Spieler 4 Spieler 5 Spieler 6 Spieler 7 Spieler 8 2 1 4 3 6 5 8 7
Zusammenfassung „Teile-und-herrsche“ führt ein Problem so lange schrittweise auf ein kleineres Problem zurück, bis dieses einfach zu lösen ist. Dann fügt es die Einzel-lösungen zusammen. Das Zusammenfügen der Teillösungen ist oft der schwierigste Schritt.