Teile und Herrsche

Aus ProgrammingWiki
Archivierte Version vom 2016-01-06T16:21:05+00:00. Aktuelle Version

Inhaltsverzeichnis

Teile und herrsche (Divide and conquer)

Definition

Das Entwurfsverfahren Teile und Herrsche dient dem Entwurf rekursiver Algorithmen. Die Idee ist es, ein Problem der Groeßen in mehrere gleichartige aber kleinere Teilprobleme zu zerlegen ( divide). Aus rekursiv gewonnenen Lösungen der Teilprobleme ( conquer) gilt es dann, eine Gesamtlösung für das ursprüngliche Problem zusammenzusetzen .


S3anbrem_Anw.PNG

Entwurfsmethode für Algorithmen

1. Teile das Problem in kleinere Unterprobleme (Divide)
2. Löse rekursiv die entstehenden Unterprobleme (Conquer)
3. Setze die Lösungen zusammen.

Eigenschaften

  • kann bei konzeptionell schwierigen Problemen hilfreich sein

  • kann effiziente Lösungen realisieren

  • für Parallelverarbeitung geeignet


Beispiele

Beispiel 1 : Sortierverfahren (Merge-Sort)

  • Sortiere eine Array indem zwei Teilarrays sortiert und dann gemischt werden.

sort ( [ 19 17 23 31 3 5 7 29 2 11 17 ] )                                  Teile!
  => merge (
      sort ( [ 19 17 23 31 3 ] ),                                                   Herrsche über Teilproblem 1
      sort ( [ 5 7 29 2 11 17 ] ) )                                                 Heersche über Teilproblem 2
= merge ( [ 3 17 19 23 31 ] , [ 2 5 7 11 17 29 ] )                     Kombiniere zur Gesamtlösung
  = [ 2 3 5 7 11 17 17 19 23 29 31 ]

Beispiel 2 : Die Türme von Hanoi

Die Spielregeln

Es sind n Scheiben unterschiedlichen Durchmessers gegeben, welche geordnet zu einem Turm geschichtet sind, die untere Scheibe ist die größte. Der Turm steht auf einem Anfangsplatz. Unter Verwendung eines Hilfsplatzes soll dieser Turm nun zu einem Zielplatz transportiert werden, wobei verschiedene Regeln einzuhalten sind.

Wenn die Anzahl der Scheiben 1 beträgt, ist die Lösung des Problems trivial.
Bei mehr als einer Scheibe läßt sich das Gesamtproblem in drei Teilprobleme zerlegen:

  • Transportiere n-1 Scheiben vom Anfangsplatz auf den Hilfsplatz.
  • Transportiere die letzte Scheibe vom Anfangsplatz auf Zielplatz.
  • Transportiere n-1 Scheiben vom Hilfsplatz auf den Zielplatz.

S3anbrem_Azh.PNG


Übung 1 : Die Türme von Hanoi


  • Transportiere n Scheiben vom Anfangsplatz auf den Zielplatz, verwende einen Hilfsplatz.


S3anbrem_U1.png

Lösung

S3anbrem_B4.PNG

Übung 2 : Hanoi Java-Code

Pseudo - Code

Bedeutung der Variablen:

ap - Anfangsplatz
zp - Zielplatz
hp - Hilfsplatz
n - Anzahl der Scheiben
Die Übergabe des Hilfsplatzes als Parameter kann auch entfallen, wenn man als Berechnung einsetzt:
hp := 6 - ap - zp.

Java-Code

  • Auf der Grundlage diese Pseudocode schreiben Sie Java-Code für Hanoi.
  • Denken Sie auch an der Klasse Main, welche wird die Methode turm benutzen.

Spiele

http://www.gf-webdesign.de/tuerme-von-hanoi/tuerme-von-hanoi.htm

Quicksort

Das Verfahren

Quicksort ist ein schneller Sortieralgorithmus auf der Basis rekursiver Vergleiche von Elementen, welcher von C.A.O Hoare im Jahre 1960 entwickelt wurde.

Das Prinzip ist eine gegebene Gesamtliste G so in zwei Teillisten L und R auf zuteilen, dass alle Elemente von L kleiner (oder gleich) als ein Vergleichselement v \in G und alle Elemente von R größer (oder gleich) als v sind.

funktionaler Aufbau


Durch diese Prozedur entstehen die zwei Teillisten, die für die Unterscheidung der Relation in Bezug auf das Pivotelement benötigt werden.
Durch Enstehung dieser ist aber die eigentliche Sortieung noch nicht beendet. Dafür bedarf es einer weiteren Prozedur die die vorhergehende solange rekursiv aufruft, bis alle Elemente sortiert sind. Die Sorierung erfolgt in der Implementierung einfach durch das Vertauschen der Vergeichselemente.

Viualisierung

Die folgende Animation zeigt den verbildlichten Ablauf des Algorithmus: quicksort_animation.gif

Beispiel

Effizienz von Quicksort

Mergesort

Definition

  • Das Sortier­verfahren Mergesort erzeugt eine sortierte Folge durch Verschmelzen sortierter Teilstücke.
  • Das Verfahren beruht auf dem Divide-and-Conquer-Prinzip Erklärung.
  • Die zu sortierende Folge wird zunächst in zwei Hälften aufgeteilt (divide), die jeweils für sich sortiert werden (conquer).
  • Dann werden die sortierten Hälften zu einer insgesamt sortierten Folge verschmolzen (combine).
  • Dieses Verfahren bietet die Möglichkeit einer iterativen Implementierung.

