FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 K27 Datenstrukturen Teil 1 • Inhalt Einführung 1. Arrays 1. Array unsortiert 2. Array sortiert 3. Heap 2. Listen 1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert 3. Bäume Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 1 Lernziele • Sie festigen Ihr Wissen über Arrays und Heaps • Sie verstehen die verschiedenen Arten der Speicherung von Informationen in Listen • Sie kennen sich mit den verschiedenen Arten von binären Bäumen aus • Sie wissen, wie binäre Bäume traversiert werden können Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin K27 Datenstrukturen Teil 1 Folie 2 Teil 1 Seite 1 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 Einführung • Datenstrukturen – Zentrale Bedeutung in der Programmierung – Unabhängig von einer bestimmten Programmiersprache • Typische Eigenschaften von Datenstrukturen sind: ? ? ? ? ? – – – – Zugriffsart, z.B. direkt Zugriffsmöglichkeiten, z.B. Nachfolger Zugriffsaufwand, z.B. O(n) statische oder dynamische Datenstrukturen (vgl. Array vs. Bäume) – implizite oder explizite Datenstrukturen (vgl. Stack als Array oder Liste) 41 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 3 1. Arrays • Array – Grösse wird bei Deklaration oder Instanzierung festgelegt – Zur Laufzeit ist Speicherplatz fest reserviert (statisch) • Unabhängig, wie viele Komponenten des Arrays effektiv zum Speichern von Daten benötigt werden – Direkter Zugriff auf Komponente über Index • direct access • einfach, sehr schnell – Arrays repräsentieren implizite Datenstrukturen • Für das Festhalten der Beziehungen zwischen den Daten ist nicht explizit Speicher erforderlich • Beziehungen werden implizit festgehalten, z.B. durch Formeln 42 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 4 Teil 1 Seite 2 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 1. Arrays • In Java werden meistens Objekte in Arrays verwaltet – Objekte via Referenzvariablen "s" "c" "x" "i" "o" "m" "e" "k" 0 1 2 3 4 5 6 7 array 8 9 – Vereinfacht array s c x i o m e k 0 1 2 3 4 5 6 7 8 9 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 42 K27 Datenstrukturen Teil 1 Folie 5 1.1 Array unsortiert array s c x i o m e k 0 1 2 3 4 5 6 7 8 9 • Zugriff auf Elemente suchen entfernen einfügen O(n) O(n)* O(1) Nachfolger Vorgänger nein nein sortierte Ausgabe nein * inklusive Nachrücken bzw. Auffüllen mit letztem Element • Bemerkung: • Ein Array kann bekanntlich mit einem Aufwand von O(n×log n) sortiert werden (vgl. Heapsort) 43 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 6 Teil 1 Seite 3 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 1.2 Array sortiert array c e i k m o s x 0 1 2 3 4 5 6 7 8 9 • Zugriff auf Elemente suchen entfernen einfügen O(log n) O(n)* O(n)* Nachfolger Vorgänger ja sortierte Ausgabe ja ja * inklusive Nachrücken • Bemerkung: • Das Suchen erfolgt nun einfach binär 43 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 7 1.3 Heap • Nicht verwechseln mit dynamischer Speicherverwaltung! • Ein Heap ist ein binärer Baum, der – eine strukturelle Bedingung erfüllt • ein fast vollständiger Baum ist (vgl. 3.5), – eine inhaltliche Bedingung erfüllt • jeder innere Knoten besitzt eine höhere Priorität als seine Söhne – auf eine spezielle Weise in einem Array abgespeichert ist 44 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 8 Teil 1 Seite 4 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 1.3 Heap • Entfernen des Wurzelelementes – Durch Methode getMaximum() – – Baum muss reorganisiert werden Erfüllung der strukturelle und inhaltliche Bedingung 1. Wurzelelement entfernen: O(1) getMaximum() 17 15 10 9 5 4 2 1 12 13 3 8 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 45 K27 Datenstrukturen Teil 1 Folie 9 1.3 Heap 2. Blatt ganz unten rechts zur Wurzel hoch verschieben: O(1) 8 10 15 5 4 9 2 1 13 12 3 3. Sinkprozess durchführen: O(log n) 15 15 10 8 5 4 9 2 1 45 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin 13 3 10 13 5 12 4 9 2 1 8 12 3 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 10 Teil 1 Seite 5 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 1.3 Heap • Auch insert() muss beide Bedingungen sicherstellen: 1. Neues Element als Blatt ganz unten rechts einfügen: O(1) 15 10 13 5 9 12 8 insert() 4 2 1 3 14 2. Steigprozess durchführen: O(log n) 15 15 13 10 5 4 14 9 2 1 3 14 10 12 5 4 8 13 9 1 2 12 8 3 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 46 K27 Datenstrukturen Teil 1 Folie 11 1.3 Heap • Abbildung des fast vollständigen binäre Baums in einem Array a: 12 15 13 8 17 3 9 1 10 2 5 4 a 9 13 12 4 2 1 3 0 4 5 8 9 10 11 12 13 14 15 16 17 1 2 3 6 7 Vater mit Index (j-1)/2 Vater mit Index i 47 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin ... 17 10 15 5 linker Sohn mit Index (2⋅i)+1 8 Sohn mit Index j rechter Sohn mit Index 2⋅(i+1) Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 12 Teil 1 Seite 6 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 1.3 Heap • Aufwände bezüglich: – getMaximum(): O(1) + O(1) + O(log n) = – insert(): O(1) + O(log n) = O(log n) O(log n) • Zugriff auf Elemente suchen entfernen* einfügen O(n) O(log n) O(log n) Nachfolger Vorgänger nein nein sortierte Ausgabe "nein" * nur Maximum (oder Minimum) inklusive Reorganisation 47 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 13 2. Listen • Liste – Mit Hilfe von Referenzvariablen und Objekten Datenstrukturen dynamisch auf- und abbauen • Nur soviel Speicherplatz allozieren, wie benötigt wird • Von Anzahl Objekten abhängig – Objekte sind nicht mehr direkt ansprechbar • Nur noch indirekt über Referenzvariablen – Listen repräsentieren explizite Datenstrukturen • Für das Festhalten der Beziehungen zwischen den Daten ist explizit Speicher erforderlich 48 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 14 Teil 1 Seite 7 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 2. Listen • In Java werden Objekte in Listen verwaltet – Objekte via Referenzvariablen – Verweis auf nächstes Objekt via Referenzvariable "s" "c" "x" "i" "o" "m" liste – Vereinfacht s c x i o m liste Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 48 K27 Datenstrukturen Teil 1 Folie 15 2.1 Einfach verkettete Liste unsortiert s c x i o m liste • Zugriff auf Elemente suchen entfernen einfügen O(n) O(n) O(1) 49 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Nachfolger Vorgänger nein nein Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 sortierte Ausgabe nein K27 Datenstrukturen Teil 1 Folie 16 Teil 1 Seite 8 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 2.2 Einfach verkettete Liste sortiert c i m o s x liste • Zugriff auf Elemente suchen entfernen einfügen O(n) O(n) O(n) Nachfolger Vorgänger ja sortierte Ausgabe nein ja • Bemerkung: • Handhabung von sortierten, einfach verketteten Listen ist relativ aufwendig • Deshalb werden sie eher selten eingesetzt Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 49 K27 Datenstrukturen Teil 1 Folie 17 2.3 Doppelt verkettete Liste sortiert c i m o head tail • Zugriff auf Elemente suchen entfernen einfügen O(n) O(n) O(n) 4 10 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Nachfolger Vorgänger ja ja Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 sortierte Ausgabe ja K27 Datenstrukturen Teil 1 Folie 18 Teil 1 Seite 9 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3. Bäume • Bäume – Weitere wichtige dynamische Datenstrukturen • Verwendung bei: – hierarchischen Beziehungen – rekursiven Objektstrukturen 4 11 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 19 3.1 Beispiele a) Sortierte Namen b) Arithmetischer Ausdruck: z.B. (8+(7*2))*(4-(2/3)) 4 11 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 20 Teil 1 Seite 10 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.1 Beispiele c) Quadtree Nummerierung der Quadranten: 1 1 2 3 2 3 1 2 3 4 4 4 4 12 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 21 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 22 3.2 Terminologie 4 12 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Teil 1 Seite 11 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.3 Binäre Bäume • Ein binärer Baum ist ein Baum mit Grad 2: • Minimale Höhe hmin Binärer Baum mit n Knoten (vgl. vollständig ausgeglichener binärer Baum) : ? – hmin = aufgerundet ld(n + 1) • Maximale Höhe hmax Binärer Baum mit n Knoten (vgl. lineare Liste): ? – hmax = n Hinweis: ld n = (log n) / (log 2) ð O(ld n) = O(log n) 4 13 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 23 3.3 Binäre Bäume • Minimale Weglänge wmin Beliebiger binärer Baum (vgl. Wurzel): ? – wmin = 1 • Maximale Weglänge wmax Binärer Baum mit n Knoten (vgl. lineare Liste): ? – wmax = hmax • Mittlere Weglänge wmittel Zufälliger binärer Baum mit n Knoten (gilt für grosse n): ? – wmittel ≈ 1,4 ⋅ hmin 4 13 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 24 Teil 1 Seite 12 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.3 Binäre Bäume • Vollständiger binärer Baum – Ein binärer Baum der Höhe h heisst vollständig, wenn er aus n = 2h - 1 Knoten besteht – Er besitzt dann natürlich die kleinstmögliche Höhe h = hmin 4 14 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 25 3.4 Fast vollständiger binärer Baum • Fast vollständiger binärer Baum – Unterschied zu vollständigen Baum mit der Höhe h: • Niveau h muss nicht vollständig mit Blättern belegt sein • Vorhandene Blätter auf Niveau h müssen sich ganz links befinden – Besitzt ebenfalls die kleinstmögliche Höhe h = hmin 4 14 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 26 Teil 1 Seite 13 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.5 Vollständig ausgeglichener binärer Baum • Vollständig ausgeglichener binärer Baum – Für jeden inneren Knoten • unterscheiden sich die Anzahl Knoten in linken und rechten Teilbaum um höchstens 1 – Besitzt ebenfalls die kleinstmögliche Höhe h = hmin 4 15 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 27 3.6 Ausgeglichener binärer Baum AVL-Baum • Ausgeglichener binärer Baum AVL-Baum – Adelson-Velskii und Landis, 1962 – Für jeden inneren Knoten • unterscheiden sich die Höhen in linken und rechten Teilbaum um höchstens 1 – Die Höhe lässt sich unabhängig von n abschätzen • Höhe h < 1.45 * hmin 4 15 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 28 Teil 1 Seite 14 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.7 Geordneter binärer Baum • Geordneter binärer Baum – Jedem Knoten ist ein Schlüssel zugeordnet • z.B. Nummer oder Namen – Einfügen eines neuen Knotens • entsprechend der definierten Ordnung auf den Schlüsselwerten • immer als Blatt – Die Höhe des Baumes ist abhängig von der Reihenfolge der Schlüssel • Die Höhe liegt im Bereich h = hmin ... hmax 4 16 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 29 3.7 Geordneter binärer Baum • Beispiel: – 7 8 1 14 10 27 4 6 8 ð 4 16 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 30 Teil 1 Seite 15 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.7 Geordneter binärer Baum • Bester Fall – Binäre Baum ist vollständig ausgeglichen – Höhe h = hmin 4 17 Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 31 3.7 Geordneter binärer Baum • Schlechtester Fall – Binäre Baum ist lineare Liste – Höhe h = hmax 4 17 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 32 Teil 1 Seite 16 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.8 Durchlaufen eines Baumes • Durchlaufen eines Baumes – Tree Traversal – Alle Knoten bzw. Objekte eines Baumes bearbeiten – Drei Varianten für das Durchlaufen des Baumes – Diese Varianten sind rekursiv wie folgt definiert: W L 4 18 R Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 33 3.8 Durchlaufen eines Baumes 1. Preorder: ? – W, L, R – die Wurzel vor den Teilbäumen 2. Inorder: ? W – L, W, R 3. Postorder: ? L R – L , R, W – die Wurzel nach den Teilbäumen 4 18 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 34 Teil 1 Seite 17 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.8 Durchlaufen eines Baumes • Beispiel – Arithmetischer Ausdruck (8+(7*2))*(4-(2/3)) 1. Preorder (W, L, R) ð Prefix: 2. Inorder (L, W, R) ð Infix: (vgl. Normalfall) 3. Postorder (L, R, W) ð Postfix: (vgl. hp) * + 8 * 7 2 - 4 / 2 3 8 + 7 * 2 * 4 - 2 / 3 8 7 2 * + 4 2 3 / - * Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 4 18 K27 Datenstrukturen Teil 1 Folie 35 3.9 Aufwand bei geordneten binären Bäumen • Aufwand allgemein – Höhe des Baumes ist massgebend – Suchen • maximale Weglänge • Vergleich bei jedem Knoten – gewünschter Knoten gefunden – im linken oder rechten Teilbaum weitersuchen – Pro traversiertem Knoten typisch 2 Vergleiche erforderlich suchen entfernen einfügen O(log n) ...O(n) O(log n) ...O(n) O(log n) ...O(n) 4 19 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Nachfolger Vorgänger nein nein Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 sortierte Ausgabe ja K27 Datenstrukturen Teil 1 Folie 36 Teil 1 Seite 18 FHZ Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K27 Datenstrukturen Teil 1 3.9 Aufwand bei geordneten binären Bäumen • Für geordnete ausgeglichene binäre Bäume (AVL-Bäume) gilt: suchen entfernen einfügen O(log n) O(log n) O(log n) Nachfolger Vorgänger nein sortierte Ausgabe nein ja • Bemerkungen: – Hat man Pech, so ist ein binärer Baum zu einer Liste entartet • Bedeutet Mehraufwand – Die Algorithmen für AVL-Bäume sind komplex • Justierung des Baums nach jedem Entfernen und Einfügen • Eine weniger komplexe Alternative stellen sogenannte Skip-Listen dar – Aufwand von O(log n) ist gleichwertig wie ein Aufwand von O(ld n) 4 19 K27_Datenstrukturen_Teil1-P.ppt, V20 2004 © Diego Schmidlin Abteilung Informatik, Fach Programmieren 2004 © Diego Schmidlin V20 K27 Datenstrukturen Teil 1 Folie 37 Teil 1 Seite 19