Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:q3:komplexitaet:l5-aufwandsanalyse

Aufwandsanalyse

Umfang der zu verarbeitenden Daten*

Ein Algorithmus ist eine eindeutig ausführbare und endlich beschreibbare Verarbeitungsvorschrift, die eine Klasse von Problemen löst (vgl. Fachkonzept - Algorithmus).

Ein Algorithmus liefert also Lösungen für eine Vielzahl von analogen Problemstellungen. So werden Sortieralgorithmen nicht nur für eine einzige Liste konzipiert, sondern so, dass sie auf Listen beliebiger Länge anwendbar sind.

Zur Beurteilung eines Algorithmus werden der Zeit- und Speicheraufwand genauer betrachtet. Es ist klar, dass der Zeit- und Speicheraufwand in der Regel vom Umfang der zu verarbeitenden Daten abhängt. Bei einem Sortiervorgang beispielweise steigen Zeit- und Speicheraufwand mit der Anzahl der zu sortierenden Datensätze.

Der Umfang der zu verarbeitenden Daten wird mit dem Begriff Problemgröße erfasst.

Problemgröße
Die Problemgröße ist eine präzise Beschreibung des Umfangs der zu verarbeitenden Daten, von dem das Zeit- bzw. Speicherverhalten von Lösungalgorithmen maßgeblich beeinflusst wird.
Beispiel - Sortieren als Problem

Das Problem besteht darin, eine Folge von Datensätzen nach bestimmten Kriterien der Größe nach zu ordnen. Ein kleines Problem besteht z.B. darin, die Folge 6, 9, 2, 5, 8 aufsteigend der Größe nach zu sortieren. Ein größeres Problem ist sicher, eine Folge von einer Million Zahlen aufsteigend der Größe nach zu sortieren. Die Problemgröße lässt sich hier durch die Anzahl der zu ordnenden Zahlen (Datensätze) beschreiben.

Kostenmaße und Kostenfunktionen

Kostenmaße und Kostenfunktion - 1

Betrachten wir zunächst einen Algorithmus (bzw. eine geeignete Implementierung) zur Lösung des Sortierproblems:

int[] sortiere(int[] liste) {
  for (int bereichsGrenze = 0; bereichsGrenze < liste.length; bereichsGrenze++) {
    int kleinstes = bereichsGrenze;
 
    for (int i = bereichsGrenze; i < liste.length; i++) {
      if (liste[i] < liste[kleinstes]) {
        kleinstes = i;
      }
    }
 
    int tmp = liste[bereichsGrenze];
    liste[bereichsGrenze] = liste[kleinstes];
    liste[kleinstes] = tmp;
  }
 
  return liste;
}

Bei der Ausführung des Algorithmus (bei vorgegebener Problemgröße) spielt es eine Rolle, wie viele Operationen ausgeführt werden müssen. Operationen sind im vorliegenden Algorithmus u.a. das Ausführen eines Vergleichs und das Ausführen einer Zuweisung. Als Kostenmaß zur Beschreibung des zeitlichen Aufwands könnte man also die Gesamtanzahl der auszuführenden Vergleiche und Zuweisungen wählen.

Eine solche Festlegung des Kostenmaßes würde von folgender Vereinfachung ausgehen: Alle Vergleiche und Zuweisungen liefern denselben Beitrag zur Ausführungszeit. Ein Vergleich von Indexwerten (wie i < liste.length) würde als gleichwertig mit einem Vergleich von Datenwerten (wie liste[i] < liste[kleinstes]) behandelt. Wenn die zu sortierende Liste nur Zahlen verwaltet, mag das angemessen sein. Wenn die Liste aber komplexere Datensätze wie z.B. Strings verwaltet und der Vergleich dieser Datensätze aufwendig ist, dann ist der Gleichwertigkeitsansatz sicher nicht sinnvoll.

