Algorithmen & Datenstrukturen. 3. Suchen

Ähnliche Dokumente
Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Datenstrukturen & Algorithmen

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Untersuchen Sie, inwiefern sich die folgenden Funktionen für die Verwendung als Hashfunktion eignen. Begründen Sie Ihre Antwort.

Programmiertechnik II

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Bäume, Suchbäume und Hash-Tabellen

14. Rot-Schwarz-Bäume

Übung zur Vorlesung Algorithmische Geometrie

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Algorithmen und Datenstrukturen Balancierte Suchbäume

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Balancierte Bäume. Martin Wirsing. in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer. SS 06

Nachtrag zu binären Suchbäumen

Suchen in Listen und Hashtabellen

13. Binäre Suchbäume

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Copyright, Page 1 of 8 AVL-Baum

Suchbäume mit inneren Knoten verschiedener Knotengrade.

6-1 A. Schwill Grundlagen der Programmierung II SS 2005

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Informatik II, SS 2014

Informatik II, SS 2014

Bäume Jiri Spale, Algorithmen und Datenstrukturen - Bäume 1

B-Bäume, Hashtabellen, Cloning/Shadowing, Copy-on-Write

Datenstrukturen und Algorithmen

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Algorithmen und Datenstrukturen Suchbaum

Algorithmen & Datenstrukturen 1. Klausur

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / 2014 Vorlesung 11, Donnerstag, 16.

Die mittlere Zeit zum Auffinden eines Elements in einer Hash-Tabelle beträgt, unter realistischen Annahmen, O(1).

Suchen und Sortieren Sortieren. Heaps

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Algorithmen und Datenstrukturen

Kapitel 5: Dynamisches Programmieren Gliederung

Kap. 4.2: Binäre Suchbäume

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Sortierverfahren für Felder (Listen)

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

2 i. i=0. und beweisen Sie mittels eines geeigneten Verfahrens die Korrektheit der geschlossenen Form.

Übersicht. Rot-schwarz Bäume. Rot-schwarz Bäume. Beispiel. Eigenschaften. Datenstrukturen & Algorithmen. Rot-schwarz Bäume Eigenschaften Einfügen

! DBMS organisiert die Daten so, dass minimal viele Plattenzugriffe nötig sind.

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Kapitel : Andere dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2013/14. Prof. Dr. Sándor Fekete

Kapitel : Andere dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Programmiertechnik II

Kapiteltests zum Leitprogramm Binäre Suchbäume

Algorithmen und Datenstrukturen

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

DATENSTRUKTUREN UND ZAHLENSYSTEME

Algorithmen und Datenstrukturen

Übrigens: um den Algorithmus im Unterricht einzuführen, sind keine Formeln notwendig! Warum reicht die normale ASCII-Codierung nicht aus?

Übungen zu Programmierung I - Blatt 8

Algorithmen und Datenstrukturen 1

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Einführung in die Informatik I Kapitel II.3: Sortieren

Kapitel 8: Physischer Datenbankentwurf

