Vortrag: Bäume in Haskell Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Bäume in Haskell Zusammenfassung & Ausblick Vortrag Christoph Forster Thomas Kresalek Fachhochschule Wedel – University of Applied Sciences 27. November 2009 Christoph Forster, Thomas Kresalek 1/53 Vortrag Agenda Haskell Bäume Einleitung Binäre Bäume 1 Einleitung Binäre Suchbäume Rose Trees 2 Binäre Bäume 3 Binäre Suchbäume 4 Rose Trees 5 Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 2/53 Vortrag Agenda Haskell Bäume Einleitung Binäre Bäume 1 Einleitung Binäre Suchbäume Rose Trees 2 Binäre Bäume 3 Binäre Suchbäume 4 Rose Trees 5 Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 3/53 Vortrag Einleitung Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Motivation Zusammenfassung & Ausblick Natürliche Repräsentation hierarchischer Strukturen Ordnung von Mengen durch Hierarchisierung Bessere Laufzeiten als Liste Implizit Sortierung Christoph Forster, Thomas Kresalek 4/53 Vortrag verschiedene Baumtypen Haskell Bäume Einleitung Binäre Bäume verschiedene Baumtypen Binäre Bäume (binary tree) Binäre Suchbäume Rose Trees Daten nur in den Blättern Daten in Blättern und Knoten Zusammenfassung & Ausblick jeweils gleiche Typen unterschiedliche Typen, z.B. Int in Knoten für jeweilige Blätter-Anzahl Daten nur in den Knoten Datentyp hat Ordnungsrelation ⇒ Daten vor Unterbäumen (binary heap) ⇒ Daten zwischen Unterbäumen (binary search tree) N-äre Bäume (Rose Trees) Christoph Forster, Thomas Kresalek 5/53 Vortrag Agenda Haskell Bäume Einleitung 1 Einleitung Binäre Bäume Datenstruktur 2 Operationen Binäre Bäume Datenstruktur Operationen Kontrollstruktur Erweiterung 3 Binäre Suchbäume 4 Rose Trees 5 Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek Kontrollstruktur Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick 6/53 Vortrag Datenstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Operationen Kontrollstruktur Definition: Datentyp {- Datenstruktur Binärbaum Erweiterung Binäre Suchbäume -} Rose Trees data Btree a = Leaf a | Fork (Btree a ) (Btree a) Zusammenfassung & Ausblick Hier zunächst einfachste Art: Daten in den Blättern Christoph Forster, Thomas Kresalek 7/53 Vortrag Datenstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Beispiel Operationen Kontrollstruktur {- Beispiel 1 -} Fork (Leaf 1) (Fork (Leaf 2) (Leaf 3)) Erweiterung Binäre Suchbäume {- Beispiel 2 -} Fork (Fork (Leaf 1) (Leaf 2)) (Leaf 3) Rose Trees Zusammenfassung & Ausblick 1 2 3 Christoph Forster, Thomas Kresalek 1 2 3 8/53 Vortrag Datenstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Beispiel Operationen Kontrollstruktur {- Beispiel 1 -} Fork (Leaf 1) (Fork (Leaf 2) (Leaf 3)) Erweiterung Binäre Suchbäume {- Beispiel 2 -} Fork (Fork (Leaf 1) (Leaf 2)) (Leaf 3) Rose Trees Zusammenfassung & Ausblick 1 2 3 Beispiel 1 Christoph Forster, Thomas Kresalek 1 2 3 Beispiel 2 8/53 Vortrag Operationen Haskell Bäume Einleitung Wichtige Maße eines Baumes Binäre Bäume {- Größe des Baums Datenstruktur -} Operationen Kontrollstruktur size :: Btree a -> Int size (Leaf x) = 1 size (Fork xt yt) = size xt + size yt Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 9/53 Vortrag Operationen Haskell Bäume Einleitung Wichtige Maße eines Baumes Binäre Bäume {- Größe des Baums Datenstruktur -} Operationen Kontrollstruktur size :: Btree a -> Int size (Leaf x) = 1 size (Fork xt yt) = size xt + size yt {- Höhe des Baums Erweiterung Binäre Suchbäume Rose Trees -} Zusammenfassung & Ausblick height :: Btree a -> Int height (Leaf x) = 0 height (Fork xt yt) = 1 + (height xt ‘max‘ height yt) Was sagen uns diese Maße? Christoph Forster, Thomas Kresalek 9/53 Vortrag Operationen Haskell Bäume Einleitung Wichtige Maße eines Baumes Binäre Bäume {- Größe des Baums Datenstruktur -} Operationen Kontrollstruktur size :: Btree a -> Int size (Leaf x) = 1 size (Fork xt yt) = size xt + size yt {- Höhe des Baums Erweiterung Binäre Suchbäume Rose Trees -} Zusammenfassung & Ausblick height :: Btree a -> Int height (Leaf x) = 0 height (Fork xt yt) = 1 + (height xt ‘max‘ height yt) Was sagen uns diese Maße? Größe entspricht der Länge einer Liste Höhe entspricht der maximalen Tiefe Christoph Forster, Thomas Kresalek 9/53 Vortrag Operationen Haskell Bäume Operationen Einleitung Binäre Bäume {- Tiefe des Baumes -} Datenstruktur Operationen depths :: Btree a -> Btree Int depths = down 0 Kontrollstruktur Erweiterung Binäre Suchbäume down :: Int -> Btree a -> Btree Int down n (Leaf x) = Leaf n down n (Fork xt yt) = Fork (down (n + 1) xt) (down (n + 1) yt) Christoph Forster, Thomas Kresalek Rose Trees Zusammenfassung & Ausblick 10/53 Vortrag Operationen Haskell Bäume Operationen Einleitung Binäre Bäume {- Tiefe des Baumes -} Datenstruktur Operationen depths :: Btree a -> Btree Int depths = down 0 Kontrollstruktur Erweiterung Binäre Suchbäume down :: Int -> Btree a -> Btree Int down n (Leaf x) = Leaf n down n (Fork xt yt) = Fork (down (n + 1) xt) (down (n + 1) yt) Rose Trees Zusammenfassung & Ausblick {- Baum in Liste umwandeln -} flatten :: Btree a -> [a] flatten (Leaf x) = [x] flatten (Fork xt yt) = flatten xt ++ flatten yt depths ersetzt die Blätter durch die Tiefe Reihenfolge der durch flatten erzeugten Liste? Christoph Forster, Thomas Kresalek 10/53 Vortrag Operationen Haskell Bäume Operationen Einleitung Binäre Bäume {- Tiefe des Baumes -} Datenstruktur Operationen depths :: Btree a -> Btree Int depths = down 0 Kontrollstruktur Erweiterung Binäre Suchbäume down :: Int -> Btree a -> Btree Int down n (Leaf x) = Leaf n down n (Fork xt yt) = Fork (down (n + 1) xt) (down (n + 1) yt) Rose Trees Zusammenfassung & Ausblick {- Baum in Liste umwandeln -} flatten :: Btree a -> [a] flatten (Leaf x) = [x] flatten (Fork xt yt) = flatten xt ++ flatten yt depths ersetzt die Blätter durch die Tiefe Reihenfolge der durch flatten erzeugten Liste? ⇒ von Links nach Rechts Christoph Forster, Thomas Kresalek 10/53 Vortrag Operationen Haskell Bäume Einleitung Erstellung von Bäumen Binäre Bäume {- Erstellt Bäume aus einer Liste Datenstruktur -} Operationen Kontrollstruktur mkBtree :: [a] -> Btree a mkBtree xs | (m == 0) = Leaf (unwrap xs) | otherwise = Fork (mkBtree ys) (mkBtree zs) where m = (length xs) ‘div‘ 2 (ys, zs) = splitAt m xs unwrap [x] = x Christoph Forster, Thomas Kresalek Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick 11/53 Vortrag Operationen Haskell Bäume Einleitung Erstellung von Bäumen Binäre Bäume {- Erstellt Bäume aus einer Liste Datenstruktur -} Operationen Kontrollstruktur mkBtree :: [a] -> Btree a mkBtree xs | (m == 0) = Leaf (unwrap xs) | otherwise = Fork (mkBtree ys) (mkBtree zs) where m = (length xs) ‘div‘ 2 (ys, zs) = splitAt m xs unwrap [x] = x Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Erstellt Baum minimaler Höhe Rekursives Aufbauen von optimalen Teilbäumen Halbierung der Ausgangsliste in jedem Schritt Laufzeit? Christoph Forster, Thomas Kresalek 11/53 Vortrag Operationen Haskell Bäume Einleitung Erstellung von Bäumen Binäre Bäume {- Erstellt Bäume aus einer Liste Datenstruktur -} Operationen Kontrollstruktur mkBtree :: [a] -> Btree a mkBtree xs | (m == 0) = Leaf (unwrap xs) | otherwise = Fork (mkBtree ys) (mkBtree zs) where m = (length xs) ‘div‘ 2 (ys, zs) = splitAt m xs unwrap [x] = x Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Erstellt Baum minimaler Höhe Rekursives Aufbauen von optimalen Teilbäumen Halbierung der Ausgangsliste in jedem Schritt Laufzeit? O(n log n) Christoph Forster, Thomas Kresalek 11/53 Vortrag Operationen Haskell Bäume Maximum Ermittlung Einleitung Binäre Bäume {- Maximum der gespeicherten Werte -} maxBtree :: (Ord a) => Btree a -> a maxBtree (Leaf x) = x maxBtree (Fork xt yt)=(maxBtree xt) ‘max‘ (maxBtree yt) Datenstruktur Operationen Kontrollstruktur Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 12/53 Vortrag Operationen Haskell Bäume Maximum Ermittlung Einleitung Binäre Bäume {- Maximum der gespeicherten Werte -} maxBtree :: (Ord a) => Btree a -> a maxBtree (Leaf x) = x maxBtree (Fork xt yt)=(maxBtree xt) ‘max‘ (maxBtree yt) Datenstruktur Operationen Kontrollstruktur Erweiterung Binäre Suchbäume Rose Trees Gesetze Zusammenfassung & Ausblick {- Gesetze über bisherige Operationen -} size = length . flatten height = maxBtree . depths {- Stimmts oder nicht? -} mkBtree . flatten = id flatten . mkBtree = id Christoph Forster, Thomas Kresalek 12/53 Vortrag Operationen Haskell Bäume Maximum Ermittlung Einleitung Binäre Bäume {- Maximum der gespeicherten Werte -} maxBtree :: (Ord a) => Btree a -> a maxBtree (Leaf x) = x maxBtree (Fork xt yt)=(maxBtree xt) ‘max‘ (maxBtree yt) Datenstruktur Operationen Kontrollstruktur Erweiterung Binäre Suchbäume Rose Trees Gesetze Zusammenfassung & Ausblick {- Gesetze über bisherige Operationen -} size = length . flatten height = maxBtree . depths {- Stimmts oder nicht? -} mkBtree . flatten = id flatten . mkBtree = id ⇒ Stimmt! Christoph Forster, Thomas Kresalek 12/53 Vortrag Operationen Haskell Bäume Einleitung Verarbeitung mit map Binäre Bäume Datenstruktur {- Map für den Binären Baum Operationen -} Kontrollstruktur Erweiterung mapBtree :: (a -> b) -> Btree a -> Btree b mapBtree f (Leaf x) = Leaf (f x) mapBtree f (Fork xt yt) = Fork (mapBtree f xt) (mapBtree f yt) Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 13/53 Vortrag Operationen Haskell Bäume Einleitung Verarbeitung mit map Binäre Bäume Datenstruktur {- Map für den Binären Baum Operationen -} Kontrollstruktur Erweiterung mapBtree :: (a -> b) -> Btree a -> Btree b mapBtree f (Leaf x) = Leaf (f x) mapBtree f (Fork xt yt) = Fork (mapBtree f xt) (mapBtree f yt) Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Analogon zu map auf Listen Anwendung von Funktionen auf die Elemente des Baums mapBtree ist wie map für Listen ein Funktor für Bäume Christoph Forster, Thomas Kresalek 13/53 Vortrag Operationen Haskell Bäume Gesetze für map Einleitung Binäre Bäume {- Gesetze für map auf binärem Baum -} Datenstruktur Operationen mapBtree id = id Kontrollstruktur Erweiterung mapBtree (f . g) = mapBtree f . mapBtree g Binäre Suchbäume Rose Trees map f . flatten = flatten . mapBtree f Zusammenfassung & Ausblick Was ist ein Funktor? Christoph Forster, Thomas Kresalek 14/53 Vortrag Operationen Haskell Bäume Gesetze für map Einleitung Binäre Bäume {- Gesetze für map auf binärem Baum -} Datenstruktur Operationen mapBtree id = id Kontrollstruktur Erweiterung mapBtree (f . g) = mapBtree f . mapBtree g Binäre Suchbäume Rose Trees map f . flatten = flatten . mapBtree f Zusammenfassung & Ausblick Was ist ein Funktor? ⇒ mapBtree, genau wie map bei Listen Christoph Forster, Thomas Kresalek 14/53 Vortrag Operationen Haskell Bäume Gesetze für map Einleitung Binäre Bäume {- Gesetze für map auf binärem Baum -} Datenstruktur Operationen mapBtree id = id Kontrollstruktur Erweiterung mapBtree (f . g) = mapBtree f . mapBtree g Binäre Suchbäume Rose Trees map f . flatten = flatten . mapBtree f Zusammenfassung & Ausblick Was ist ein Funktor? ⇒ mapBtree, genau wie map bei Listen Definition: Funktor Ein Operator, der aus einem oder mehreren singulären Termen wiederum einen singulären Term erzeugt. Quelle: angelehnt an CARNAP, 1954 Christoph Forster, Thomas Kresalek 14/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Kontrollstruktur fold Datenstruktur Operationen {- Fold für den Binären Baum -} Kontrollstruktur Erweiterung foldBtree :: (a->b) -> (b->b->b) -> Btree a->b foldBtree f g (Leaf x) = f x foldBtree f g (Fork xt yt) = g( foldBtree f g xt) (foldBtree f g yt) Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Analogon zu fold auf Listen fold ermöglicht Verarbeitung der Datenstruktur Christoph Forster, Thomas Kresalek 15/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Kontrollstruktur fold Datenstruktur Operationen {- Fold für den Binären Baum -} Kontrollstruktur Erweiterung foldBtree :: (a->b) -> (b->b->b) -> Btree a->b foldBtree f g (Leaf x) = f x foldBtree f g (Fork xt yt) = g( foldBtree f g xt) (foldBtree f g yt) Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Analogon zu fold auf Listen fold ermöglicht Verarbeitung der Datenstruktur Funktion f bearbeitet Blätter Funktion g arbeitet in den Knoten Christoph Forster, Thomas Kresalek 15/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Nutzung von fold für Operationen Operationen Kontrollstruktur Erweiterung size’ = foldBtree (const 1) ( + ) Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 16/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Nutzung von fold für Operationen Operationen Kontrollstruktur Erweiterung size’ = foldBtree (const 1) ( + ) Binäre Suchbäume height’ = foldBtree (const 0) maxsubs where m ‘maxsubs‘ n = 1 + m ‘max‘ n Rose Trees Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 16/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Nutzung von fold für Operationen Operationen Kontrollstruktur Erweiterung size’ = foldBtree (const 1) ( + ) Binäre Suchbäume height’ = foldBtree (const 0) maxsubs where m ‘maxsubs‘ n = 1 + m ‘max‘ n Rose Trees Zusammenfassung & Ausblick flatten’ = foldBtree wrap ( ++ ) Christoph Forster, Thomas Kresalek 16/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Nutzung von fold für Operationen Operationen Kontrollstruktur Erweiterung size’ = foldBtree (const 1) ( + ) Binäre Suchbäume height’ = foldBtree (const 0) maxsubs where m ‘maxsubs‘ n = 1 + m ‘max‘ n Rose Trees Zusammenfassung & Ausblick flatten’ = foldBtree wrap ( ++ ) maxBtree’ :: (Ord a) => Btree a -> a maxBtree’ = foldBtree id (max) Christoph Forster, Thomas Kresalek 16/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Datenstruktur Nutzung von fold für Operationen Operationen Kontrollstruktur Erweiterung size’ = foldBtree (const 1) ( + ) Binäre Suchbäume height’ = foldBtree (const 0) maxsubs where m ‘maxsubs‘ n = 1 + m ‘max‘ n Rose Trees Zusammenfassung & Ausblick flatten’ = foldBtree wrap ( ++ ) maxBtree’ :: (Ord a) => Btree a -> a maxBtree’ = foldBtree id (max) mapBtree’ f = foldBtree (Leaf . f) Fork Christoph Forster, Thomas Kresalek 16/53 Vortrag Erweiterung Binärer Bäume Haskell Bäume Einleitung Binäre Bäume Datenstruktur Operationen Definition: Datentyp Kontrollstruktur Erweiterung {- Datenstruktur Erweiterter Binärbaum -} data ATree a = ALeaf a | AFork Int (ATree a) (ATree a) Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Zusätzlicher Wert im Knoten Speichert Größe des linken Teilbaums Christoph Forster, Thomas Kresalek 17/53 Vortrag Erweiterung Binärer Bäume Haskell Bäume Einleitung Binäre Bäume Konstruktor Datenstruktur Operationen {- Konstruktor fork :: ATree a -> fork xt yt = AFork where AFork -} ATree a -> ATree a n xt yt n = lsize xt Kontrollstruktur Erweiterung Binäre Suchbäume Rose Trees {- Konstruktur ATree-} mkATree :: [a] -> ATree a mkATree xs | (m==0) = ALeaf (unwrap xs) | otherwise = fork (mkATree ys) (mkATree zs) where m = (length xs) ‘div‘ 2 (ys,zs) = splitAt m xs unwrap [x] = x Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 18/53 Vortrag Erweiterung Binärer Bäume Haskell Bäume Einleitung Binäre Bäume Datenstruktur Indizierter Zugriff Operationen Kontrollstruktur {- indizierter Zugriff -} retrieve :: ATree a -> Int -> a retrieve (ALeaf x) 0 = x retrieve (AFork m xt yt) k = if k < m then retrieve xt k else retrieve yt (k-m) Erweiterung Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Nutzt gespeicherte Informationen in Knoten Effizienter als Zählen in Listen, bei großen n Christoph Forster, Thomas Kresalek 19/53 Vortrag Agenda Haskell Bäume Einleitung 1 Einleitung Binäre Bäume Binäre Suchbäume 2 Datenstruktur & Eigenschaften Binäre Bäume Operationen Kontrollstrukturen 3 Binäre Suchbäume Datenstruktur & Eigenschaften Operationen Kontrollstrukturen 4 Rose Trees 5 Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek Rose Trees Zusammenfassung & Ausblick 20/53 Vortrag Datenstruktur Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Operationen Definition: Datentyp Kontrollstrukturen Rose Trees {- Datenstruktur Binärer Suchbaum -} data (Ord a) Stree a = Null | Fork (Stree a ) a (Stree a) Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 21/53 Vortrag Eigenschaften Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Die Daten befinden sich in den Knoten zwischen den Subbäumen Datenstruktur & Eigenschaften Operationen Kontrollstrukturen Für den Datentyp a muss eine Ordnungsrelation definiert sein Rose Trees Zusammenfassung & Ausblick ⇒ Fork xt e yt ⇒ ∀x : x ∈ xt → (x ≤ e), x ∈ yt → (x > e) ⇒ Gute Repräsentationsmöglichkeit für Multimengen mit Ordnungsrelation Christoph Forster, Thomas Kresalek 22/53 Vortrag Beispiel Haskell Bäume Einleitung Beispiel Binäre Bäume Binäre Suchbäume {- Beispiel 1 -} Fork (Fork Null 1 Null) 3 (Fork (Fork Null 4 Null) 5 (Fork Null 6 Null)) Datenstruktur & Eigenschaften Operationen Kontrollstrukturen Rose Trees 3 Zusammenfassung & Ausblick 1 Null 5 Null 4 Null Christoph Forster, Thomas Kresalek 6 Null Null Null 23/53 Vortrag Operationen: Erzeugung aus Liste Haskell Bäume Einleitung Erzeugung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften {- Erzeugung eines Suchbaums aus einer Liste -} mkStree :: (Ord a) => [a] -> Stree a mkStree [] = Null mkStree (x:xs) = Fork (mkStree ys) x (mkStree zs) where (ys,zs) = partition (<= x) xs Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick {- Aufteilung zweier Listen an Hand von Prädikat -} partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = (filter p xs,filter (not . p) xs) Aus sortierten Listen erzeugte Bäume sind leider sehr unbalanciert Christoph Forster, Thomas Kresalek 24/53 Vortrag Beispiele Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Operationen Beispiel Kontrollstrukturen {- Beispiel 2 -} {- mkStree [1,3,4,5,6] => -} Fork Null 1 (Fork Null 3 (Fork Null 4 (Fork Null 5 (Fork Null 6 Null)))) Christoph Forster, Thomas Kresalek Rose Trees Zusammenfassung & Ausblick 25/53 Vortrag Beispiele Haskell Bäume Einleitung Binäre Bäume 1 Null Binäre Suchbäume Datenstruktur & Eigenschaften 3 Operationen Kontrollstrukturen Null Rose Trees 4 Null Zusammenfassung & Ausblick 5 Null 6 Null Christoph Forster, Thomas Kresalek Null 26/53 Vortrag Operationen: Rückführung zu Liste Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Operationen Erzeugung einer Liste aus einem Stree Kontrollstrukturen Rose Trees flatten :: (Ord a) => Stree a -> [a] flatten Null = [] flatten (Fork xt x yt) = flatten xt ++ (x:flatten yt) Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 27/53 Vortrag Operationen: Sortieren Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Sortieren Operationen Kontrollstrukturen sort’ :: (Ord a) => [a] -> [a] sort’ = flatten . mkStree Rose Trees Zusammenfassung & Ausblick entspricht einer möglichen Implementierung des Quicksort-Algorithmus Christoph Forster, Thomas Kresalek 28/53 Vortrag Operationen: Höhe Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Höhe Operationen heightST :: (Ord a) => Stree a -> Integer heightST Null = 0 heightST (Fork xt x yt) = 1 + (max (heightST xt) (heightST yt)) Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick Die Höhe eines Suchbaums ergibt sich über die Knoten Christoph Forster, Thomas Kresalek 29/53 Vortrag Operationen: Member Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Membership member member member | | | Datenstruktur & Eigenschaften :: (Ord a) => a -> Stree a -> Bool x Null = False x (Fork xt y yt) (x < y) = member x xt (x == y) = True (x > y) = member x yt Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick besonders effizient, wenn der Baum perfekt balanciert ist Christoph Forster, Thomas Kresalek 30/53 Vortrag Operationen: Einfügen Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Einfügen Operationen Kontrollstrukturen insert insert insert | | | :: (Ord a) => a -> Stree a -> Stree a x Null = Fork Null x Null x (Fork xt y yt) (x < y) = Fork (insert x xt) y yt (x == y) = Fork xt y yt (x > y) = Fork xt y (insert x yt) Christoph Forster, Thomas Kresalek Rose Trees Zusammenfassung & Ausblick 31/53 Vortrag Operationen: Entfernen von Elementen Haskell Bäume Einleitung Binäre Bäume Entfernen von Elementen delete delete delete | | | Binäre Suchbäume Datenstruktur & Eigenschaften :: (Ord a) => a -> Stree a -> Stree a x Null = Null x (Fork xt y yt) (x < y) = Fork (delete x xt) y yt (x == y) = join xt yt (x > y) = Fork xt y (delete x yt) Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick Teilbäume müssen an der Stelle des gelöschten Elements zusammengeführt werden Das Ergebnis soll perfekt balanciert sein. Christoph Forster, Thomas Kresalek 32/53 Vortrag Operationen: Join Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Join Operationen join :: (Ord a) => Stree a -> Stree a -> Stree a join Null yt = yt join (Fork ut x vt) yt = Fork ut x (join vt yt) Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick Einfache Implementierung Aber Ergebnis ist nicht gut balanciert Christoph Forster, Thomas Kresalek 33/53 Vortrag Operationen: Join Haskell Bäume Einleitung Binäre Bäume Join Binäre Suchbäume Datenstruktur & Eigenschaften join :: (Ord a) => Stree a -> Stree a -> Stree a join xt yt = if empty yt then xt else Fork xt (headTree yt) (tailTree yt) Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick komplexere Implementierung empty, headTree und tailTree müssen implementiert werden Christoph Forster, Thomas Kresalek 34/53 Vortrag Operationen: Empty Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Operationen Empty Kontrollstrukturen Rose Trees empty :: (Ord a) => Stree a -> Bool empty Null = True empty (Fork xt y yt) = False Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 35/53 Vortrag Operationen: Head und Tail eines Baums Haskell Bäume Einleitung Head und Tail {- Head -} headTree :: (Ord headTree = fst . {- Tail -} tailTree :: (Ord tailTree = snd . Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften a) => Stree a -> a splittree Operationen Kontrollstrukturen a) => Stree a -> Stree a splitTree Rose Trees Zusammenfassung & Ausblick splitTree splitTree :: (Ord a) => Stree a -> (a,Stree a) splitTree (Fork xt y yt) = if empty xt then (y,yt) else (x, Fork wt y yt) where (x,wt) = splitTree xt Christoph Forster, Thomas Kresalek 36/53 Vortrag Operationen: Join-Optimierung Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Join Datenstruktur & Eigenschaften join’ :: (Ord a) => Stree a -> Stree a -> Stree a join’ xt yt = if empty yt then xt else Fork xt headOfTree tailOfTree where (headOfTree,tailOfTree) = splitTree yt Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick ⇒ splitTree wird nur einmal aufgerufen. Christoph Forster, Thomas Kresalek 37/53 Vortrag Operationen Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Verarbeitung mit map {- Map für den Binären Suchbaum mapStree mapStree mapStree Fork Datenstruktur & Eigenschaften Operationen -} Kontrollstrukturen Rose Trees :: (a -> b) -> Stree a -> Stree b f Null = Null f (Fork xt x yt) = (mapBtree f xt) (f x) (mapBtree f yt) Zusammenfassung & Ausblick Analog zur Implementierung für Btree Christoph Forster, Thomas Kresalek 38/53 Vortrag Kontrollstrukturen Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften fold Operationen Kontrollstrukturen foldStree :: (Ord a) => (a -> b) -> (b -> b -> b -> b) -> b -> Stree a -> b foldStree f g v Null = v foldStree f g v (Fork xt x yt) = g (foldStree f g v xt) (f x) (foldStree f g v yt) Christoph Forster, Thomas Kresalek Rose Trees Zusammenfassung & Ausblick 39/53 Vortrag Kontrollstrukturen Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Nutzung von fold für Operationen Datenstruktur & Eigenschaften {- Höhe -} heightST’ :: (Ord a) => STree a -> Integer heightST’ = foldSTree (const 1) (\ x y z -> (max x z) + y) 0 Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick {- Bildung einer Liste -} flatten’ :: (Ord a) => STree a -> [a] flatten’ = foldSTree (\ x -> [x]) (\ x y z -> x ++ (y ++ z)) [] Christoph Forster, Thomas Kresalek 40/53 Vortrag Kontrollstrukturen Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Datenstruktur & Eigenschaften Operationen FoldStree nicht direkt für member, insert und delete einsetzbar Rose Trees allerdings auch hier Strukturübereinstimmungen Zusammenfassung & Ausblick Kontrollstrukturen Schaffung einer weiteren Kontrollstruktur sinnvoll? Christoph Forster, Thomas Kresalek 41/53 Vortrag Kontrollstrukturen Haskell Bäume Einleitung Binäre Bäume Erweitertes fold Binäre Suchbäume Datenstruktur & Eigenschaften foldSTree2 :: Ord a => (STree a -> a -> STree a -> c) -> (c -> a -> STree a -> c) -> (STree a -> a -> c -> c) -> (a -> c) -> a -> STree a -> c foldStree2 fm fl fr fn y Null = fn y foldStree2 fm fl fr fn x (Fork xt y yt) | (x < y) = fl (foldStree2 fm fl fr fn x xt) y yt | (x == y) = fm xt x yt | (x > y) = fr xt y (foldStree2 fm fl fr fn x yt) Christoph Forster, Thomas Kresalek Operationen Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick 42/53 Vortrag Kontrollstrukturen Haskell Bäume Nutzung des erweiterten fold Einleitung member’ :: (Ord a) => a -> Stree a -> Bool member’ = foldStree2 (\ x y z -> True) (\ x y z -> x) (\ x y z -> z) (\ x -> False) Binäre Suchbäume Binäre Bäume Datenstruktur & Eigenschaften Operationen Kontrollstrukturen insert’ :: (Ord a) => a insert’ = foldStree2 (\ (\ (\ (\ -> Stree a -> Stree a xt y yt -> Fork xt y yt) xt x yt -> Fork xt x yt) xt x yt -> Fork xt x yt) x -> Fork Null x Null) delete’ :: (Ord a) => a delete’ = foldStree2 (\ (\ (\ (\ -> Stree a xt y yt -> xt x yt -> xt x yt -> x -> Null) Christoph Forster, Thomas Kresalek Rose Trees Zusammenfassung & Ausblick -> Stree a join’ xt yt) Fork xt x yt) Fork xt x yt) 43/53 Vortrag Kontrollstrukturen Haskell Bäume Einleitung Binäre Bäume Nutzung des erweiterten fold Binäre Suchbäume Datenstruktur & Eigenschaften buildFork xt x yt = Fork xt x yt Operationen insert’’ :: (Ord a) => a -> Stree a -> Stree a insert’’ = foldSTree2 buildFork buildFork buildFork (\ x -> Fork Null x Null) Kontrollstrukturen Rose Trees Zusammenfassung & Ausblick delete’’ :: (Ord a) => a -> Stree a -> Stree a delete’’ = foldSTree2 (\ xt y yt -> join’ xt yt) buildFork buildFork (\ x -> Null) Christoph Forster, Thomas Kresalek 44/53 Vortrag Agenda Haskell Bäume Einleitung 1 Einleitung Binäre Bäume Binäre Bäume Rose Trees Binäre Suchbäume 2 Datenstruktur Operationen 3 Binäre Suchbäume 4 Rose Trees Datenstruktur Operationen Kontrollstruktur 5 Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek Kontrollstruktur Zusammenfassung & Ausblick 45/53 Vortrag Rose Trees Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Datenstruktur Operationen Kontrollstruktur Zusammenfassung & Ausblick Angelehnt an Verzweigungen des Rhododendron Busches Christoph Forster, Thomas Kresalek 46/53 Vortrag Datenstruktur Haskell Bäume Einleitung Binäre Bäume Rose Tree Binäre Suchbäume Definition: Datentyp Rose Trees Datenstruktur {- Datenstruktur Rose Trees -} Operationen Kontrollstruktur data Rose a = Node a [Rose a] Zusammenfassung & Ausblick Allgemeiner definiert Beliebig viele Kinder Binäre Bäume ≡ Rose Tree 2. Ordnung Blätter sind durch leere Listen dargestellt Christoph Forster, Thomas Kresalek 47/53 Vortrag Datenstruktur Haskell Bäume Einleitung Unendliche Bäume Binäre Bäume Beispiel Binäre Suchbäume Rose Trees {- Unendlicher Rose Tree -} Datenstruktur Operationen Node 0 [ Node n [] | n <- [1..]] Kontrollstruktur Zusammenfassung & Ausblick 0 1 2 Christoph Forster, Thomas Kresalek 3 4 ... 48/53 Vortrag Datenstruktur Haskell Bäume Einleitung Unendliche Bäume Binäre Bäume Beispiel Binäre Suchbäume Rose Trees {- Unendlicher Rose Tree -} Datenstruktur Operationen Node 0 [ Node n [] | n <- [1..]] Kontrollstruktur Zusammenfassung & Ausblick 0 1 2 3 4 ... Spezielle Verarbeitung notwendig (breath-first) Analogon zu unendlichen Listen Im Folgenden: Endliche Rose Trees Christoph Forster, Thomas Kresalek 48/53 Vortrag Operationen Haskell Bäume Einleitung Binäre Bäume Wichtige Maße eines Baumes {- Anzahl der Elemente Binäre Suchbäume Rose Trees -} Datenstruktur Operationen size :: Rose a -> Int size (Node x xts) = 1 + sum (map size xts) Kontrollstruktur Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 49/53 Vortrag Operationen Haskell Bäume Einleitung Binäre Bäume Wichtige Maße eines Baumes {- Anzahl der Elemente Binäre Suchbäume Rose Trees -} Datenstruktur Operationen size :: Rose a -> Int size (Node x xts) = 1 + sum (map size xts) {- Höhe des Baums Kontrollstruktur Zusammenfassung & Ausblick -} height :: Rose a -> Int height (Node x xts) = 1 + maxlist (map height xts) where maxlist = foldl (max) 0 Christoph Forster, Thomas Kresalek 49/53 Vortrag Operationen Haskell Bäume Einleitung Binäre Bäume Wichtige Maße eines Baumes {- Anzahl der Elemente Binäre Suchbäume Rose Trees -} Datenstruktur Operationen size :: Rose a -> Int size (Node x xts) = 1 + sum (map size xts) {- Höhe des Baums Kontrollstruktur Zusammenfassung & Ausblick -} height :: Rose a -> Int height (Node x xts) = 1 + maxlist (map height xts) where maxlist = foldl (max) 0 Höhe und Größe eines Rose Tree immer größer 0 Christoph Forster, Thomas Kresalek 49/53 Vortrag Operationen Haskell Bäume Plätten eines Rosenbaumes Einleitung Binäre Bäume {- Plätten des Baums -} Binäre Suchbäume Rose Trees flatten :: Rose a -> [a] flatten (Node x xts) = x:concat(map flatten xts) Datenstruktur Operationen Kontrollstruktur Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 50/53 Vortrag Operationen Haskell Bäume Plätten eines Rosenbaumes Einleitung Binäre Bäume {- Plätten des Baums -} Binäre Suchbäume Rose Trees flatten :: Rose a -> [a] flatten (Node x xts) = x:concat(map flatten xts) Datenstruktur Operationen Kontrollstruktur Zusammenfassung & Ausblick Plätten nur bei endlichen Bäumen (depth-first) Plätten effizient O(n log n) Reihenfolge? Christoph Forster, Thomas Kresalek 50/53 Vortrag Operationen Haskell Bäume Plätten eines Rosenbaumes Einleitung Binäre Bäume {- Plätten des Baums -} Binäre Suchbäume Rose Trees flatten :: Rose a -> [a] flatten (Node x xts) = x:concat(map flatten xts) Datenstruktur Operationen Kontrollstruktur Zusammenfassung & Ausblick Plätten nur bei endlichen Bäumen (depth-first) Plätten effizient O(n log n) Reihenfolge? 5 2 1 7 3 6 ... 8 Christoph Forster, Thomas Kresalek 50/53 Vortrag Operationen Haskell Bäume Plätten eines Rosenbaumes Einleitung Binäre Bäume {- Plätten des Baums -} Binäre Suchbäume Rose Trees flatten :: Rose a -> [a] flatten (Node x xts) = x:concat(map flatten xts) Datenstruktur Operationen Kontrollstruktur Zusammenfassung & Ausblick Plätten nur bei endlichen Bäumen (depth-first) Plätten effizient O(n log n) Reihenfolge? 5 2 1 7 3 6 ... 8 Christoph Forster, Thomas Kresalek Zuerst Knoten, dann Kinder von Links nach Rechts ⇒5,2,1,3,7,6,8 50/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Kontrollstruktur fold Binäre Suchbäume Rose Trees {- Fold für den Rosenbaum -} Datenstruktur foldRose :: (a -> [b] -> b) -> Rose a -> b foldRose f (Node x xts) = f x (map (foldRose f) xts) Operationen Kontrollstruktur Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 51/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Binäre Bäume Kontrollstruktur fold Binäre Suchbäume Rose Trees {- Fold für den Rosenbaum -} Datenstruktur foldRose :: (a -> [b] -> b) -> Rose a -> b foldRose f (Node x xts) = f x (map (foldRose f) xts) Operationen Kontrollstruktur Zusammenfassung & Ausblick Element Verarbeitung mit map {- map für den Rosenbaum -} mapRose :: (a -> b) -> Rose a -> Rose b mapRose f = foldRose (Node . f) Christoph Forster, Thomas Kresalek 51/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Beispiele mit fold Binäre Bäume {- Größe eines Rosenbaums -} Binäre Suchbäume Rose Trees size :: Rose a -> Int size = foldRose f where f x ns = 1 + sum ns Datenstruktur Operationen Kontrollstruktur Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek 52/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Beispiele mit fold Binäre Bäume {- Größe eines Rosenbaums -} Binäre Suchbäume Rose Trees size :: Rose a -> Int size = foldRose f where f x ns = 1 + sum ns Datenstruktur Operationen Kontrollstruktur {- Maximum eines Rosenbaumes -} Zusammenfassung & Ausblick maxRose :: (Ord a, Num a) => Rose a -> a maxRose = foldRose f where f x ns = x ‘max‘ maxlist ns maxlist = foldl (max) 0 Christoph Forster, Thomas Kresalek 52/53 Vortrag Kontrollstruktur Haskell Bäume Einleitung Beispiele mit fold Binäre Bäume {- Größe eines Rosenbaums -} Binäre Suchbäume Rose Trees size :: Rose a -> Int size = foldRose f where f x ns = 1 + sum ns Datenstruktur Operationen Kontrollstruktur {- Maximum eines Rosenbaumes -} Zusammenfassung & Ausblick maxRose :: (Ord a, Num a) => Rose a -> a maxRose = foldRose f where f x ns = x ‘max‘ maxlist ns maxlist = foldl (max) 0 {- Plätten eines Rosenbaumes -} flatten :: Rose a -> [a] flatten = foldRose f where f x ns = x:concat ns Christoph Forster, Thomas Kresalek 52/53 Vortrag Agenda Haskell Bäume Einleitung Binäre Bäume 1 Einleitung Binäre Suchbäume Rose Trees 2 Binäre Bäume 3 Binäre Suchbäume 4 Rose Trees 5 Zusammenfassung & Ausblick Christoph Forster, Thomas Kresalek Zusammenfassung & Ausblick 53/53 Vortrag Zusammenfassung & Ausblick Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Bäume 3 1/2 verschiedene Spezialfälle Rose Trees Zusammenfassung & Ausblick Binäre Bäume (Btrees / Atrees) Binäre Suchbäume (Strees) N-äre Bäume (Rose trees) Christoph Forster, Thomas Kresalek 54/53 Vortrag Zusammenfassung & Ausblick Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Bäume 3 1/2 verschiedene Spezialfälle Rose Trees Zusammenfassung & Ausblick Binäre Bäume (Btrees / Atrees) Binäre Suchbäume (Strees) N-äre Bäume (Rose trees) Datenstrukturen Operationen Kontrollstrukturen Christoph Forster, Thomas Kresalek 54/53 Vortrag Zusammenfassung Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Bäume Ausblick Zusammenfassung & Ausblick Binäre Halden Christoph Forster, Thomas Kresalek 55/53 Vortrag Zusammenfassung Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Bäume Ausblick Zusammenfassung & Ausblick Binäre Halden Anwendungsfälle Merteens’ number Huffman trees Christoph Forster, Thomas Kresalek 55/53 Vortrag Fragen? Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Vielen Dank für die Aufmerksamkeit! Christoph Forster, Thomas Kresalek 56/53 Vortrag