Bei der Festlegung eines Kostenmaßes müssen also Annahmen über den Aufwand der verschiedenen auszuführenden Operationen gemacht werden. Zwei ganz unterschiedliche Wege kann man dabei bestreiten. Ein Weg besteht darin, unterschiedliche Aufwände von Operationen möglichst genau zu erfassen und im Kostenmaß zu berücksichtigen. Ein anderer Weg beschränkt sich darauf, dominante Operationen auszuwählen und die Kosten nur grob abzuschätzen. Wir werden hier den zweiten Weg beschreiten.

Wenn man den Vergleich von Datensätzen als dominate Operation beim Sortieren ansieht, dann lässt sich das folgende Kostenmaß für Sortieralgorithmen festlegen: Alle Datensatzvergleiche werden als gleichaufwendig angesehen (egal wie die Daten im Detail beschaffen sind) und daher nur gezählt. Alle anderen Operationen werden nicht weiter berücksichtigt. Mit dieser Festlegung erhält man die folgende Kostenfunktion $T(n)$ zur Beschreibung der Zeitkomplexität beim Sortieren:

  • Problemgröße $n$: Anzahl der Datensätze (Listenelemente)
  • Kosten $T(n)$: Anzahl der Datensatzvergleiche bei der Ausführung des Algorithmus bei einer Problemgröße $n$

Folgende Begriffe werden bei der Aufwandsmodellierung benutzt.

Kostenmaß und Kostenfunktion

Ein Kostenmaß legt fest, in welchem Maße welche Operationen bei der Aufwandsbestimmung berücksichtigt werden. Eine Kostenfunktion ordnet der Problemgröße n die vom Algorithmus benötigten Gesamtkosten $T(n)$ bzgl. des vorgegebenen Kostenmaßes zu.

Kostenmaße und Kostenfunktion - 2

Bei der Beschreibung der Zeitkomplexität mit Hilfe einer Kostenfunktion werden in der Regel eine Reihe von Vereinfachungen vorgenommen sowie Annahmen gemacht. Die Festlegung einer Kostenfunktion kann somit als eine Form der Modellierung angesehen werden, weil hier ein Berechnungsmodell entwickelt werden muss, das den Berechnungsaufwand vereinfachend beschreibt.

Wie bei jeder Modellierung kann das entwickelte Modell mehr oder auch weniger geeignet sein, um die zu beschreibende Wirklichkeit darzustellen. Bei der Modellierung der Zeitkomplexität kommt es darauf an, "richtige" Annahmen über den Aufwand bestimmter, im Algorithmus vorkommender Operationen zu machen.

Kostenanalyse für Sortieralgorithmen

Vergleiche zählen

Wir betrachten die bereits eingeführten Algorithmen zur Lösung des Sortierproblems. Ziel ist es, die Kosten bei der Ausführung der Algorithmen abzuschätzen.

Als Problemgröße wählen wir die Anzahl n der Datensätze (Listenelemente). Die Kosten T(n) sollen durch die Anzahl der Datensatzvergleiche bei der Ausführung des Algorithmus bei einer Problemgröße n erfasst werden.

Aufgabe 1

(a) Bilanziere die Kosten (Anzahl der Vergleiche) beim folgenden Sortiervorgang durch Auswählen.

| 25   17   32   56   25   19    8   66   29    6   20   29    Vergleiche: 11
                                                ^
  6  | 17   32   56   25   19    8   66   29   25   20   29
                                 ^
  6    8  | 32   56   25   19   17   66   29   25   20   29
                                ^
  6    8    17 | 56   25   19   32   66   29   25   20   29
                           ^
  6    8    17   19 | 25   56   32   66   29   25   20   29
                                                    ^
  6    8    17   19   20 | 56   32   66   29   25   25   29
                                               ^
  6    8    17   19   20   25 | 32   66   29   56   25   29
                                                    ^
  6    8    17   19   20   25   25 | 66   29   56   32   29
                                          ^
  6    8    17   19   20   25   25   29 | 66   56   32   29
                                                         ^
  6    8    17   19   20   25   25   29   29 | 56   32   66
                                                    ^
  6    8    17   19   20   25   25   29   29   32 | 56   66
                                                    ^
  6    8    17   19   20   25   25   29   29   32   56 | 66

Ändert sich die Bilanz, wenn andere Zahlen in der Liste stehen?

