84
Haskell Bäume Einleitung Binäre Bäume Binäre Suchbäume Rose Trees Zusammenfassung & Ausblick Vortrag: Bäume in Haskell Bäume in Haskell Vortrag Christoph Forster Thomas Kresalek Fachhochschule Wedel – University of Applied Sciences 27. November 2009 Christoph Forster, Thomas Kresalek 1/53 Vortrag

Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

  • Upload
    vukhue

  • View
    219

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Vortrag: Bäume in Haskell

Bäume in HaskellVortrag

Christoph Forster Thomas Kresalek

Fachhochschule Wedel – University of Applied Sciences

27. November 2009

Christoph Forster, Thomas Kresalek 1/53 Vortrag

Page 2: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Agenda

1 Einleitung

2 Binäre Bäume

3 Binäre Suchbäume

4 Rose Trees

5 Zusammenfassung & Ausblick

Christoph Forster, Thomas Kresalek 2/53 Vortrag

Page 3: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Agenda

1 Einleitung

2 Binäre Bäume

3 Binäre Suchbäume

4 Rose Trees

5 Zusammenfassung & Ausblick

Christoph Forster, Thomas Kresalek 3/53 Vortrag

Page 4: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Einleitung

MotivationNatürliche Repräsentation hierarchischerStrukturenOrdnung von Mengen durch HierarchisierungBessere Laufzeiten als ListeImplizit Sortierung

Christoph Forster, Thomas Kresalek 4/53 Vortrag

Page 5: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

verschiedene Baumtypen

verschiedene BaumtypenBinäre Bäume (binary tree)

Daten nur in den BlätternDaten in Blättern und Knoten

jeweils gleiche Typenunterschiedliche Typen, z.B. Int in Knoten fürjeweilige Blätter-Anzahl

Daten nur in den KnotenDatentyp 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

Page 6: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Agenda

1 Einleitung

2 Binäre BäumeDatenstrukturOperationenKontrollstrukturErweiterung

3 Binäre Suchbäume

4 Rose Trees

5 Zusammenfassung & Ausblick

Christoph Forster, Thomas Kresalek 6/53 Vortrag

Page 7: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Datenstruktur

Definition: Datentyp

{- Datenstruktur Binärbaum -}

data Btree a = Leaf a| Fork (Btree a ) (Btree a)

Hier zunächst einfachste Art: Daten in den Blättern

Christoph Forster, Thomas Kresalek 7/53 Vortrag

Page 8: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Datenstruktur

Beispiel

{- Beispiel 1 -}Fork (Leaf 1) (Fork (Leaf 2) (Leaf 3))

{- Beispiel 2 -}Fork (Fork (Leaf 1) (Leaf 2)) (Leaf 3)

1 2 3 1 2 3

Beispiel 1 Beispiel 2

Christoph Forster, Thomas Kresalek 8/53 Vortrag

Page 9: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Datenstruktur

Beispiel

{- Beispiel 1 -}Fork (Leaf 1) (Fork (Leaf 2) (Leaf 3))

{- Beispiel 2 -}Fork (Fork (Leaf 1) (Leaf 2)) (Leaf 3)

1 2 3 1 2 3

Beispiel 1 Beispiel 2

Christoph Forster, Thomas Kresalek 8/53 Vortrag

Page 10: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Wichtige Maße eines Baumes

{- Größe des Baums -}

size :: Btree a -> Intsize (Leaf x) = 1size (Fork xt yt) = size xt + size yt

{- Höhe des Baums -}

height :: Btree a -> Intheight (Leaf x) = 0height (Fork xt yt) = 1 +

(height xt ‘max‘ height yt)

Was sagen uns diese Maße?Größe entspricht der Länge einer ListeHöhe entspricht der maximalen Tiefe

Christoph Forster, Thomas Kresalek 9/53 Vortrag

Page 11: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Wichtige Maße eines Baumes

{- Größe des Baums -}

size :: Btree a -> Intsize (Leaf x) = 1size (Fork xt yt) = size xt + size yt

{- Höhe des Baums -}

height :: Btree a -> Intheight (Leaf x) = 0height (Fork xt yt) = 1 +

(height xt ‘max‘ height yt)

Was sagen uns diese Maße?

Größe entspricht der Länge einer ListeHöhe entspricht der maximalen Tiefe

Christoph Forster, Thomas Kresalek 9/53 Vortrag

Page 12: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Wichtige Maße eines Baumes