Tutoraufgabe 1 (Vollständige Induktion): Tutoraufgabe 2 (Rotationen): Datenstrukturen und Algorithmen SS15 Übungsblatt 5 (Abgabe 3.6.

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

B-Bäume I. Algorithmen und Datenstrukturen 220 DATABASE SYSTEMS GROUP

11.1 Grundlagen - Denitionen

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Binäre Bäume Darstellung und Traversierung

Amortisierte Analysen

Tutoren Simon Andermatt Lukas Beck. Alexis Peter Thomas Ritter

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Kurs 1613 Einführung in die imperative Programmierung

Grundlagen der Programmierung 2. Bäume

Vorkurs Informatik WiSe 15/16

RWTH Aachen, Lehrstuhl für Informatik IX Kapitel 3: Suchen in Mengen - Datenstrukturen und Algorithmen - 51

368 4 Algorithmen und Datenstrukturen

Klausur Datenstrukturen und Algorithmen SoSe 2012

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Tutorium Algorithmen & Datenstrukturen

Programmiertechnik II

Faktorisierung ganzer Zahlen mittels Pollards ρ-methode (1975)

Tutoren Jan Ebbe Pat Mächler Valentino Rugolo Sascha Scherrer. Grundlagen der Programmierung (CS101) - Blatt 8 Theorie [4 Punkte] - Praxis [12 Punkte]

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 5, Donnerstag, 20.

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Kapitel 2. Zahlensysteme, Darstellung von Informationen

Lenstras Algorithmus für Faktorisierung

Datenstrukturen und Algorithmen

Informatik I 4. Kapitel Suchen in sequentiellen Listen

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Algorithmentheorie Randomisierung. Robert Elsässer

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Dr. Thomas Neumann

Tutoraufgabe 1 (2 3 4 Bäume):

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

Transkript:

Algorithmen & Datenstrukturen 3. Suchen 1

Exponentielle Suche Gesucht wird ein Element mit Schlüssel k. Die exponentielle Suche eignet sich zum Suchen in nach den Schlüsselwerten sortierten Feldern, deren Länge nicht bekannt ist. Bestimme in exponentiell wachsenden Schritten einen Bereich, in dem der Schlüssel liegen muss (erster Index ist 1): i = 1; while (k > a[i].key) i = 2*i; Danach gilt: a[i/2].key < k a[i].key Dieser Bereich wird mittels binärer Suche durchsucht. 2

Exponentielle Suche: Beispiel Wir suchen den Schlüssel k = 42 im folgenden Feld: a: 1 2 3 4 7 9 11 12 13 18 27 28 39 42 62 98... (1) bestimme den Bereich, in dem k liegen muss: a: 1 2 3 4 7 9 11 12 13 18 27 28 39 42 62 98... i = 1 2 4 8 16 (2) binäre Suche im Bereich a[i/2+1]... a[i]: mid = (9 + 16) / 2 = 12 mid = (13 + 16) / 2 = 14...... 13 18 27 28 39 42 62 98... 13 18 27 28 39 42 62 98... 3

Exponentielle Suche: Laufzeit Voraussetzung: Werte sind paarweise verschieden (dies ist z.b. dann gegeben, wenn Schlüsselwerte gesucht werden, Telefonnummer, Matrikelnummer, Personalnummer, usw.) Schlüssel wachsen mindestens so stark wie die Indices die Bereichsbestimmung erfolgt in log 2 (k) Schritten der zu durchsuchende Bereich hat höchstens k Zahlen und kann in Zeit log 2 (k) durchsucht werden insgesamt ergibt sich also eine Laufzeit von Θ(log(k)) Falls die Folge auch gleiche Werte enthalten darf, ist keine Laufzeitabschätzung möglich. 4

Lineare Suche und binäre Suche In Kapitel 1.2 haben wir ausführlich die lineare (Elemente nacheinander lesen) und die binäre (rekursive, immer mit dem mittleren Element vergleichen) Suche besprochen und die Komplexitäten im besten, mittleren und schlechtesten Fall berechnet. Es ergab sich linear: O best = O(1), O avg = O(n), O worst = O(n) binäre: O best = O(1), O avg = O(log(n)), O worst = O(log(n)) 5

Interpolations-Suche Idee: Schätze die Position des Elements mit Schlüssel k. Beispiel: Im Telefonbuch steht der Name Zimmermann weit hinten, wohingegen Brockmann eher am Anfang steht. Sei l linke Grenze, r rechte Grenze des Suchbereichs: bei der binären Suche wurde der Index des nächsten zu inspizierenden Elements bestimmt als m = l + 1 2 (r l). bei der Interpolationssuche inspiziere als nächstes das Element auf Position m = l+ k a[l].key (r l). a[r].key a[l].key 6

Interpolations-Suche: Beispiel (a) gesucht: k = 42 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a: 1 3 3 4 7 9 12 12 13 18 27 28 39 42 62 98 l = 0 r = 15 m = 0 + (42 1) / (98 1) * (15 0) = 6 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a: 1 3 3 4 7 9 12 12 13 18 27 28 39 42 62 98 l = 7 r = 15 m = 7 + (42 12) / (98 12) * (15 7) = 9 7

Interpolations-Suche: Beispiel (b) gesucht: k = 42 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a: 1 3 3 4 7 9 12 12 13 18 27 28 39 42 62 98 l = 10 r = 15 m = 10 + (42 27) / (98 27) * (15 10) = 11 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a: 1 3 3 4 7 9 12 12 13 18 27 28 39 42 62 98 l = 12 r = 15 m = 12 + (42 39) / (98 39) * (15 12) = 12 8

Interpolations-Suche: Beispiel (c) gesucht: k = 42 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a: 1 3 3 4 7 9 12 12 13 18 27 28 39 42 62 98 l = 13 r = 15 m = 13 + (42 42) / (98 42) * (15 13) = 13 Im worst-case hat das Verfahren eine lineare Laufzeit, also Θ(n) bei n Schlüsselwerten. Beispiel: k = 10 und F = 1,2,3,4,5,6,7,8,9,10,1000 9

Interpolations-Suche: Laufzeit Im Mittel werden log(log(n)) + 1 Schlüsselvergleiche ausgeführt [1], aber dieser Vorteil geht durch die auszuführenden arithmetischen Operationen oft verloren. Im best-case wird jedes Element sofort gefunden, also Θ(1) bei n Schlüsselwerten. Beispiel mit 9 gleichverteilten Elementen F = 10,12,14,16,18,20,22,24,26 m = 0+ k a[0].key a[8].key a[0].key (8 0) = k 10 26 10 8 = k 10 2 [1] A.C. Yao and F.F. Yao: The complexity of searching an ordered random table. Proceedings of the Symposium on Foundations of Computer Science, 1976 10

Hash-Verfahren (1) Schlüsselsuche durch Berechnung der Array-Indices! Idee: bei einer Menge von Werten K {0,1,...,m 1} = U verwende ein Array A der Länge m mit Indices von 0 bis m 1 und speichere die Schlüssel wie folgt: A[k] = { x falls x.key K und x.key = k nil sonst suchen, einfügen und löschen in Θ(1) Schritten Problem: Wertebereich kann sehr groß sein 8-stellige Namen mehr als 208.000.000.000 Werte 11

Hash-Verfahren (2) Lösung: verwende eine Hash-Funktion h, um den Wertebereich U, speziell die Menge der Schlüsselwerte K, auf die Zahlen 0,...,l 1 abzubilden, also h : U {0,...,l 1}. K U Hash-Funktion i.allg. nicht injektiv: verschiedene Schlüssel werden auf dieselbe Hash-Adresse abgebildet Kollision Hash-Funktion wird zum Platzieren und Suchen verwendet, muss einfach/effizient zu berechnen sein 12

Hash-Verfahren (3) Schlüssel, die nicht als Zahlen interpretiert werden können, müssen vorher geeignet umgerechnet werden. Beispiel: 5 Zeichenketten der Länge 3 Die ASCII-Darstellung wird als Binärzahl interpretiert. Interpretiere die Binärzahlen als Ziffern einer Zahl zur Basis 256, z.b. i2 = 0 105 50 = 105 256 + 50 = 26930 Input k 1 k 2 k 3 k h(k) = k mod 11 h(k) = k mod 13 i 0 0 105 105 6 1 i2 0 105 50 26930 2 7 ii 0 105 105 26985 2 10 iii 105 105 105 6908265 1 0 i_2 105 95 50 6905650 4 11 13

Hash-Verfahren (4) Hash-Verfahren muss zwei Forderungen genügen: 1. es sollen möglichst wenige Kollisionen auftreten 2. Adress-Kollisionen müssen effizient aufgelöst werden Wahl der Hash-Funktion: soll die zu speichernden Datensätze möglichst gleichmäßig auf den Speicherbereich verteilen, um Adress-Kollisionen zu vermeiden Häufungen in der Schlüsselverteilung sollen sich nicht auf die Verteilung der Adressen auswirken es gilt: wenn eine Hash-Funktion πn/2 Schlüssel auf eine Tabelle der Größe n abbildet, dann gibt es meist eine Kollision (für n = 365 ist πn/2 23, 23 Personen auf deren Geburtstage abgebildet) 14

Hash-Funktion: Division-Rest-Methode Methode: Der Schlüssel wird ganzzahlig durch die Länge der Hash- Tabelle dividiert. Der Rest wird als Index verwendet: h(k) = k mod m zu beachten: m soll keinen kleinen Teiler haben! m soll keine Potenz der Basis des Zahlensystems sein! Beispiel: für m = 2 r hängt der Hash-Wert nur von den letzten r Bits ab wähle m als Primzahl, die nicht nah an einer Potenz der Basis des Zahlensystems liegt. Beispiel: m = 761, aber nicht: m = 509 (nah an 2 9 ) oder m = 997 (nah an 10 3 ) 15

Hash-Funktion: Multiplikative Methode Sei m = 2 r eine Zweierpotenz, d.h. es können die Werte 0...,2 r 1 angenommen werden. Bei einer Wortgröße w wähle eine Zahl a so, dass 2 w 1 < a < 2 w ist, und wähle für h(k) Anmerkungen: h(k) = (a k mod 2 w ) >> (w r) Wähle a nicht zu nah an 2 w bzw. 2 w 1 Modulo-Operation und Rechts-Shift ist schnell gute Ergebnisse für a 5 1 2 2 w (goldener Schnitt) Beispiel: Für w = 8, r = 3, a = 191 und k = 23 erhalten wir 1 0 1 1 1 1 1 1 * 0 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 191 23 4393 16

Hash-Verfahren: Verkettung der Überläufer Probleme treten auf beim Einfügen, wenn die berechnete Hash-Adresse nicht leer ist bei der Suche, wenn der berechnete Platz ein anderes Element enthält T: i h(61) = h(32) = h(7) = i 61 32 7 % Kollisionsauflösung: Die Überläufer können in einer linearen Liste verkettet werden, die an den Hash-Tabelleneintrag angehängt wird. 17

Verkettung der Überläufer: Bewertung (1) Die durchschnittliche Anzahl der Einträge in h(k) ist n/m, wenn n Einträge durch die Hash-Funktion gleichmäßig auf m Listen verteilt werden. Belegungsfaktor: α = n m Mittlere Laufzeit bei erfolgreicher Suche: beim Einfügen des j-ten Schlüssels ist die durchschnittliche Listenlänge j 1 m bei einer späteren Suche nach dem j-ten Schlüssel betrachten wir also im Durchschnitt 1+ j 1 m Einträge, wenn stets am Listenende eingefügt wird und keine Elemente gelöscht wurden C = 1 n n j=1 ( 1+ j 1 m ) = 1+ n 1 2m 1+ n 2m 18

Verkettung der Überläufer: Bewertung (2) in der Regel gilt n O(m) (die Größe der Hash-Tabelle ist ungefähr so groß wie die Anzahl der Datensätze) α = n m = O(m) m O(1) zum Vergleich: binäre Suche hat Laufzeit Θ(log(n)) plus Aufwand Θ(n log(n)) zum Sortieren der Datensätze Problem: verkettete Listen sind umständlich zu Programmieren und dynamische Speicheranforderung ist teuer. Lösung: speichere alle Datensätze innerhalb eines Arrays 19

Offene Hash-Verfahren (1) Idee: Speichere die Überläufer in der Hash-Tabelle, nicht in zusätzlichen Listen ist die Hash-Adresse h(k) belegt, so wird systematisch eine Ausweichposition gesucht die Folge der zu betrachtenden Speicherplätze für einen Schlüssel nennt man Sondierungsfolge die Hash-Funktion hängt vom Schlüssel und von der Anzahl durchgeführter Platzierungsversuche ab: h : U {0,...,m 1} {0,...,m 1} die Sondierungsfolge muss eine Permutation der Zahlen 0,...,m 1 sein, damit alle Einträge der Hash-Tabelle genutzt werden können 20

Offene Hash-Verfahren (2) Anmerkungen: beim Einfügen und Suchen wird dieselbe Sondierungsfolge durchlaufen beim Löschen wird der Datensatz nicht gelöscht, sondern nur als gelöscht markiert (der Wert wird ggf. bei späterem Einfügen überschrieben) je voller die Tabelle wird, umso schwieriger wird das Einfügen neuer Schlüssel 21

Lineares Sondieren Zu einer gegebenen Hash-Funktion h (k) sei h(k,i) = (h (k)+i) mod m. i ist die Anzahl der Kollisionen für einen Key. Beispiel: betrachte das Einfügen der Schlüssel 12,55,5,15,2,47 für m = 7 mit h (k) = k mod 7 und h(k,i) = (k mod 7+i) mod 7 = (k +i) mod 7 0 1 2 3 4 5 6 0 1 2 3 4 5 6 1. 12 12 mod 7 = 5 4. 5 15 12 55 15 mod 7 = 1 2. 12 55 55 mod 7 = 6 5. 5 15 2 12 55 2 mod 7 = 2 3. 5 12 55 5 mod 7 = 5 6. 5 15 2 47 12 55 47 mod 7 = 5 22

Quadratisches Sondieren (1) Zu einer gegebenen Hash-Funktion h (k) sei h(k,i) = (h (k)+( 1) i i/2 2 ) mod m. bedeutet aufrunden, z.b. 0.5 = 1 Ohne Beweis: Wenn m eine Primzahl der Form 4i+3 ist, werden alle möglichen Schlüssel erreicht. Die Reihenfolge der Durchläufe ist h(k,0) = h (k) mod m h(k,1) = (h (k)+( 1) 1 1/2 2 ) mod m = (h (k) 1) mod m h(k,2) = (h (k)+( 1) 2 2/2 2 ) mod m = (h (k)+1) mod m h(k,3) = (h (k)+( 1) 3 3/2 2 ) mod m = (h (k) 4) mod m 23

Quadratisches Sondieren (2) In der Literatur finden sie unterschiedliche Vorzeichen bei den Sondierungsfunktionen Beispiel: betrachte das Einfügen der Schlüssel 12,55,5,15,2,47 für m = 7 mit h(k,i) = (k +( 1) i i/2 2 ) mod 7 0 1 2 3 4 5 6 0 1 2 3 4 5 6 1. 12 12 mod 7 = 5 4. 15 5 12 55 15 mod 7 = 1 2. 12 55 55 mod 7 = 6 5. 15 2 5 12 55 2 mod 7 = 2 3. 5 12 55 5 mod 7 = 5 6. 15 2 47 5 12 55 47 mod 7 = 5 47 5 4 6 1 2 (5 9) mod 7 = 3 24

Double Hashing (1) Zu zwei gegebenen Hash-Funktionen h 1 (k) und h 2 (k) sei h(k,i) = (h 1 (k)+i h 2 (k)) mod m. Für die Form h(k,i) = (k+i (1+k mod m 2 )) mod m 1 und m 1 2 = m 2 werden alle möglichen Schlüsselwerte erreicht. Beispiel: betrachte die Hash-Funktionen m = 7, h 1 (k) = k mod 7 und h 2 = 1+k mod 5: h(k,i) = (k +i (1+k mod 5)) mod 7. Die Reihenfolge der Durchläufe ist h(k,0) = (k +0 (1+k mod 5)) mod 7 h(k,1) = (k +1 (1+k mod 5)) mod 7 h(k,2) = (k +2 (1+k mod 5)) mod 7 25

Double Hashing (2) Beispiel: betrachte das Einfügen der Schlüssel 12,55,5,15,2,47 und h(k,i) = (k +i (1+k mod 5)) mod 7. 0 1 2 3 4 5 6 0 1 2 3 4 5 6 1. 12 12 mod 7 = 5 4. 5 15 12 55 15 mod 7 = 1 2. 12 55 55 mod 7 = 6 5. 5 15 2 12 55 2 mod 7 = 2 3. 5 12 55 5 mod 7 = 5 6. 5 15 2 47 12 55 47 mod 7 = 5 5 5 6 0 47 5 1 4 Alle Verfahren lassen sich noch leicht beschleunigen, wenn häufiger gesucht als eingefügt wird. 26

Suchbäume (1) Eine Alternative für Suchprobleme sind Suchbäume (siehe Kapitel 1) Voraussetzung für die schnelle Suche: der Suchbaum muss ausgeglichen sein, d.h. die Blätter unterscheiden sich in ihrer Stufe höchstens um 1. Die Anzahl der Suchschritte in einem ausgeglichenen Suchbaum ist proportional zum Logarithmus der Datenzahl. Die Anzahl der Knoten in einem binären Baum der Höhe T (Wurzel hat Höhe 0) ist maximal k = T 1 i=0 2 i = 2 T 1 27

Suchbäume (2) Umgekehrt braucht ein binärer Baum, wenn er k Knoten aufnehmen soll, eine Höhe von mindestens T = log 2 (k+1) (aufrunden) Beispiel: T = 20 k max = 2 (20) 1 =1048575 Knoten Jeder Knoten wird nach maximal 20 Schritten erreicht. Sogenannte optimale Suchbäume berücksichtigen beim Aufbau eine Wahrscheinlichkeit, mit der ein Schlüssel gesucht wird, und werden mittels dynamischer Programmierung aufgebaut. 28

Operationen für Bäume (1) Suchen eines Elements Das Suchen eines Elements setzt eine Ordnung voraus. Ist der Key des Elements gleich dem Key des Knotens, dann ist das Element gefunden. Ist der Key des Elements kleiner (größer) als der Key des Knotens, suche im linken (rechten) Teilbaum. Ist der (Teil-)Baum leer, ist das Element nicht vorhanden. 29

Operationen für Bäume (2) Einfügen eines neuen Knotens in einen Suchbaum Ist der Baum leer, dann wird das neue Element die Wurzel. Falls sortiertes Einfügen, führe rekursiv aus: Ist der Key des Elements kleiner (größer) als der Key des Knotens, füge in den linken (rechten) Teilbaum ein. Erzeuge neuen Knoten an dem Blatt, bei dem einfügt wird, schreibe die Daten in den Knoten und setzte rechten bzw. linken Zeiger von der Einfügestelle auf den neuen Knoten. 30

Operationen für Bäume (3) Der Aufbau eines Baums hängt von der Reihenfolge des Einfügens ab. Reihenfolge 20 10 30 15 35 25 20 Einzufügender Knoten 05 10 30 05 15 25 35 35 Reihenfolge 35 30 25 20 15 10 30 25 Einzufügender Knoten 05 20 15 10 05 31

Operationen für Bäume (4) Löschen eines Elements Hat das Element nur einen oder keinen Teilbaum, ersetzte das Element durch Teilbaum bzw. NULL. Zu löschender Knoten: 15 20 20 09 53 09 53 05 15 50 05 11 50 11 32

Operationen für Bäume (5) Hat das zu löschende Element zwei Teilbäume, dann ersetze es durch das größte (kleinste) Element seines linken (rechten) Teilbaums. Dieses Element hat keinen rechten (linken) Teilbaum und wird ersetzt wie beschrieben auf der letzten Folie. Zu löschender Knoten: 20 20 15 09 53 09 53 05 15 50 05 11 50 11 33

Operationen für Bäume (6) Ausgleichen eines Baums Notwendig für eine schnelle Suche: der Baum muss ausgeglichen sein. Für die Anzahl der Knoten n in einem Baum der Höhe T gilt log 2 (n+1) T n Bei einem vollständig ausgeglichenen Baum liegen alle Blätter auf einer Ebene bzw. die vorletzte Ebene ist voll belegt. 34

Operationen für Bäume (7) Ausgleichen eines Baums Rekursiver Algorithmus zum Ausgleichen eines Baums: Finde das in der Ordnung mittlere Element eines Baums Speichere das Element als Wurzel Verfahre auf gleiche Art mit den Teilbäumen. Sehr aufwendiges Verfahren, dass nach jedem Löschen bzw. Hinzufügen eines Knotens wiederholt werden müsste. Schwächere Definition von Ausgeglichenheit nach Adelson-Vekskii und Landis (1962) AVL-Bäume. 35

AVL-Bäume (1) In einem AVL-Baum unterscheiden sich die Höhen d des linken und des rechten Teilbaums für jeden Knoten höchstens um 1. Es ist günstig, die Differenz der Höhen der Teilbäume bei jedem Knoten zu speichern. d=1 20 1 09 1 53-1 05 1 15-1 50 0 79 0 01 1 08 0 11 0 52 0 07 36

AVL-Bäume (2) Minimale Anzahl n(t) von Knoten: Ein Minimaler AVL-Baum der Höhe T setzt sich aus einer Wurzel und einem Teilbaum der Höhe T 1 sowie einem Teilbaum der Höhe T 2 zusammen minimal Knotenzahl: n(t) = 1+n(T 1)+n(T 2) = fib(t +1) 1 1.61803 T+1 t 1 2 3 4 5 6 7 8 n(t) 1 2 4 7 12 20 33 54 2 t 1 1 3 7 15 31 63 127 255 Die Höhe eines AVL-Baumes mit n Knoten ist O(log(n)) 37

Rebalancieren von AVL-Bäumen (1) Ein AVL-Baum hat die Höhendifferenz-Werte von d = 1,0,1. Einfügen und Löschen von Knoten geschieht wie in Suchbäumen. Durch Einfügen oder Löschen können Knoten mit d = 2 oder d = 2 entstehen. Durch Rotation kann in diesen Fällen die AVL-Bedingung wieder hergestellt werden. Beispiel: LL-Rotation Ein Knoten wird im linken Teilbaum vom linken Teilbaum von K1 eingefügt, wobei K1 der Knoten ist, bei dem anschließend d = 2 auftritt. 38

Rebalancieren von AVL-Bäumen (2) K1 d=2 d=0 K2 d=1 K2 K1 d=0 A B C A B C Umhängen des rechten Teilbaums von K2 nach K1 und K2 als neuen Wurzelknoten des Teilbaums setzen. Setze die linke Referenz von K1 auf B. Setze die rechte Referenz von K2 auf K1. 39

Rebalancieren von AVL-Bäumen (3) d=1/2 20 0/1 09 1 53 0/1 05 1 15 0 50 0/1 04 0 08 0 11 0 09 0 01 1 05 0 20 1 04 0 08 1 15 1 53 0 01 0 11 0 50 40

Rebalancieren von AVL-Bäumen (4) RR-Rotation Wird ein Knoten im rechten Teilbaum vom rechten Teilbaum von K1 eingefügt, wobei K1 der Knoten ist, bei dem anschließend d = 2 auftritt, so wird eine einfache Rotation analog zur LL- Rotation durchgeführt. LR-(RL) Rotation Wird ein Knoten im rechten (linken) Teilbaum vom linken (rechten) Teilbaum von K1 eingefügt, wobei K1 der Knoten ist, bei dem anschließend d = 2 auftritt, so muss eine Doppelrotation durchgeführt werden. 41

Rebalancieren von AVL-Bäumen (5) d=-2 K1 d=0 K2 K3 d=0 K1 d=-1 K3 d=1 K2 A B C D A B C D Umhängen des rechten Teilbaums von K2 nach K3 Umhängen des linken Teilbaums von K2 nach K1 Referenzen von K1, K2, K3 neu setzen 42

Rebalancieren von AVL-Bäumen (6) Aufwand des Rebalancierens: * Werte der Höhendifferenz aktualisieren: O(log(n)) * Umhängen der Zeiger: O(1) Der Gesamtaufwand zum Einfügen eines Knoten beträgt wie beim vollständig ausgeglichenen Suchbaum O(log(n)). Das Löschen eines Knoten geschieht analog zum Einfügen. Dementsprechend beträgt der Gesamtaufwand zum Löschen eines Knoten ebenfalls nur O(log(n)). Nettes Applet: http://fbim.fh-regensburg.de/~saj39122/bruhi/ 43

Weitere Bäume (1) 2-3 und 2-3-4 Bäume Suchbäume, deren Knoten aus 2-3-4-Knoten mit 1,2 oder 3 Schlüsseln sind. Der Grad des Baums ist 4. Alle Blätter liegen auf einer Ebene. Vorteil: Die Bäume sind immer ausgeglichen und ein Suchen ist sehr schnell möglich. Nachteil: Die Bäume müssen umgebaut werden, soll ein weiteres Element in einen vollen Baum eingefügt werden. 44

Weitere Bäume (2) Beispiel: Spalte 4-Knoten mit 3 Schlüsseln bei weiterem Schlüssel in der Mitte in zwei 2-Knoten auf und übergeben einen Schlüssel an den Vorgänger. D einfügen E J N A B C F G I K L M O P R J C E N A B D F G I K L M O P R 45

Weitere Bäume (3) B-Bäume: Sie stammen von Bayer und McCreight und sind eine Erweiterung der 2-3 bzw. 2-3-4 Bäume. B + - und B -Bäume der Ordnung m: Motivation für diese Bäume waren Datenmengen, die nicht den Speicher passen. Sie bestehen aus inneren Knoten, in denen jeweils mindestens [m/2] und höchstens [m] Schlüssel - keine Datensätze - gespeichert sind, und aus Blattknoten, die jeweils die Datensätze, auch Blöcke genannt, enthalten. Die Wurzel darf auch weniger als [m/2] Schlüssel enthalten. 46

Weitere Bäume (4) Jeder innere Knoten mit n Schlüsseln ist ein (n + 1)-Knoten und enthält (n + 1) Verweise auf weiter führende Teilbäume. Die Blätter liegen alle auf einer Ebene und enthalten die Datensätze und ggf. Verweise auf die benachbarten Blätter (lineare Liste). B + - und B -Bäume werden manchmal für die gleiche Struktur verwendet, ursprünglich unterscheiden Sie sich aber im Verhalten beim Einfügen und Löschen neuer Knoten. Es existieren viele weitere Varianten von B-Bäumen. Anwendung von B-Bäumen: XFS oder ReiserFS von Linux, Verwaltung von Indizes in Datenbanken. 47