Zum Hauptinhalt springen

Algorithmen

Ein Algorithmus stellt ein Verfahren zur Lösung eines Problems mit einer endlichen Anzahl von Schritten dar. In der Prpgrammierung ist ein Algorithmus eine Reihe von Anweisungen, die festlegen, was und wie etwas getan werden muss. Zielsetzung ist dabei, aus einer gegebenen Eingabe eine entsprechende Ausgabe zu erhalten. Beispiele aus der realen Welt für Algorithmen sind Aufbauanleitungen, Rezepte, Spielanleitungen und Beipackzettel.

Das nachfolgende Rezept beschreibt die Zubereitung von Pankcakes:

  1. 3 Eiweiss zu festem Eischnee verarbeiten
  2. 3 Eigelb und 50g Zucker schaumig rühren
  3. 300g Mehl, 300g Milch, 1 TL Backpulver und etwas Salz unter die Eigelb-Zuckermasse rühren
  4. Sollte der Teig zu fest sein, zusätzlich Milch unterrühren
  5. Den Eischnee unter den Teig heben
  6. Eine Pfanne mit etwas Fett erhitzen
  7. Die Pancakes goldgelb ausbacken
  8. Die Pancakes mit Puderzucker und Ahornsirup servieren
Hinweis

Die Überführung einer formalen Anleitung, also ein Algorithmus, in ein ausführbares Programm bezeichnet man als Programmierung.

Eigenschaften von Algorithmen

Damit ein Verfahren als Algorithmus angesehen werden kann, muss es verschiedene Eigenschaften erfüllen:

  • Determiniertheit: Ein Verfahren ist deterministisch, wenn es bei beliebig häufiger Wiederholung für gleiche Eingabewerte und gleichen Rahmenbedingungen immer zum gleichen Ergebnis führt.
  • Eindeutigkeit (Determinismus): Ein Verfahren ist determiniert, wenn die Schrittfolge immer gleich ist und immer zu einem eindeutigen Ergebnis führt.
  • Endlichkeit (Terminiertheit): Ein Verfahren ist terministisch, wenn die Anzahl der Schritte endlich ist, also wenn das Verfahren nach endlichen Schritten ein Ergebnis liefert.
  • Korrektheit: Ein Verfahren ist korrekt, wenn es immer zu einem richtigen Ergebnis führt.

Komplexität von Algorithmen

Da der Zeitaufwand von Algorithmen aufgrund unterschiedlicher Faktoren (Hardware, parallele Verarbeitung, Eingabereihenfolge,…) nicht genau ermittelt werden kann, wird diese mit Hilfe der Landau-Notation 𝒪 (Ordnung von) dargestellt. Diese teilt Algorithmen in unterschiedliche Komplexitätsklassen (logarithmisch, linear, polynomial,…) ein. Die Komplexität einer Klasse ergibt sich dabei aus der Anzahl der Schritte, die abhängig von der Größe der Eingangsvariablen ausgeführt werden müssen.

Suchalgorithmen

Suchalgorithmen sollen innerhalb einer Datensammlung einen oder mehrere Datensätze mit bestimmten Eigenschaften finden.

AlgorithmusKomplexität Best CaseKomplexität Average CaseKomplexität Worst Case
Linearsuche𝒪(1)𝒪(𝑛)𝒪(𝑛)
Binärsuche𝒪(1)𝒪(𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑙𝑜𝑔 ⁡𝑛)
Interpolationssuche𝒪(1)𝒪(𝑙𝑜𝑔 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛)

Bei der Linearsuche werden alle Einträge einer Datensammlung nacheinander durchlaufen, d.h. eine Suche kann im besten Fall beim ersten Eintrag und im schlechtesten Fall beim letzten Eintrag beendet sein. Bei einer erfolglosen Suche müssen alle Einträge durchlaufen werden.

Im nachfolgenden Beispiel wird die Zahlenfolge 12, 16, 36, 49, 50, 68, 70, 76, 99 nach dem Wert 70 durchsucht.

Index1234567
0[12]121212121212
116[16]1616161616
23636[36]36363636
3494949[49]494949
450505050[50]5050
56868686868[68]68
6707070707070[70]
776767676767676
899999999999999
Hinweis

Durch vorheriges Sortieren der Sammlung kann die Leistung des Algorithmus verbessert werden.

Sortieralgorithmen

Sortieralgorithmen sollen eine möglichst effiziente Speicherung von Daten und deren Auswertung ermöglichen. Man unterscheidet dabei zwischen einfachen und rekursiven Sortieralgorithmen. Zusätzlich wird bei Sortierverfahren zwischen stabilen und nichtstabilen Verfahren unterschieden. Bei stabilen Sortierverfahren bleibt die Reihenfolge von gleich großen Datensätzen bei der Sortierung erhalten. Die Platzkomplexität eines Sortierverfahrens schließlich gibt an, ob zusätzlicher Speicherplatz für Zwischenergebnisse unabhängig von der Anzahl Daten ist (in-place) oder nicht (out-of-place).

AlgorithmusKomplexität Best CaseKomplexität Average CaseKomplexität Worst CaseStabilIn-Place
Bubblesort𝒪(𝑛2)𝒪(𝑛2)𝒪(𝑛2)jaja
Insertionsort𝒪(𝑛)𝒪(𝑛2)𝒪(𝑛2)jaja
Selectionsort𝒪(𝑛2)𝒪(𝑛2)𝒪(𝑛2)neinja
Quicksort𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛2)neinja
Mergesort𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)janein
Heapsort𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)𝒪(𝑛 𝑙𝑜𝑔 ⁡𝑛)neinja

Der Bubblesort verfolgt die Idee, das größere Blasen schneller aufsteigen als kleinere. Dementsprechend werden beim Bubblesort Nachbarelemente miteinander verglichen und gegebenenfalls vertauscht, so dass am Ende eines Durchlaufs das jeweils größte Element am Ende des noch unsortierten Teils steht.

Index0123456789
012121212121212121212
199505036363636161616
250683649494916363636
368364950501649494949
436496868165050505050
549767016686868686868
676701670707070707070
770167676767676767676
816999999999999999999