Alexander Nutz. 3. Dezember 2007

Ähnliche Dokumente
Abgabe: (vor der Vorlesung) Aufgabe 7.1 (P) Binomial Heap

Gliederung. Algorithmen und Datenstrukturen I. Binäre Bäume: ADT Heap. inäre Bäume: ADT Heap. Abstrakte Datentypen IV. D. Rösner

Haskell Seminar Abstrakte Datentypen. Nils Bardenhagen ms2725

Programmieren in Haskell Abstrakte Datentypen

Programmieren in Haskell. Abstrakte Datentypen

Informatik II Prüfungsvorbereitungskurs

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

Informatik II, SS 2014

14. Rot-Schwarz-Bäume

Vorrangswarteschlangen:Operationen

11. Elementare Datenstrukturen

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

Algorithmen und Datenstrukturen

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 13 (Queues, Binary Search)

Übung Algorithmen und Datenstrukturen

ALP I Induktion und Rekursion

Übung: Algorithmen und Datenstrukturen SS 2007

Vorlesung Datenstrukturen

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 9 -

Algorithmen und Datenstrukturen

6. Sich selbst organisierende Datenstrukturen

16. Dynamische Datenstrukturen

Informatik II, SS 2018

Abstrakte Datentypen I

Einführung in die Informatik 2 9. Übung

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

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

Programmieren in Haskell Programmiermethodik

Informatik II, SS 2014

5. Vorrangwarteschlangen - Priority Queues

Algorithmen und Datenstrukturen

Elementare Datenstrukturen

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Graphdurchmusterung, Breiten- und Tiefensuche

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Informatik II, SS 2018

Informatik II, SS 2016

Geheimnisprinzip: (information hiding principle, Parnas 1972)

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

Tutoraufgabe 1 (Implementierung eines ADTs):

SS10 Algorithmen und Datenstrukturen 2. Kapitel Fundamentale Datentypen und Datenstrukturen

Abstract Data Structures

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -

Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen. Vorlesung 8

Informatik II, SS 2016

12. Dynamische Datenstrukturen

Informatik II Bäume zum effizienten Information Retrieval

Einführung in die Informatik 2 8. Übung

Einfügen immer nur am Kopf der Liste Löschen auch nur an einem Ende (2 Möglichkeiten!)

Abstract Data Structures

Programmieren in Haskell. Stefan Janssen. Strukturelle Rekursion. Universität Bielefeld AG Praktische Informatik. 10.

Binärbäume und Pfade

Mergeable Heaps. C. Komusiewicz 7.1 Fibonacci-Heaps: Überblick 117

Programmieren in Haskell

Balancierte Bäume. Minimale Knotenanzahl von AVL-Bäumen. AVL-Bäume. Definition für "balanciert":

EINI LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

5. Januar Universität Bielefeld AG Praktische Informatik. Programmieren in Haskell. Stefan Janssen. Abstrakte Datentypen.

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Nachtrag: Vergleich der Implementierungen von Stack

Grundlagen der Algorithmen und Datenstrukturen Kapitel 6

13. Dynamische Datenstrukturen

Übung 3 Musterlösung

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Anwendungsbeispiel MinHeap

Beweis des Pumping Lemmas

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

- Welche konkreten Invarianten müssen gelten? Berücksichtigen: Invarianten aus Modell und Implem.

WS 2011/2012. Georg Sauthoff Januar 2012

Prüfung Informatik D-MATH/D-PHYS :00 17:00

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Invarianzeigenschaft (für binären Suchbaum)

Stack. Queue. pop() liefert zuletzt auf den Stack gelegtes Element und löscht es push( X ) legt ein Element X auf den Stack

Informatik II, SS 2016

Übung Algorithmen und Datenstrukturen

Vorlesung Datenstrukturen

Informatik-Seminar Thema 6: Bäume

Gliederung. Algorithmen und Datenstrukturen I. öschen in Rot-Schwarz-Bäumen. Löschen in Rot-Schwarz-Bäumen

Fragenkatalog 1. Kurseinheit

Algorithmen I. Sebastian Schlag Institut für Theoretische Informatik Web:

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss.

Übung zur Vorlesung Algorithmische Geometrie

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

Algorithmen und Datenstrukturen. Bäume. M. Herpers, Y. Jung, P. Klingebiel

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17

a) Fügen Sie die Zahlen 39, 38, 37 und 36 in folgenden (2, 3)-Baum ein:

3. Binäre Suchbäume. 3.1 Natürliche binäre Suchbäume. EADS 3.1 Natürliche binäre Suchbäume 78/598 ľernst W. Mayr

2.2.1 Algebraische Spezifikation (Fortsetzung)

Algorithmen und Datenstrukturen II

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

Lösungsvorschlag 1. Vorlesung Algorithmentechnik im WS 09/10

Überblick. Rekursive Methoden. Backtracking. Memorization. Einfache rekursive Datenstrukturen. Aufzählen, Untermengen, Permutationen, Bitmengen

Grundlagen der Algorithmen und Datenstrukturen Kapitel 7

Transkript:

3. Dezember 2007 1 / 21

Aufgabe: die zeit- und platzeziente Implementierung von abstrakten Datentypen, z.b. eines Wörterbuches oder einer Zahlenmenge, für Programme bekannte : Listen,, Heaps,, Stacks,... bisher in der Regel imperativ realisiert Zeigeroperationen werden nicht direkt unterstützt Übernahme imperativer Algorithmen i.d.r. inezient 2 / 21

Persistenz keine zerstörerischen Updates (Wertzuweisungen) gleiche Daten werden nicht kopiert, sondern mehrfach verwendet (Sharing) xs d b g a c f h 3 / 21

Persistenz keine zerstörerischen Updates (Wertzuweisungen) gleiche Daten werden nicht kopiert, sondern mehrfach verwendet (Sharing) xs ys d d b g g a c f f h e 4 / 21

Binärsuchbaum in Haskell data Tree e = E T ( Tree e ) e ( Tree e ) empty :: Tree e empty = E member :: Ord e = > e -> Tree e -> Bool member x E = False member x ( T a y b ) x < y = member x a x == y = True x > y = member x b insert :: Ord e = > e -> Tree e -> Tree e insert x E = ( T E x E ) insert x ( T a y b ) x < y = T ( insert x a ) y b x == y = T a y b x > y = T a y ( insert x b ) Nachteil: auf geordneten Daten inezient (Tiefe in O(n)) 5 / 21

Binärsuchbäume mit zusätzlichen Eigenschaften: Jeder Knoten ist rot oder schwarz. Leere Knoten und die Wurzel sind schwarz. zwei Balance-Invarianten: Invariante 1: Die Kind-Knoten eines roten Knotens sind schwarz. Invariante 2: Jeder Pfad von der Wurzel zu einem Blatt enthält die gleiche Anzahl schwarzer Knoten. Diese Anzahl wird durch die Schwarzhöhe eines Knotens v, Sh(v) beschrieben. 6 / 21

Tiefe von n (1) Satz: Die maximale Höhe eines Baumes mit Knotenzahl n beträgt 2 log(n + 1). Denitionen: Sei h(v) die Höhe des Teilbaums mit der Wurzel v, sei m(v) die Anzahl seiner innerer Knoten, sei Sh(v) seine Schwarzhöhe. Lemma: Es gilt: m(v) 2 Sh(v) 1 (Induktionsvorraussetzung) Induktion über h(v): Induktionsanfang: h(v) = 0 Sh(v) = 0 Es gilt: m 2 Sh(v) 1 = 2 0 1 = 0 7 / 21

Tiefe von n (2) Induktionsschritt: Sei v ein Knoten, v, v seine Kindknoten. h(v) = k h(v ) = h(v ) = k 1 Sh(v ) = Sh(v) 1 oder Sh(v ) = Sh(v), analog für v ( ) verwende Induktionsvorraussetzung: m(v ) 2 Sh(v ) 1 mit ( ) folgt: m(v) = m(v ) + m(v ) + 1 (2 Sh(v) 1 1) + (2 Sh(v) 1 1) + 1 = 2 Sh(v) 1 fertig 8 / 21

Tiefe von n (3) Beweis des Satzes: (Die maximale Höhe eines Baumes mit Knotenzahl n beträgt 2 log(n + 1).) Da mindestens die Hälfte der Knoten auf jedem Pfad von der Wurzel w zu einem Blatt schwarz sind (Invariante 1), gilt: Sh(w) h(w) 2 wir benutzen das Lemma: n 2 h(w) 2 1 log 2 (n + 1) h(w) 2 2log 2 (n + 1) h(w) h(w) 2log 2 (n + 1) 9 / 21

