MinSort

Aus ProgrammingWiki
Archivierte Version vom 2010-10-07T10:09:38+00:00. Aktuelle Version

Inhaltsverzeichnis

Algorithmus

Bei einfachen rekursiven Problemlösungen haben wir Algorithmen implementiert, die der Suche des Minimums bzw. dem Streichen eines Elements in unverschachtelten numerischen Listen entsprechen. Daraus haben wir bereits einen ersten Sortieralgorithmus konstruiert:

Beschreibung:

  • Suche aus der Liste das Minimum heraus,
  • streiche es an seiner ursprünglichen Stelle und
  • stelle es der Minimum-sortierten Restliste voran.

Da sich dieser Algorithmus am Minimum einer Liste orientiert, bezeichnen wir ihn als MinSort. Auf diese Weise sortieren Kartenspieler recht häufig ihre Spielkarten in der Hand.
Implementieren Sie den Algorithmus und testen Sie ihn an Listen mit Zufallszahlen z, mit z \in \mathbb{Z}.
Stellen Sie dazu die ungeordnete und die geordnete Zahlenliste jeweils in einem Balkendiagramm grafisch dar.

Ungeordnete Zufallszahlen:

Ihr Browser unterstützt Canvas nicht.
 

Geordnete Zufallszahlen:

Ihr Browser unterstützt Canvas nicht.

<eval id="4be1586d291d6"> (define ls (zufallsliste 1 1000 100)) (balkendiagramm ls canvas1 turtle1) (define ls-sort (minsort ls)) (balkendiagramm ls-sort canvas2 turtle2) </eval>

Hinweis: Um mehrere Zeichenflächen nutzen zu können, muss die Prozedur balkendiagramm syntaktisch erweitert werden:

(balkendiagramm
  <ls>       ;Liste mit Zahlenwerten   
  <canvas>   ;Zeichenfläche
  <turtle>)  ;Turtle (Zeichenroboter)

Effizienz von MinSort

Theoretische Analyse des Zeitaufwands

Wir überlegen uns zunächst, wie viele Vergleiche bei der Minimumsuche insgesamt durchgeführt werden:

MinSort-Schema1.gif

Das Schema lässt sich mit einer Dreieckfläche vergleichen. Damit sind also \tfrac{n}{2} (n-1) Vergleiche zum Auffinden des Minimums notwendig.
Zum Streichen des gefundenen Minimums sind ähnliche Überlegungen möglich. Im Mittel kann man aber davon ausgehen, dass das Streichen nach \tfrac{n}{2} Vergleichen pro Durchlauf abgeschlossen ist (endständig rekursive Prozedur).
Damit ist folgende Abschätzung für den Gesamtaufwand möglich:

T(n) = \underbrace{\frac{n}{2} \cdot (n-1)}_{Min-Suche} + \underbrace{\frac{1}{2} \cdot \frac{n}{2} \cdot (n-1)}_{Streichen} = \frac{3}{4} \cdot n \cdot (n-1)

T(n) \approx \frac{3}{4} \cdot n^2   bzw.

T(n) = \mathcal{O}(n^2)

Das Minimum-Sortieren erfolgt mit quadratischem Zeitaufwand.

Experimente zum Zeitaufwand

Wir wollen unsere theoretische Analyse empirisch bestätigen. Dazu definieren wir unseren MinSort-Algorithmus mit einem "eingebauten" (Zeittakt-)Zähler:

<eval id="4be330b1c9ba7"> (minsort-ausgabe 1 1000 20) </eval>

Im Weiteren wollen wir uns wieder nur auf die Zählergebnisse unseres "Zeittaktmessers" konzentrieren.
Dazu sollen die Wiederholungen des Experimentes automatisiert werden:

<eval id="4be330b1cab47"> (minsort-mehrfach 1 1000 20 100) </eval>

Schließlich sollen die Ergebnisse unserer empirischen Untersuchung wieder im Balkendiagramm visualisiert werden.

Achtung! Mit kleinen Wiederholraten und etwas Geduld experimentieren!

Ihr Browser unterstützt Canvas nicht.

<eval id="4be330b1cbae6"> (balkendiagramm (experiment 1 1000 200 5 10) canvas3 turtle3) </eval>

Die empirischen Untersuchungen bestätigen den quadratischen Zeitaufwand von MinSort.

Aufgaben

  1. Ermitteln Sie mit der Prozedur minsort-mehrfach empirisch die Zeitaufwandsfunktion T:\mathbb{N} \rightarrow \mathbb{R}^+.
    Nutzen Sie dazu eine Tabellenkalkulation oder den grafikfähigen Taschenrechner. Bestimmen Sie die Funktionsgleichung T(n) = f(n) durch quadratische Regression und vergleichen Sie diese mit den oben angeführten theoretischen Überlegungen.

  2. Implementieren Sie unter DrScheme den MinSort-Algorithmus zum lexikografischen Ordnen von Zeichenketten.
    Dabei soll wahlweise aufsteigend oder absteigend geordnet werden können (Prozeduren höherer Ordnung!).