Algorithmen und Datenstrukturen

Werbung
Was bisher geschah
rekursive Datenstrukturen:
I lineare Datenstrukturen:
I
I
I
I
verkettete Liste
Stack
Queue
hierarchische Datenstrukturen: Bäume
I
I
I
allgemeine Bäume
Binäre Bäume
Unäre Bäume = Listen
110
ADT Binärbaum
mit Knotenmarkierungen vom Typ Element
I
Sorten: Bool, El, BTree
I
Signatur:
⊥:
isEmpty :
BTree →
Node : El × BTree × BTree →
Left, Right :
BTree →
Val :
BTree →
t, f :
I
BTree
Bool
BTree
BTree
El
Bool
Axiome: ∀v ∈ El ∀t1 ∈ BTree ∀t2 ∈ BTree
isEmpty(⊥) :
= t
isEmpty(Node(v , t1 , t2 )) :
= f
Left(Node(v , t1 , t2 )) :
= t1
Right(Node(v , t1 , t2 )) :
= t2
Val(Node(v , t1 , t2 )) :
= v
111
Binäre Suchbäume
Binärer Baum t hat die Suchbaum-Eigenschaft gdw.
für jeden Teilbaum t 0 = node(v , l, r ) von t gilt:
I
für jeden Schlüsselwert v 0 eines inneren Knotens von l gilt
v0 ≤ v
I
für jeden Schlüsselwert v 0 eines inneren Knotens von r gilt
v ≤ v0
Ergebnis der Inorder-Durchquerung jedes binären
Suchbaumes ist eine aufsteigend sortierte Folge
Sortierte Ausgabe aller im Suchbaum mit n Knoten enthaltenen
Daten in O(n)
112
Suche in binären Suchbäumen
Spezifikation:
gegeben: binärer Suchbaum t (Wurzel)
Schlüsselwert x
gesucht: Knoten t 0 in t mit Val(t 0 ) = x,
⊥, falls t keinen Knoten mit dem Schlüsselwert x enthält
find(t,x):
if isEmpty(t) or if x = Val(t)
return x
else
if x < Val(t)
return find(Left(t), x)
else
return find(Right(t), x)
113
Laufzeit der Suche
Laufzeit von find(t,x) abhängig von
Anzahl n der Knoten in t:
I
falls t einen Knoten t 0 mit Val(t 0 ) = x enthält:
Tiefe des Knotens t 0
I
falls t keine Knoten t 0 mit Val(t 0 ) = x enthält:
Tiefe des Baumes t 0
höchstens Höhe des Baumes t (log n ≤ hoehe(t) ≤ n)
Suche im Suchbaum t in O(hoehe(t))
(i.A. schneller als lineare Suche in einer Folge)
114
Anwendung von Suchbäumen
Binäre Suchbäume sind geeignet zum Speichern und
schnellen Wiederfinden von Daten anhand ihnen zugeordneten
Schlüsselwerten
Binäre Suchbäume:
I
Implementierung des ADT Menge für linear geordnete
Mengen
I
Implementierung von Wörterbüchern:
Daten mit zugeordnetem Schlüsselwert (aus einer linear
geordneten Menge)
Operationen: find, insert, remove
z.B. Telefonbucheinträge über Namen (alphabetisch
geordnet), Studenten über Studentennummern
115
Extremwerte in binären Suchbäumen
Spezifikation:
gegeben: binärer Suchbaum t (Wurzel)
gesucht: Knoten in t mit dem minimalen Schlüsselwert,
d.h. Knoten s, wobei für jeden Knoten r gilt Val(s) ≤ Val(r)
⊥, falls t = ⊥
Minimaler Schlüsselwert binären Suchbaum steht im äußeren linken
Knoten
minimum(t):
if isEmpty(t)
return Nil
else
if Left(t) = Nil
return t
else
return minimum(Left(t))
Minimum lässt sich ohne Schlüsselvergleich bestimmen.
Laufzeit höchstens Höhe des Baumes t (log n ≤ hoehe(t) ≤ n)
Minimum-Suche im Suchbaum mit n Knoten in O(hoehe(t))
Maximum analog
116
Einfügen in binäre Suchbäume
Spezifikation:
gegeben: binärer Suchbaum t mit den Schlüsseln {x1 , . . . , xn }
Schlüsselwert x
gesucht: binärer Suchbaum t 0 mit den Schlüsseln {x1 , . . . , xn , x}
insert(t,x):
if isEmpty(t)
return Node(x,Nil,Nil)
else
if x < Val(t)
return insert (Left(t),x)
else
return insert (Right(t),x)
117
Iteriertes Einfügen
Beim Einfügen der Elemente der Menge {2, 3, 5, 7} in
verschiedenen Reihenfolgen entstehen i.A. veschiedene
Bäume
Beispiel (Tafel):
I
3,7,5,2
I
5,3,7,2
I
2,3,5,7
Sortieren durch Einfügen in binären Suchbaum
1. schrittweises Einfügen aller Elemente einer Menge in
einen zu Beginn leeren binären Suchbaum
2. Sortierte Ausgabe durch Inorder-Durchquerung des so
entstandenen binären Suchbaumes
118
Laufzeit Einfügen
Idee: neues Blatt mit Schlüsselwert x wird dort eingefügt, wo es
der Suchalgorithmus finden würde
selbe Laufzeit wie Suche:
höchstens Höhe des Baumes t (log n ≤ hoehe(t) ≤ n)
Einfügen in einen binären Suchbaum mit n Knoten in
O(hoehe(t))
119
Löschen aus binären Suchbäumen
Spezifikation:
gegeben: binärer Suchbaum t mit den Schlüsseln {x1 , . . . , xn }
Schlüsselwert x
gesucht: binärer Suchbaum t 0 mit den Schlüsseln {x1 , . . . , xn } \ {x}
Idee: Fälle
1. x kommt nicht in t vor: Ergebnis t 0 = t
2. x ist Schlüsselwert eines Knotens s in t mit zwei leeren Kindern:
Löschen des Knotens s (Ersetzen durch ⊥)
3. x ist Schlüsselwert eines Knotens s in t mit einem leeren Kind:
Ersetzen des Knotens s durch sein einziges nichtleeres Kind
4. x ist Schlüsselwert eines Knotens s in t ohne leeres Kind:
Tausch der Schlüsselwerte in s und dem linken äußeren Knoten
r des rechten Kindes von s
Löschen des Knotens r
Warum hat der so entstandene Baum die Suchbaumeigenschaft?
Löschen eines Knotens aus einem binären Suchbaum t in
O(hoehe(t))
120
Laufzeiten
I
find
I
insert
I
remove
in O(hoehe(t))
Laufzeiten in Abhängigkeit von der Knotenzahl n = size(t):
Extremfälle:
I
für Pfade (entartete Bäume) hoehe(t) = size(t)
Laufzeit der Operationen O(n)
I
für balancierte Bäume hoehe(t) = log size(t)
Laufzeit der Operationen O(log n)
121
Herunterladen