Bäume - FH Wedel

Werbung
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
Herunterladen