4. Algorithmen, Datenstrukturen
Algorithmus: Eindeutige Beschreibung eines
endlichen Verfahrens zur Lösung einer bestimmten
Klasse von Problemen
Komplexität eines Algorithmus: Bedarf an
Ressourcen (i.e. Rechenzeit und Speicherplatz)
Güte eines Algorithmus:
Qualität der Ergebnisse
Laufzeit / Rechenbedarf des Algorithmus
5. Algorithmen, Datenstrukturen
Datentyp:
Bauplan für eine Variable (benannte Speicherstelle im
Arbeitsspeicher des Rechners)
Legt fest, welche Operationen mit einer Variable möglich
sind
Bestimmt die interne Darstellung (Repräsentation) der
Variablen im Rechner
Z.B. bool, int, float, double, unsigned int, etc.
8. Datenstruktur „Stack“
Auch: „Kellerspeicher“
Abstrakter Datentyp, bei dem Elemente eingefügt und
wieder entfernt werden können
LIFO-Prinzip: Last In, First Out – bei der
Datenstruktur „Stack“ kann immer nur auf das Element
zugegriffen werden, das als letztes eingefügt, d.h. auf
den Stapel gelegt wurde
9. Datenstruktur Stack
Typische Stackoperationen / Schnittstellen
push(x, s)
legt ein Element x auf den Stack s
top(s), peek(s)
liefert das zuletzt auf den Stack s gelegte Element (ohne das
entsprechende Element zu entfernen)
pop(s)
entfernt das zuletzt auf den Stack s gelegte Element und gibt
es zurück
isEmpty(s)
gibt an, ob der Stack s leer ist
10. Datenstruktur Stack: Die Praxis
Leerer Stack mit dem Namen audiocdstapel
Prüfen, ob Stack leer über Funktion
isEmpty(audiocdstapel) gibt TRUE zurück
11. Datenstruktur Stack: Die Praxis
Schritt I: Element auf den Stapel legen push
push(„boards of canada – music has the right to
children“, audiocdstapel)
Stack „audiocdstapel“ vor push(…)
Stack „audiocdstapel“ nach push(…)
12. Datenstruktur Stack: Die Praxis
Schritt II: Zahlreiche push-Vorgänge später:
push(„Boards of Canada – Music has the right to children“,
audiocdstapel)
push(„Clark – Iradelphic“, audiocdstapel)
…
Push(„Alt-J – An Awesome Wave“, audiocdstapel)
13. Datenstruktur Stack: Die Praxis
Schritt III: Prüfen, welche CD zuletzt auf den Stapel
gelegt wurde top
top(audiocdstapel) gibt „Alt-J – An Awesome
Wave“ zurück.
14. Datenstruktur Stack: Die Praxis
Schritt IV: Letztes Stapelelement ausgeben und
von Stapel nehmen pop
pop(audiocdstapel) gibt „ Alt-J – An Awesome
Wave“ zurück. Stapel nach pop(audiocdstapel):
15. Datenstruktur Stack: Die Praxis
Anwendungsbeispiel Pseudocode: Gehe den Stapel
durch und suche nach einer CD
while(!isEmpty(audiocdstapel)) {
currentaudiocd=pop(audiocdstapel);
if(currentaudiocd == mycd)
{
print „CD gefunden“;
return currentaudiocd;
}
}
18. Queue
Queue, auch „Warteschlange“
geordnete Liste, in der alle Einfügungen an einem Ende und
alle Löschungen am entgegengesetzten Ende stattfinden
Operationen:
enQueue Objekt hinzufügen
deQueue Objekt zurückgeben, anschließend entfernen
19. Queue
FIFO First In, First Out
Beispiele: Druckerwarteschlange, Warteschlange im
Supermarkt
„Wer zuerst da ist, mahlt zuerst“
21. Einfach verkettete Liste
Liste Folge von Elementen; jedes Element = Teil
einer Kette
Jeder Eintrag in der Liste verfügt nicht nur über
seinen Inhalt, sondern darüber hinaus über einen
Zeiger auf das nächste Listenelement:
22. Einfach verkettete Liste
Um die Liste zu durchlaufen:
Beginn beim ersten Element („Anker“ für den Beginn der
Liste)
„next“ zeigt auf das nächste Listenelement
Letztes Glied der Kette: next-Zeiger = NULL
Um wieder auf das erste Element zugreifen zu können:
anfang-Zeiger auf das erste Element der Liste
Hilfszeiger auf innere Elemente: cursor
23. Einfach verkettete Liste
Element Einfügen:
Ursprüngliche Liste:
start
bat
cat
sat
vat
NULL
Liste nach Einfügen von Element „mat“
start
bat
cat
sat
mat
vat
NULL
24. Einfach verkettete Liste
Element Löschen:
Ursprüngliche Liste:
start
bat
cat
sat
vat
NULL
Liste nach Entfernen des Elements „cat“
start
bat
cat
sat
vat
NULL
25. Einfach verkettete Liste
Vorteil:
Elemente lassen sich sehr schnell am Anfang der einfach
verketteten Liste einfügen
Nachteil:
Über jedes einzelne Element muss iteriert werden
start
bat
cat
sat
vat
NULL
26. Doppelt verkettete Liste
Charakteristika: Jedes Element verfügt über
Einen Inhalt
Einen Zeiger auf das nachfolgende Element
Einen Zeiger auf das vorhergehende Element
start
bat
cat
sat
vat
NULL
Vorteile
Möglichkeit, vom Ende der Liste zum Beginn zu iterieren
Schnelles Löschen und Einfügen von Elementen
Nachteil
Speicherplatzbedarf durch zweiten Zeiger erhöht
30. Juul, Jesper: „255,168 ways of playing Tic Tac Toe”
(„http://www.jesperjuul.net/ludologist/255168-ways-of-playing-tic-tac-toe)
Extensivform von Spielen (Tic Tac Toe)
32. Kleine Baumschule
Baum = Menge von Knoten und Kanten, die
besondere Eigenschaften aufweisen:
Wurzel: Jeder Baum besitzt genau einen Knoten, der als
Wurzel bezeichnet wird
Kante: Jeder Knoten ist außer der Wurzel durch genau
eine Kante mit seinem Vaterknoten (auch: „Elternknoten“
oder „Vorgänger“) verbunden
Wird dann auch als Kind (Sohn, Nachfolger) dieses
Knotens genannt
Blatt: Ein Knoten ohne Kinder
Innere Knoten: Alle anderen Knoten
51. Juul, Jesper: „255,168 ways of playing Tic Tac Toe”
(„http://www.jesperjuul.net/ludologist/255168-ways-of-playing-tic-tac-toe)
Extensivform von Spielen (Tic Tac Toe)
54. Lineare Suche
Sequenzielle / Lineare Suche in unsortierter Sammlung:
Anzahl Suchvorgänge bei n Elementen:
minimal: 1(best case),
maximal: n (worst case)
Durchschnittlich müssen die Hälfte der Einträge
durchgesehen werden, um das gewünschte Element zu finden
(average case)
Anzahl der Suchschritte steigt proportional mit der
Anzahl der Einträge
Quelle und Bildnachweis: http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo1.php
55. Sortieralgorithmen
Sortierstrategien / -Verfahren:
Insertionsort: Sortieren durch Einfügen
Analog dem Vorgehen eines Kartenspielers: Neue
Karten werden einzeln einsortiert, bevor die nächste
Karte aufgenommen wird
Bubblesort: Vergleichsbasierter Sortieralgorithmus
Heapsort
Quicksort (vgl. C.A.R. Hoare)
57. Bubblesort
Bubblesort: Sortiert z.B. ein Array von Datensätzen durch wiederholtes
Vertauschen von Nachbarfeldern, die in falscher Reihenfolge stehen
Wird so lange wiederholt, bis das Array vollständig sortiert ist.
Dabei wird das Array in mehreren Durchgängen von links nach rechts
durchwandert.
Bei jedem Durchgang werden alle Nachbarfelder verglichen und ggf.
vertauscht. Nach dem 1. Durchgang hat man folgende Situation:
Das größte Element ist ganz rechts.
Alle anderen Elemente sind zwar zum Teil an besseren Positionen (also näher an
der endgültigen Position), im Allgemeinen aber noch unsortiert.
Wandern des größten Elementes nach rechts Aufsteigen von
Luftblasen: Größte Luftblase steigt nach oben