Lineare Listen Stapel, Warteschlangen Binärbäume Seite 1 Lineare Liste Begriffe first Funktion: sequentielle Verkettung von Datensätzen Ordnungsprinzip: Schlüssel Begriffe: first - Anker, Wurzel; Adresse des logischen Listenanfangs - Schlüssel; Ordnungskriterium - Adresse des logischen Nachfolgers - Datensatz- - leere Adresse; logisches Ende der Liste Seite 2
Lineare Liste Beispiel *Biber Biber *Dachs Dachs *Eule Eule *Maus Maus *Uhu Uhu Seite 3 Operationen in linearen Listen Einfügen am Anfang Adler *Biber *Adler Biber *Dachs Dachs *Eule Eule *Maus Maus *Uhu Uhu Seite 4
Operationen in linearen Listen Einfügen am Anfang Algorithmus: Speichern des neuen Listenelementes auf beliebigen freien Speicherplatz Adresse der bisherigen Wurzel in des neuen Listenelementes eintragen Adresse des neuen Listenelementes in first eintragen Seite Operationen in linearen Listen Einfügen innerhalb der Liste Adler *Biber Katze *Maus *Adler Biber *Dachs Dachs *Eule Eule *Katze Maus *Uhu Uhu Seite 6
Operationen in linearen Listen Einfügen innerhalb der Liste Algorithmus: Speicherung des neuen Elementes auf beliebigen freien Speicherplatz Suchen der Einfügestelle (sequentielles Durchlaufen der Liste) Adresse des logischen Nachfolgers aus des logischen Vorgängers in des neuen Elementes eintragen Adresse des neuen Elementes in des logischen Vorgängers eintragen Seite Operationen in linearen Listen Einfügen am Ende der Liste Adler *Adler *Biber Katze *Maus Zebra Biber *Dachs Dachs *Eule Eule *Katze Maus *Uhu Uhu *Zebra Seite
Operationen in linearen Listen Einfügen am Ende der Liste Algorithmus: Speicherung des neuen Elementes auf beliebigen freien Speicherplatz Suchen der Einfügestelle (sequentielles Durchlaufen der Liste) Adresse aus des logischen Vorgängers in des neuen Elementes eintragen Adresse des neuen Elementes in des bisherigen logisch letzten Elementes eintragen Seite 9 Operationen in linearen Listen Löschen eines Elementes der Liste Adler *Adler *Biber Katze *Maus Zebra Biber *Dachs Dachs *Katze Eule *Katze Maus *Uhu Uhu *Zebra Seite 10
Operationen in linearen Listen Löschen eines Elementes der Liste Algorithmus: Suchen des zu löschenden Elementes (sequentielles Durchlaufen der Liste) Adresse des logischen Nachfolgers des zu löschenden Elementes aus dieses Elementes in des logischen Vorgängers eintragen (anstelle der Adresse des zu löschenden Elementes) Speicherplatz des gelöschten Elementes freigeben Seite 11 Lineare Liste Implementierung Voraussetzung: Direktzugriffsspeicher Notwendiger Speicherplatz: für n Datensätze zu je m Bytes = n*m Bytes Speicherplatz für Anker Verwaltung des Speichers durch Programm durch Betriebssystem Satzaufbau: Schlüsselattribut Satzinhalt / Daten Zeiger auf logisch nächsten Datensatz Seite 12
Lineare Liste Implementierung Probleme: aufwändiges Durchsuchen: Rückwärtsverkettung zusätzlich, Mehrfachverkettung Speicherverwaltung der leeren Datensätze: Bitmap (1 bit/datensatz) oder Lineare Liste freier Datensätze (Ankeradresse + Kettung der leeren Datensätze) oder...? logische Reihenfolge entspricht nicht physischer Reihenfolge: Reorganisation = Herstellen der Übereinstimmung von logischer und physischer Folge Seite 13 Lineare Liste Mehrfach-Verkettung first prev prev prev prev last Seite 14
Stapel LIFO: last in - first out stack end Prinzip: last in - first out (LIFO) Synonyme: Kellerspeicher, Stapel, stack Operationen: Hinzufügen eines Eintrags: stack[end] = new; end++; Entnehmen eines Eintrags: last = stack[end-1]; end--; Zustände des Stacks: voll; leer Seite 1 Warteschlange FIFO: first in - first out queue front end Prinzip: first in - first out (FIFO) Synonyme: Wartschlange, Schlange, queue Operationen: Hinzufügen eines Eintrags: queue[end] = new; end++; Entnehmen eines Eintrags: old = queue[front]; front++; Zustände der Warteschlange: voll; leer Seite 16
Binärbäume Begriffe Baum (tree) = endlicher, schwach zusammenhängender Graph, für dessen Knoten gilt: genau ein Knoten hat keinen Eingang (Wurzel, root) alle anderen Knoten haben genau einen Eingang endlicher Graph = Menge Knoten N (nodes) + Menge Kanten E (edges) Binärer Baum (binary tree) = geordneter Baum, der leer ist oder für dessen Knoten gilt: außer den Endknoten haben alle Knoten genau zwei Ausgänge maximal ein "Kind" jedes "Elternknotens" ist leer Seite 1 Binärbäume Begriffe Vollständiger Baum: alle Knoten besetzt Tiefe 0 Wurzel Tiefe 1 3 Unterbaum Tiefe 2 1 4 6 9 Blätter Unausgeglichener Baum: ungleiche Tiefe Vorgänger Direkter Nachfolger 3 6 1 4 Brüder Seite 1
Binärbäume Begriffe Ausgeglichener Baum: gleiche Tiefe oder max. eine Ebene Unterschied 4 6 2 Seite Binärer Suchbaum Erzeugen Ausgangspunkt: Liste 2 4 1 4 1 2 2 4 1 4 2 1 4 1 2 2 1 4 Seite 20
Binärer Suchbaum Hinzufügen Ausgangspunkt: ausgeglichener Binärbaum Hinzufügen: 20 3 29 1 11 24 1 (in dieser Reihenfolge) Algorithmus: Durchlaufen des Baumes bis zu einem Blatt Anhängen des neuen Knotens 4 6 2 9 20 29 3 1 24 11 1 Seite 21 Binärer Suchbaum Löschen Löschen: 3 20 (in dieser Reihenfolge) Algorithmus: Durchlaufen des Baumes bis zum zu löschenden Knoten Fallunterscheidung: Endknoten Knoten mit nur einem Nachfolger: Nachfolger ersetzt den zu löschenden Knoten Knoten mit zwei Nachfolgern: "größter" Knoten im "linken" Unterbaum bzw. "kleinster" Knoten im "rechten" Unterbaum ersetzt den zu löschenden Knoten 4 6 2 9 3 11 1 20 1 24 29 Seite 22
Binärer Suchbaum Löschen Ergebnis (1. Schritt): 4 6 20 4 6 29 2 9 29 2 9 24 3 1 24 1 11 1 11 1 Seite 23 Binärer Suchbaum Löschen Ergebnis (2. Schritt): 6 4 6 29 4 29 2 9 24 2 9 24 1 1 11 1 11 1 Seite 24
Binärer Suchbaum Durchmustern / Durchlaufen Durchmustern berührt alle Knoten des Baumes, Durchlaufen nur einen Teil Durchmustern in Präordnung: Reihenfolge: Wurzel des Unterbaums links rechts also: () ( (4 2 _) 6) ( ( _ 9) _) symmetrisches Durchmustern: Reihenfolge: links Wurzel rechts also: ((2 4 _) 6) (_ 9) _) Durchmustern in Postordnung: Reihenfolge: links rechts Wurzel also: ((2 _ 4) 6 ) ((_ 9 ) _ ) 4 6 2 9 Durchlaufen eines Baumes: von der Wurzel zu einem definierten Knoten "laufen" Seite 2 Binärer Suchbaum Suchen / Durchlaufen Algorithmus: Durchlaufen des Baumes bis zum gesuchten Knoten oder zu einem Blatt (bzw. "nicht gefunden") Beispiel: maxtiefe = 20 Anzahl der Knoten eines Baumes: n B = 2 (maxtiefe + 1) -1 2.09.11 Durchschnittliche Anzahl der Zugriffe: v B = ( maxtiefe+1) / 2 10, Anzahl der Zugriffe in einer Liste (zum Vergleich): v L = ( n L + 1 ) / 2 1.04.6 4 6 2 9 Seite 26
Syntaxbäume Darstellung der Syntax arithmetischer Ausdrücke: x+y x*y + * x y x y a*(b+c) a*((b+c)*(d*e-f/g)) * * a + a y* b c x+ y- b c x* yx/ d e f g Seite 2 Binärbäume Speichern von Binärbäumen Prinzip: *left *right *left *right *left *right Beispiel: * * 4 6 *4 *6 * 2 9 4 6 *2 *9 2 9 Seite 2
Binärbaum Balancierte Bäume Problem: zufällig erzeugte Bäume können sehr unsymmetrisch sein Suchoperationen werden dann aufwändig Lösung: zusätzliche Bedingungen beim Einfügen und Löschen berücksichtigen Beispiel: AVL-Bäume Seite 29 Binärbaum AVL-Bäume zurückzuführen auf Adelson-Velskij und Landis (62) Definition: Für jeden Knoten p eines AVL-Baumes gilt, dass sich die Höhe des linken Teilbaumes maximal um 1 von der des rechten Teilbaumes unterscheidet. Besonderheiten: Suchen in AVL-Bäumen geht mit O(log N) bei N Datensätzen Nach jedem Einfügen und Löschen muss überprüft werden, ob noch ein AVL-Baum vorliegt; sonst Wiederherstellung durch "Rotation" oder "Doppelrotation". Seite 30