Implementierung (1) Typdenitionen, member-funktion data Color = R B data Tree e = E T Color ( Tree e ) e ( Tree e ) empty :: Tree e empty = E member :: Ord e = > e -> Tree e -> Bool member x E = False member x ( T _ a y b ) x < y = member x a x == y = True x > y = member x b 10 / 21

Implementierung (2) insert-funktion insert :: Ord e = > e -> Tree e -> Tree e insert x s = makeblack ( ins s ) where ins E = T R E x E ins ( T color a y b ) x < y = balance color ( ins a ) y b x == y = T color a y b x > y = balance color a y ( ins b ) makeblack ( T _ a y b ) = T B a y b balance B ( T R ( T R a x b ) y c ) z d = T R ( T B a x b ) y ( T B c z d ) balance B ( T R a x ( T R b y c )) z d = T R ( T B a x b ) y ( T B c z d ) balance B a x ( T R ( T R b y c ) z d ) = T R ( T B a x b ) y ( T B c z d ) balance B a x ( T R b y ( T R c z d )) = T R ( T B a x b ) y ( T B c z d ) balance color a x b = T color a x b 11 / 21

Analyse (1) Vier Probleme, eine Lösung z x x d a y a y y b z b c x z c d z x a b c d y d a z x c y d a b b c 12 / 21

Analyse (2) z y x d x z a y a b c d b c balance B (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d) 13 / 21

eziente Baum-Datenstruktur (alle Operationen in O(log(n)) sehr elegante Implementierung möglich noch weitere Verbesserungsmöglichkeiten bei der Ezienz (s.h. Übung) 14 / 21

(Schlangen, FIFO-) arbeiten nach dem First-In-First-Out-Prinzip imperativ: mit Zeigern einfach zu implementieren, alle Operationen in O(1) drei Operationen: head: auslesen des ersten Elements head :: Queue a -> a tail: entfernen des ersten Elements, zurückliefern der restlichen Queue tail :: Queue a -> Queue a snoc: einreihen eines neuen Elements in eine Queue (cons von rechts) snoc :: a-> Queue a -> Queue a 15 / 21

Naiver Algorithmus data Queue a = Q [ a ] head ( Q ( x : xs )) = x tail ( Q ( x : xs )) = xs snoc y ( Q []) = Q ( y :[]) snoc y ( Q xs ) = Q ( xs ++ [ y ]) Problem: snoc in O(n). 16 / 21

r Algorithmus - Idee Implementierung durch zwei Listen fs (Front) und rs (Rear) rs wird invertiert Zugri auf letztes Element in O(1) fs wird durch die tail-operation leer mache rs zu fs, ersetze rs durch die leere Liste Invariante: Wenn fs leer ist, muss die Queue leer sein. rs... (r1: (r2:... rn:[])...) fs... (f1: (f2:... fn:[])...) 17 / 21

r Algorithmus - Code import Prelude hiding ( head, tail ) data Queue a = Q [ a ] [ a ] check [] rs = Q ( reverse rs ) [] check fs rs = Q fs rs isempty ( Q fs rs ) = null fs snoc ( Q fs rs ) x = check fs ( x : rs ) head ( Q [] _ ) = error " empty Queue " head ( Q ( x : fs ) rs ) = x tail ( Q [] _ ) = error " empty Queue " tail ( Q ( x : fs ) rs ) = check fs rs 18 / 21

Amortisierte Kostenanalyse mittels Potentialmethode Deniere die Potentialfunktion Φ(rs) = rs als die aktuelle Länge der hinteren Liste. head: immer Kosten von 1 snoc: benötigt selbst Kosten von 1, erhöht das Potential um 1 amortisierte Kosten von 2 tail : falls fs nicht leer wird: Kosten 1 falls fs leer wird: Kosten reverse(rs) + 1 Φ(rs) = rs + 1 rs = 1 19 / 21

ezienter r Algorithmus amortisiert gleiche Kosten wie bei imperativem Algorithmus Will man Persistenz nutzen (mehrmals auf dieselbe Version einer Queue tail anwenden), liegen die Kosten für tail dennoch in O(n). 20 / 21

Gesamtzusammenfassung Persistenz ist immer gegeben keine Zeigeroperationen oft übersichtlichere Algorithmen, als in imperativen Sprachen amortisierte Analyse hilfreich, berücksichtigt aber erstmal keine Persistenz, kann aber angepasst werden (nicht Teil dieses Vortrags) neue Sichtweisen sind notwendig, erweisen sich aber oft als fruchtbar weiterführende Literatur: Chris Okasaki, Purely Functional Data Structures 21 / 21