Vorteile

  • Geschickter Einsatz der Teile-und-Herrsche Technik.
  • Gutes Laufzeitverhalten für große Eingabegrößen

                Sei \mathit{T}\left(n\right) die Laufzeit von Merge-Sort.
                Das Aufteilen braucht \mathcal{O}\left(1\right) Schritte.
                Die rekursiven Aufrufe brauchen 2\cdot \mathit{T}\left(\frac{n}{2}\right) Schritte.
                Das Mischen braucht \mathcal{O}\left(n\right) Schritte.
                Um Mergesort zu analysieren, ist die Rekursionsgleichung : \mathit{T}\left(n\right) = 2\cdot \mathit{T}\left(\frac{n}{2}\right) + \mathcal{O}\left(n\right), wenn n > 1 .

Best-Case: \mathit{T}\left(n\right) = \mathcal{O}\left(n \log n\right)
Worst-Case: \mathit{T}\left(n\right) = \mathcal{O}\left(n \log n\right)

  • Die Stabilität

        Die relative Ordnung zweier Elemente , welche gleich sind , wird beibehalten.

  • Abarbeiten Daten sequentiell.

Nachteile

  • der zusätzlich benötigte Speicher

Anwendung

  • Der Mergesort wird vor allem dann verwendet, wenn man eine große sortierte Datenmenge verwalten möchte.

Viualisierung , Simulation, Animation

S3anbrem_Mergesort-o.gif

http://palash90.in/tools.html#/algorithms/mergeSort http://www.ee.ryerson.ca/~courses/coe428/sorting/mergesort.html

Pseudocode



Beispiele

Beispiel 1

S3anbrem_Msb1.PNG

Beispiel 2

  • Analogie: Sortieren eines Kartenstapels
  • Karten sind mit Zahlen beschriftet

S3anbrem_Merrge-sort-beispiel-1.PNG

Schritt 1 : Teile den Stapel in zwei gleich grosse Stapel.
S3anbrem_Ms2.png

Schritt 2 : Sortiere beide Stapel getrennt.
S3anbrem_Ms3.PNG

Schritt 3 : Mische die beiden sortieren Stapel zu einem sortieren Stapel : lege dazu jeweils die kleinere der beiden oberen Karten umgedreht auf einen neuen Stapel.
S3anbrem_Ms4.png

Übungen

Übung 1

  • Sortieren Sie ein Array.

S3anbrem_Merge-sort-bsp1.PNG

1. Aufteilen der Eingabe

S3anbrem_Merge-sort-bsp1b.PNG

S3anbrem_Merge-sort-bsp1c.PNG

S3anbrem_Merge-sort-bsp1d.PNG

2. Teilen, Sortieren und Mischen der Eingabe

S3anbrem_Merge-sort-bsp1e.PNG

3. Mischen der Eingabe

S3anbrem_Merge-sort-bsp1f.PNG

4. Ergebnis

S3anbrem_Merge-sort-bsp1g.PNG

Zusammenfassung

  • Teile und Herrsche - Zerlegung größerer Aufgaben oder Probleme in kleinere Aufgaben oder Probleme, die einfacher zu bewältigen oder leichter gelöst werden können.
  • Mergesort - ein schnelleres (und rekursives) Sortierverfahren.
    • Ein Feld wird in zwei Teilfelder aufgeteilt, die dann rekursiv sortiert werden. Anschließend werden diese sortierten Teilfelder wieder zu einem Feld zusammengefügt. Dabei macht man sich zu nutze, daß die beiden Teilfelder bereits sortiert sind.
    • Mit einer Zeit­komplexität von Θ(n log(n)) ist das Verfahren immer optimal.
  • http://www.sorting-algorithms.com/

Übung 2

  • Sortieren Sie eine Array indem zwei Teilarrays sortiert und dann gemischt werden.

S3anbrem_B1a1.PNG

1. Aufteilen der Eingabe

S3anbrem_B1a.png

2. Rekursiv Sortieren

S3anbrem_B1b.png

3. Zusammenfügen

S3anbrem_B1c.png

Übung 3

Sortieren Sie die Buchstaben in der Zeichenkette aus Ihrem zusammengeschriebenen Vor- und Nachnamen mit Merge Sort.

Übung 4

MergeSort-JavaCode

1. Implementieren Sie eine Klasse „MergeSort".
2. Implementieren Sie in der Klasse eine Methode „sort“ mit den Parameter:


Details

1. Implementieren Sie eine Methode generateRandomNumbers ,welche wird den Zufallszahlengenerator, mit dem Parameter n.
2. Definieren Sie eindimensionales Array und initialisieren als das Array mit n.
3. Benutzen Sie Random .
4. Implementieren Sie die Schleife , welche sucht die Zahlen und speichert diese Zahlen in Array.
5. Die Methode soll am Ande unseres Resultat zurückgeben.

Binäres Suchen


Quellen

Wagenknecht, 2003, Algorithmen und Komplexität
Cormen, Leierson, Rivest und Stein, 2004, Algorithmen - Eine Einführung
http://www.inf-schule.de/
http://www.awb1.ch/
http://www.ki.informatik.uni-frankfurt.de/
http://ddi.cs.uni-potsdam.de/
http://thm.de/
http://de.wikiversity.org/
http://www.roland-illig.de/