{- Größe des Baums -}

size :: Btree a -> Intsize (Leaf x) = 1size (Fork xt yt) = size xt + size yt

{- Höhe des Baums -}

height :: Btree a -> Intheight (Leaf x) = 0height (Fork xt yt) = 1 +

(height xt ‘max‘ height yt)

Was sagen uns diese Maße?Größe entspricht der Länge einer ListeHöhe entspricht der maximalen Tiefe

Christoph Forster, Thomas Kresalek 9/53 Vortrag

Page 13: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Operationen

{- Tiefe des Baumes -}

depths :: Btree a -> Btree Intdepths = down 0

down :: Int -> Btree a -> Btree Intdown n (Leaf x) = Leaf ndown n (Fork xt yt) = Fork (down (n + 1) xt)

(down (n + 1) yt)

{- 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 TiefeReihenfolge der durch flatten erzeugten Liste?⇒ von Links nach Rechts

Christoph Forster, Thomas Kresalek 10/53 Vortrag

Page 14: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Operationen

{- Tiefe des Baumes -}

depths :: Btree a -> Btree Intdepths = down 0

down :: Int -> Btree a -> Btree Intdown n (Leaf x) = Leaf ndown n (Fork xt yt) = Fork (down (n + 1) xt)

(down (n + 1) yt)

{- 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 TiefeReihenfolge der durch flatten erzeugten Liste?

⇒ von Links nach Rechts

Christoph Forster, Thomas Kresalek 10/53 Vortrag

Page 15: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Operationen

{- Tiefe des Baumes -}

depths :: Btree a -> Btree Intdepths = down 0

down :: Int -> Btree a -> Btree Intdown n (Leaf x) = Leaf ndown n (Fork xt yt) = Fork (down (n + 1) xt)

(down (n + 1) yt)

{- 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 TiefeReihenfolge der durch flatten erzeugten Liste?⇒ von Links nach Rechts

Christoph Forster, Thomas Kresalek 10/53 Vortrag

Page 16: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Erstellung von Bäumen

{- Erstellt Bäume aus einer Liste -}

mkBtree :: [a] -> Btree amkBtree xs| (m == 0) = Leaf (unwrap xs)| otherwise = Fork (mkBtree ys) (mkBtree zs)where m = (length xs) ‘div‘ 2

(ys, zs) = splitAt m xsunwrap [x] = x

Erstellt Baum minimaler HöheRekursives Aufbauen von optimalen TeilbäumenHalbierung der Ausgangsliste in jedem SchrittLaufzeit? O(n log n)

Christoph Forster, Thomas Kresalek 11/53 Vortrag

Page 17: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Erstellung von Bäumen

{- Erstellt Bäume aus einer Liste -}

mkBtree :: [a] -> Btree amkBtree xs| (m == 0) = Leaf (unwrap xs)| otherwise = Fork (mkBtree ys) (mkBtree zs)where m = (length xs) ‘div‘ 2

(ys, zs) = splitAt m xsunwrap [x] = x

Erstellt Baum minimaler HöheRekursives Aufbauen von optimalen TeilbäumenHalbierung der Ausgangsliste in jedem SchrittLaufzeit?

O(n log n)

Christoph Forster, Thomas Kresalek 11/53 Vortrag

Page 18: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Erstellung von Bäumen

{- Erstellt Bäume aus einer Liste -}

mkBtree :: [a] -> Btree amkBtree xs| (m == 0) = Leaf (unwrap xs)| otherwise = Fork (mkBtree ys) (mkBtree zs)where m = (length xs) ‘div‘ 2

(ys, zs) = splitAt m xsunwrap [x] = x

Erstellt Baum minimaler HöheRekursives Aufbauen von optimalen TeilbäumenHalbierung der Ausgangsliste in jedem SchrittLaufzeit? O(n log n)

Christoph Forster, Thomas Kresalek 11/53 Vortrag

Page 19: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Maximum Ermittlung

{- Maximum der gespeicherten Werte -}maxBtree :: (Ord a) => Btree a -> amaxBtree (Leaf x) = xmaxBtree (Fork xt yt)=(maxBtree xt)

‘max‘ (maxBtree yt)

Gesetze{- Gesetze über bisherige Operationen -}

size = length . flatten

height = maxBtree . depths

{- Stimmts oder nicht? -}mkBtree . flatten = idflatten . mkBtree = id

⇒ Stimmt!

Christoph Forster, Thomas Kresalek 12/53 Vortrag

Page 20: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Maximum Ermittlung

{- Maximum der gespeicherten Werte -}maxBtree :: (Ord a) => Btree a -> amaxBtree (Leaf x) = xmaxBtree (Fork xt yt)=(maxBtree xt)

‘max‘ (maxBtree yt)

Gesetze{- Gesetze über bisherige Operationen -}

size = length . flatten

height = maxBtree . depths

{- Stimmts oder nicht? -}mkBtree . flatten = idflatten . mkBtree = id

⇒ Stimmt!

Christoph Forster, Thomas Kresalek 12/53 Vortrag

Page 21: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Maximum Ermittlung

{- Maximum der gespeicherten Werte -}maxBtree :: (Ord a) => Btree a -> amaxBtree (Leaf x) = xmaxBtree (Fork xt yt)=(maxBtree xt)

‘max‘ (maxBtree yt)

Gesetze{- Gesetze über bisherige Operationen -}

size = length . flatten

height = maxBtree . depths

{- Stimmts oder nicht? -}mkBtree . flatten = idflatten . mkBtree = id

⇒ Stimmt!Christoph Forster, Thomas Kresalek 12/53 Vortrag

Page 22: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Verarbeitung mit map

{- Map für den Binären Baum -}

mapBtree :: (a -> b) -> Btree a -> Btree bmapBtree f (Leaf x) = Leaf (f x)mapBtree f (Fork xt yt) = Fork (mapBtree f xt)

(mapBtree f yt)

Analogon zu map auf ListenAnwendung von Funktionen auf die Elemente desBaumsmapBtree ist wie map für Listen ein Funktor fürBäume

Christoph Forster, Thomas Kresalek 13/53 Vortrag

Page 23: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Verarbeitung mit map

{- Map für den Binären Baum -}

mapBtree :: (a -> b) -> Btree a -> Btree bmapBtree f (Leaf x) = Leaf (f x)mapBtree f (Fork xt yt) = Fork (mapBtree f xt)

(mapBtree f yt)

Analogon zu map auf ListenAnwendung von Funktionen auf die Elemente desBaumsmapBtree ist wie map für Listen ein Funktor fürBäume

Christoph Forster, Thomas Kresalek 13/53 Vortrag

Page 24: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Gesetze für map

{- Gesetze für map auf binärem Baum -}

mapBtree id = id

mapBtree (f . g) = mapBtree f . mapBtree g

map f . flatten = flatten . mapBtree f

Was ist ein Funktor?

⇒ mapBtree, genau wie map bei Listen

Definition: FunktorEin Operator, der aus einem oder mehreren singulären Termen wiederumeinen singulären Term erzeugt.

Quelle: angelehnt an CARNAP, 1954

Christoph Forster, Thomas Kresalek 14/53 Vortrag

Page 25: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Gesetze für map

{- Gesetze für map auf binärem Baum -}

mapBtree id = id

mapBtree (f . g) = mapBtree f . mapBtree g

map f . flatten = flatten . mapBtree f

Was ist ein Funktor?⇒ mapBtree, genau wie map bei Listen

Definition: FunktorEin Operator, der aus einem oder mehreren singulären Termen wiederumeinen singulären Term erzeugt.

Quelle: angelehnt an CARNAP, 1954

Christoph Forster, Thomas Kresalek 14/53 Vortrag

Page 26: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Operationen

Gesetze für map

{- Gesetze für map auf binärem Baum -}

mapBtree id = id

mapBtree (f . g) = mapBtree f . mapBtree g

map f . flatten = flatten . mapBtree f

Was ist ein Funktor?⇒ mapBtree, genau wie map bei Listen

Definition: FunktorEin Operator, der aus einem oder mehreren singulären Termen wiederumeinen singulären Term erzeugt.

Quelle: angelehnt an CARNAP, 1954

Christoph Forster, Thomas Kresalek 14/53 Vortrag

Page 27: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Kontrollstruktur fold{- Fold für den Binären Baum -}

foldBtree :: (a->b) -> (b->b->b) -> Btree a->bfoldBtree f g (Leaf x) = f xfoldBtree f g (Fork xt yt) = g( foldBtree f g xt)

(foldBtree f g yt)

Analogon zu fold auf Listenfold ermöglicht Verarbeitung der Datenstruktur

Funktion f bearbeitet BlätterFunktion g arbeitet in den Knoten

Christoph Forster, Thomas Kresalek 15/53 Vortrag

Page 28: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Kontrollstruktur fold{- Fold für den Binären Baum -}

foldBtree :: (a->b) -> (b->b->b) -> Btree a->bfoldBtree f g (Leaf x) = f xfoldBtree f g (Fork xt yt) = g( foldBtree f g xt)

(foldBtree f g yt)

Analogon zu fold auf Listenfold ermöglicht Verarbeitung der DatenstrukturFunktion f bearbeitet BlätterFunktion g arbeitet in den Knoten

Christoph Forster, Thomas Kresalek 15/53 Vortrag

Page 29: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Nutzung von fold für Operationen

size’ = foldBtree (const 1) ( + )

height’ = foldBtree (const 0) maxsubswhere m ‘maxsubs‘ n = 1 + m ‘max‘ n

flatten’ = foldBtree wrap ( ++ )

maxBtree’ :: (Ord a) => Btree a -> amaxBtree’ = foldBtree id (max)

mapBtree’ f = foldBtree (Leaf . f) Fork

Christoph Forster, Thomas Kresalek 16/53 Vortrag

Page 30: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Nutzung von fold für Operationen

size’ = foldBtree (const 1) ( + )

height’ = foldBtree (const 0) maxsubswhere m ‘maxsubs‘ n = 1 + m ‘max‘ n

flatten’ = foldBtree wrap ( ++ )

maxBtree’ :: (Ord a) => Btree a -> amaxBtree’ = foldBtree id (max)

mapBtree’ f = foldBtree (Leaf . f) Fork

Christoph Forster, Thomas Kresalek 16/53 Vortrag

Page 31: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Nutzung von fold für Operationen

size’ = foldBtree (const 1) ( + )

height’ = foldBtree (const 0) maxsubswhere m ‘maxsubs‘ n = 1 + m ‘max‘ n

flatten’ = foldBtree wrap ( ++ )

maxBtree’ :: (Ord a) => Btree a -> amaxBtree’ = foldBtree id (max)

mapBtree’ f = foldBtree (Leaf . f) Fork

Christoph Forster, Thomas Kresalek 16/53 Vortrag

Page 32: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Nutzung von fold für Operationen

size’ = foldBtree (const 1) ( + )

height’ = foldBtree (const 0) maxsubswhere m ‘maxsubs‘ n = 1 + m ‘max‘ n

flatten’ = foldBtree wrap ( ++ )

maxBtree’ :: (Ord a) => Btree a -> amaxBtree’ = foldBtree id (max)

mapBtree’ f = foldBtree (Leaf . f) Fork

Christoph Forster, Thomas Kresalek 16/53 Vortrag

Page 33: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Kontrollstruktur

Nutzung von fold für Operationen

size’ = foldBtree (const 1) ( + )

height’ = foldBtree (const 0) maxsubswhere m ‘maxsubs‘ n = 1 + m ‘max‘ n

flatten’ = foldBtree wrap ( ++ )

maxBtree’ :: (Ord a) => Btree a -> amaxBtree’ = foldBtree id (max)

mapBtree’ f = foldBtree (Leaf . f) Fork

Christoph Forster, Thomas Kresalek 16/53 Vortrag

Page 34: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Erweiterung Binärer Bäume

Definition: Datentyp

{- Datenstruktur Erweiterter Binärbaum -}data ATree a = ALeaf a

| AFork Int (ATree a) (ATree a)

Zusätzlicher Wert im KnotenSpeichert Größe des linken Teilbaums

Christoph Forster, Thomas Kresalek 17/53 Vortrag

Page 35: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Erweiterung Binärer Bäume

Konstruktor{- Konstruktor AFork -}

fork :: ATree a -> ATree a -> ATree afork xt yt = AFork n xt yt

where n = lsize xt

{- Konstruktur ATree-}mkATree :: [a] -> ATree amkATree xs

| (m==0) = ALeaf (unwrap xs)| otherwise = fork (mkATree ys) (mkATree zs)where m = (length xs) ‘div‘ 2

(ys,zs) = splitAt m xsunwrap [x] = x

Christoph Forster, Thomas Kresalek 18/53 Vortrag

Page 36: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Datenstruktur

Operationen

Kontrollstruktur

Erweiterung

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Erweiterung Binärer Bäume

Indizierter Zugriff

{- indizierter Zugriff -}retrieve :: ATree a -> Int -> aretrieve (ALeaf x) 0 = xretrieve (AFork m xt yt) k =

if k < mthen retrieve xt kelse retrieve yt (k-m)

Nutzt gespeicherte Informationen in KnotenEffizienter als Zählen in Listen, bei großen n

Christoph Forster, Thomas Kresalek 19/53 Vortrag

Page 37: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Agenda

1 Einleitung

2 Binäre Bäume

3 Binäre SuchbäumeDatenstruktur & EigenschaftenOperationenKontrollstrukturen

4 Rose Trees

5 Zusammenfassung & Ausblick

Christoph Forster, Thomas Kresalek 20/53 Vortrag

Page 38: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Datenstruktur

Definition: Datentyp

{- Datenstruktur Binärer Suchbaum -}data (Ord a) Stree a = Null

| Fork (Stree a ) a (Stree a)

Christoph Forster, Thomas Kresalek 21/53 Vortrag

Page 39: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Eigenschaften

Die Daten befinden sich in den Knoten zwischenden SubbäumenFür den Datentyp a muss eine Ordnungsrelationdefiniert sein

⇒ Fork xt e yt⇒ ∀x : x ∈ xt → (x ≤ e),x ∈ yt → (x > e)

⇒ Gute Repräsentationsmöglichkeit für Multimengenmit Ordnungsrelation

Christoph Forster, Thomas Kresalek 22/53 Vortrag

Page 40: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Beispiel

Beispiel

{- Beispiel 1 -}Fork (Fork Null 1 Null) 3 (Fork (Fork Null 4 Null)

5 (Fork Null 6 Null))

3

1

Null Null

5

4

Null Null

6

Null Null

Christoph Forster, Thomas Kresalek 23/53 Vortrag

Page 41: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Erzeugung aus Liste

Erzeugung

{- Erzeugung eines Suchbaums aus einer Liste -}mkStree :: (Ord a) => [a] -> Stree amkStree [] = NullmkStree (x:xs) = Fork (mkStree ys) x (mkStree zs)

where (ys,zs) = partition (<= x) xs

{- 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 leidersehr unbalanciert

Christoph Forster, Thomas Kresalek 24/53 Vortrag

Page 42: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Beispiele

Beispiel

{- 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 25/53 Vortrag

Page 43: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Beispiele

1

Null 3

Null 4

Null 5

Null 6

Null Null

Christoph Forster, Thomas Kresalek 26/53 Vortrag

Page 44: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Rückführung zu Liste

Erzeugung einer Liste aus einem Stree

flatten :: (Ord a) => Stree a -> [a]flatten Null = []flatten (Fork xt x yt) = flatten xt ++ (x:flatten yt)

Christoph Forster, Thomas Kresalek 27/53 Vortrag

Page 45: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Sortieren

Sortierensort’ :: (Ord a) => [a] -> [a]sort’ = flatten . mkStree

entspricht einer möglichen Implementierung desQuicksort-Algorithmus

Christoph Forster, Thomas Kresalek 28/53 Vortrag

Page 46: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Höhe

HöheheightST :: (Ord a) => Stree a -> IntegerheightST Null = 0heightST (Fork xt x yt) = 1 + (max (heightST xt)

(heightST yt))

Die Höhe eines Suchbaums ergibt sich über dieKnoten

Christoph Forster, Thomas Kresalek 29/53 Vortrag

Page 47: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Member

Membership

member :: (Ord a) => a -> Stree a -> Boolmember x Null = Falsemember x (Fork xt y yt)

| (x < y) = member x xt| (x == y) = True| (x > y) = member x yt

besonders effizient, wenn der Baum perfektbalanciert ist

Christoph Forster, Thomas Kresalek 30/53 Vortrag

Page 48: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Einfügen

Einfügen

insert :: (Ord a) => a -> Stree a -> Stree ainsert x Null = Fork Null x Nullinsert 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 31/53 Vortrag

Page 49: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Entfernen von Elementen

Entfernen von Elementendelete :: (Ord a) => a -> Stree a -> Stree adelete x Null = Nulldelete 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)

Teilbäume müssen an der Stelle des gelöschtenElements zusammengeführt werdenDas Ergebnis soll perfekt balanciert sein.

Christoph Forster, Thomas Kresalek 32/53 Vortrag

Page 50: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Join

Joinjoin :: (Ord a) => Stree a -> Stree a -> Stree ajoin Null yt = ytjoin (Fork ut x vt) yt = Fork ut x (join vt yt)

Einfache ImplementierungAber Ergebnis ist nicht gut balanciert

Christoph Forster, Thomas Kresalek 33/53 Vortrag

Page 51: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Join

Joinjoin :: (Ord a) => Stree a -> Stree a -> Stree ajoin xt yt =

if empty ytthen xtelse Fork xt (headTree yt) (tailTree yt)

komplexere Implementierungempty, headTree und tailTree müssenimplementiert werden

Christoph Forster, Thomas Kresalek 34/53 Vortrag

Page 52: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Empty

Empty

empty :: (Ord a) => Stree a -> Boolempty Null = Trueempty (Fork xt y yt) = False

Christoph Forster, Thomas Kresalek 35/53 Vortrag

Page 53: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Head und Tail eines Baums

Head und Tail{- Head -}headTree :: (Ord a) => Stree a -> aheadTree = fst . splittree{- Tail -}tailTree :: (Ord a) => Stree a -> Stree atailTree = snd . splitTree

splitTree

splitTree :: (Ord a) => Stree a -> (a,Stree a)splitTree (Fork xt y yt) =

if empty xtthen (y,yt)else (x, Fork wt y yt)

where (x,wt) = splitTree xt

Christoph Forster, Thomas Kresalek 36/53 Vortrag

Page 54: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen: Join-Optimierung

Joinjoin’ :: (Ord a) => Stree a -> Stree a -> Stree ajoin’ xt yt =

if empty ytthen xt elseFork xt headOfTree tailOfTree

where (headOfTree,tailOfTree) = splitTree yt

⇒ splitTree wird nur einmal aufgerufen.

Christoph Forster, Thomas Kresalek 37/53 Vortrag

Page 55: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Operationen

Verarbeitung mit map

{- Map für den Binären Suchbaum -}

mapStree :: (a -> b) -> Stree a -> Stree bmapStree f Null = NullmapStree f (Fork xt x yt) =

Fork (mapBtree f xt) (f x) (mapBtree f yt)

Analog zur Implementierung für Btree

Christoph Forster, Thomas Kresalek 38/53 Vortrag

Page 56: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Kontrollstrukturen

foldfoldStree :: (Ord a) => (a -> b) -> (b -> b -> b

-> b) -> b -> Stree a -> bfoldStree f g v Null = vfoldStree f g v (Fork xt x yt) =

g (foldStree f g v xt)(f x) (foldStree f g v yt)

Christoph Forster, Thomas Kresalek 39/53 Vortrag

Page 57: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Kontrollstrukturen

Nutzung von fold für Operationen

{- Höhe -}heightST’ :: (Ord a) => STree a -> IntegerheightST’ =

foldSTree (const 1) (\ x y z -> (max x z) + y) 0

{- 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

Page 58: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Kontrollstrukturen

FoldStree nicht direkt für member, insert unddelete einsetzbarallerdings auch hier StrukturübereinstimmungenSchaffung einer weiteren Kontrollstruktur sinnvoll?

Christoph Forster, Thomas Kresalek 41/53 Vortrag

Page 59: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Kontrollstrukturen

Erweitertes foldfoldSTree2 :: 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 yfoldStree2 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 42/53 Vortrag

Page 60: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Kontrollstrukturen

Nutzung des erweiterten fold

member’ :: (Ord a) => a -> Stree a -> Boolmember’ = foldStree2 (\ x y z -> True) (\ x y z -> x)

(\ x y z -> z) (\ x -> False)

insert’ :: (Ord a) => a -> Stree a -> Stree ainsert’ = foldStree2 (\ 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 -> Stree a -> Stree adelete’ = foldStree2 (\ xt y yt -> join’ xt yt)

(\ xt x yt -> Fork xt x yt)(\ xt x yt -> Fork xt x yt)(\ x -> Null)

Christoph Forster, Thomas Kresalek 43/53 Vortrag

Page 61: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Datenstruktur &Eigenschaften

Operationen

Kontrollstrukturen

Rose Trees

Zusammenfassung &Ausblick

Kontrollstrukturen

Nutzung des erweiterten fold

buildFork xt x yt = Fork xt x yt

insert’’ :: (Ord a) => a -> Stree a -> Stree ainsert’’ = foldSTree2 buildFork

buildForkbuildFork(\ x -> Fork Null x Null)

delete’’ :: (Ord a) => a -> Stree a -> Stree adelete’’ = foldSTree2 (\ xt y yt -> join’ xt yt)

buildForkbuildFork(\ x -> Null)

Christoph Forster, Thomas Kresalek 44/53 Vortrag

Page 62: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Agenda

1 Einleitung

2 Binäre Bäume

3 Binäre Suchbäume

4 Rose TreesDatenstrukturOperationenKontrollstruktur

5 Zusammenfassung & Ausblick

Christoph Forster, Thomas Kresalek 45/53 Vortrag

Page 63: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Rose Trees

Angelehnt an Verzweigungen des RhododendronBusches

Christoph Forster, Thomas Kresalek 46/53 Vortrag

Page 64: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Datenstruktur

Rose Tree

Definition: Datentyp

{- Datenstruktur Rose Trees -}

data Rose a = Node a [Rose a]

Allgemeiner definiertBeliebig viele KinderBinäre Bäume ≡ Rose Tree 2. OrdnungBlätter sind durch leere Listen dargestellt

Christoph Forster, Thomas Kresalek 47/53 Vortrag

Page 65: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Datenstruktur

Unendliche Bäume

Beispiel

{- Unendlicher Rose Tree -}

Node 0 [ Node n [] | n <- [1..]]

0

1 2 3 4 . . .

Spezielle Verarbeitung notwendig (breath-first)Analogon zu unendlichen ListenIm Folgenden: Endliche Rose Trees

Christoph Forster, Thomas Kresalek 48/53 Vortrag

Page 66: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Datenstruktur

Unendliche Bäume

Beispiel

{- Unendlicher Rose Tree -}

Node 0 [ Node n [] | n <- [1..]]

0

1 2 3 4 . . .

Spezielle Verarbeitung notwendig (breath-first)Analogon zu unendlichen ListenIm Folgenden: Endliche Rose Trees

Christoph Forster, Thomas Kresalek 48/53 Vortrag

Page 67: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Wichtige Maße eines Baumes

{- Anzahl der Elemente -}

size :: Rose a -> Intsize (Node x xts) = 1 + sum (map size xts)

{- Höhe des Baums -}

height :: Rose a -> Intheight (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

Page 68: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Wichtige Maße eines Baumes

{- Anzahl der Elemente -}

size :: Rose a -> Intsize (Node x xts) = 1 + sum (map size xts)

{- Höhe des Baums -}

height :: Rose a -> Intheight (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

Page 69: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Wichtige Maße eines Baumes

{- Anzahl der Elemente -}

size :: Rose a -> Intsize (Node x xts) = 1 + sum (map size xts)

{- Höhe des Baums -}

height :: Rose a -> Intheight (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

Page 70: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Plätten eines Rosenbaumes{- Plätten des Baums -}

flatten :: Rose a -> [a]flatten (Node x xts) = x:concat(map flatten xts)

Plätten nur bei endlichen Bäumen (depth-first)Plätten effizient O(n log n)Reihenfolge?

5

2

1 3

7

6 8

. . .

Zuerst Knoten, dannKinder von Links nachRechts⇒5,2,1,3,7,6,8

Christoph Forster, Thomas Kresalek 50/53 Vortrag

Page 71: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Plätten eines Rosenbaumes{- Plätten des Baums -}

flatten :: Rose a -> [a]flatten (Node x xts) = x:concat(map flatten xts)

Plätten nur bei endlichen Bäumen (depth-first)Plätten effizient O(n log n)Reihenfolge?

5

2

1 3

7

6 8

. . .

Zuerst Knoten, dannKinder von Links nachRechts⇒5,2,1,3,7,6,8

Christoph Forster, Thomas Kresalek 50/53 Vortrag

Page 72: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Plätten eines Rosenbaumes{- Plätten des Baums -}

flatten :: Rose a -> [a]flatten (Node x xts) = x:concat(map flatten xts)

Plätten nur bei endlichen Bäumen (depth-first)Plätten effizient O(n log n)Reihenfolge?

5

2

1 3

7

6 8

. . .

Zuerst Knoten, dannKinder von Links nachRechts⇒5,2,1,3,7,6,8

Christoph Forster, Thomas Kresalek 50/53 Vortrag

Page 73: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Operationen

Plätten eines Rosenbaumes{- Plätten des Baums -}

flatten :: Rose a -> [a]flatten (Node x xts) = x:concat(map flatten xts)

Plätten nur bei endlichen Bäumen (depth-first)Plätten effizient O(n log n)Reihenfolge?

5

2

1 3

7

6 8

. . .

Zuerst Knoten, dannKinder von Links nachRechts⇒5,2,1,3,7,6,8

Christoph Forster, Thomas Kresalek 50/53 Vortrag

Page 74: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Kontrollstruktur

Kontrollstruktur fold{- Fold für den Rosenbaum -}

foldRose :: (a -> [b] -> b) -> Rose a -> bfoldRose f (Node x xts) = f x (map (foldRose f) xts)

Element Verarbeitung mit map

{- map für den Rosenbaum -}

mapRose :: (a -> b) -> Rose a -> Rose bmapRose f = foldRose (Node . f)

Christoph Forster, Thomas Kresalek 51/53 Vortrag

Page 75: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Kontrollstruktur

Kontrollstruktur fold{- Fold für den Rosenbaum -}

foldRose :: (a -> [b] -> b) -> Rose a -> bfoldRose f (Node x xts) = f x (map (foldRose f) xts)

Element Verarbeitung mit map

{- map für den Rosenbaum -}

mapRose :: (a -> b) -> Rose a -> Rose bmapRose f = foldRose (Node . f)

Christoph Forster, Thomas Kresalek 51/53 Vortrag

Page 76: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Kontrollstruktur

Beispiele mit fold

{- Größe eines Rosenbaums -}

size :: Rose a -> Intsize = foldRose f

where f x ns = 1 + sum ns

{- Maximum eines Rosenbaumes -}

maxRose :: (Ord a, Num a) => Rose a -> amaxRose = foldRose f

where f x ns = x ‘max‘ maxlist nsmaxlist = 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

Page 77: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Kontrollstruktur

Beispiele mit fold

{- Größe eines Rosenbaums -}

size :: Rose a -> Intsize = foldRose f

where f x ns = 1 + sum ns

{- Maximum eines Rosenbaumes -}

maxRose :: (Ord a, Num a) => Rose a -> amaxRose = foldRose f

where f x ns = x ‘max‘ maxlist nsmaxlist = 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

Page 78: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Datenstruktur

Operationen

Kontrollstruktur

Zusammenfassung &Ausblick

Kontrollstruktur

Beispiele mit fold

{- Größe eines Rosenbaums -}

size :: Rose a -> Intsize = foldRose f

where f x ns = 1 + sum ns

{- Maximum eines Rosenbaumes -}

maxRose :: (Ord a, Num a) => Rose a -> amaxRose = foldRose f

where f x ns = x ‘max‘ maxlist nsmaxlist = 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

Page 79: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Agenda

1 Einleitung

2 Binäre Bäume

3 Binäre Suchbäume

4 Rose Trees

5 Zusammenfassung & Ausblick

Christoph Forster, Thomas Kresalek 53/53 Vortrag

Page 80: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Zusammenfassung & Ausblick

Bäume3 1/2 verschiedene Spezialfälle

Binäre Bäume (Btrees / Atrees)Binäre Suchbäume (Strees)N-äre Bäume (Rose trees)

DatenstrukturenOperationenKontrollstrukturen

Christoph Forster, Thomas Kresalek 54/53 Vortrag

Page 81: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Zusammenfassung & Ausblick

Bäume3 1/2 verschiedene Spezialfälle

Binäre Bäume (Btrees / Atrees)Binäre Suchbäume (Strees)N-äre Bäume (Rose trees)

DatenstrukturenOperationenKontrollstrukturen

Christoph Forster, Thomas Kresalek 54/53 Vortrag

Page 82: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Zusammenfassung

BäumeAusblick

Binäre Halden

AnwendungsfälleMerteens’ numberHuffman trees

Christoph Forster, Thomas Kresalek 55/53 Vortrag

Page 83: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Zusammenfassung

BäumeAusblick

Binäre HaldenAnwendungsfälle

Merteens’ numberHuffman trees

Christoph Forster, Thomas Kresalek 55/53 Vortrag

Page 84: Bäume in Haskell - Vortrag - FH Wedelsi/vorlesungen/fp/handouts/vortraege/ws2009/... · data Btree a = Leaf a | Fork (Btree a ) (Btree a) Hier zunächst einfachste Art: Daten in

Haskell Bäume

Einleitung

Binäre Bäume

Binäre Suchbäume

Rose Trees

Zusammenfassung &Ausblick

Fragen?

Vielen Dank für die Aufmerksamkeit!

Christoph Forster, Thomas Kresalek 56/53 Vortrag