(b) Bilanziere die Kosten (Anzahl der Vergleiche) ebenso beim folgenden Sortiervorgang durch Einfügen.

  | 25 17   32   56   25   19    8   66   29    6   20   29    Vergleiche: 0
  ^  
  25 | 17   32   56   25   19    8   66   29    6   20   29    Vergleiche: 1
  ^
  17   25 | 32   56   25   19    8   66   29    6   20   29    Vergleiche: 2
       ^
  17   25   32 | 56   25   19    8   66   29    6   20   29    Vergleiche: 3
            ^
  17   25   32   56 | 25   19    8   66   29    6   20   29    Vergleiche: 2
       ^
  17   25   25   32   56 | 19    8   66   29    6   20   29    Vergleiche: 2
       ^
  17   19   25   25   32   56  | 8   66   29    6   20   29    Vergleiche: 1
  ^
  8    17   19   25   25   32   56 | 66   29    6   20   29    ...
  ...

Wie wirkt sich hier eine andere Ausgangsliste auf die Kostenbilanz aus?

Fallanalysen

Die Anzahl der Datensatzvergleiche bei der Ausführung eines Sortieralgorithmus hängt manchmal nicht nur von der Problemgröße $n$ (d.h. der Anzahl der Listenelemente) ab, entscheidend ist auch, wie stark die Liste bereits vorsortiert ist.

Bei einer Kostenanalyse unterscheidet man daher oft die folgenden Fälle:

  • best case (bester Fall): der Fall, in dem bei der Ausführung des Algorithmus die wenigsten Kosten anfallen
  • worst case (schlechtester Fall): der Fall, in dem bei der Ausführung des Algorithmus die meisten Kosten anfallen
  • average case (durchschnittlicher Fall): eine Mittelung der Kosten über alle Fälle

Für die Praxis am wichtigsten ist meist der durchschnittliche Fall. Dieser ist aber schwer zu ermitteln. Wir konzentrieren uns hier daher auf den besten und schlechtesten Fall, wobei letzterer meist der relevantere ist.

Beispiel: Selectionsort

Bei SelectionSort muss man in jedem Fall im ersten Schritt $n-1$ Vergleiche durchführen, im zweiten Schritt $n-2$ Vergleiche usw.. Es gilt also:

$$T_{best}(n) = (n-1) + (n-2) + ... + 1$$ $$T_{worst}(n) = (n-1) + (n-2) + ... + 1$$

Beispiel: Insertionsort

Im ungünstigsten Fall muss beim Einfügen der gesamte bereits vorliegende sortierte Teil durchlaufen werden. Hier gilt dann:

$$T_{worst}(n) = 1 + 2 + ... + (n-1)$$

Im günstigsten Fall kann das nächste Element nach einem Vergleich an der richtigen Position eingefügt werden. Es gilt dann:

$$T_{best}(n) = n-1$$

Aufgabe 2

Muss man bei der Aufwandsanalyse zum Bubblesort-Algorithmus unterschiedliche Fälle unterscheiden? Führe eine Aufwandsanalyse durch und bestimme eine Formel für $T(n)$.

Aufgabe 3

(a) Erläutere anhand geeigneter Beispiele, dass der Vergleichsaufwand bei der Durchführung des Quicksort-Algorithmus stark von der Ausgangsliste abhängt.

(b) Begründe, dass der Vergleichsaufwand bei der Durchführung des Quicksort-Algorithmus im günstigsten Fall mit der Kostenfunktion $T_{best}(n) = n*log_2(n)$ und im ungünstigsten Fall mit der Kostenfunktion $T_{worst}(n) = \frac{n*(n-1)}{2}$ angenähert beschrieben wird.

Aufgabe 4

Welches Sortierverfahren ist vorzuziehen, wenn eine Liste bereits größtenteils vorsortiert ist, und welches, wenn eine Liste völlig unsortiert ist?

info/sek-ii/q3/komplexitaet/l5-aufwandsanalyse.txt · Zuletzt geändert: 2022-12-12 13:43 von christian.weber