Kap. 4.2: Binäre Suchbäume Ankündigung Mentoring Motivation

Werbung
Ankündigung Mentoring
Kap. 4.2: Binäre Suchbäume
Professor Dr. Petra Mutzel /
Carsten Gutwenger
Lehrstuhl für Algorithm Engineering, LS11
Fakultät für Informatik, TU Dortmund
11. VO
DAP2
SS 2008
Petra Mutzel
20. Mai 2008
DAP2 SS08
1
Motivation
Mi, 21. Mai, ab 12:30 Uhr, in E23 (OH14)
• Vorstellung Nebenfach
Rehabilitationstechnologie (Schaten)
• Wirtschaftswissenschaften als
Anwendungs- und Nebenfach (Donato)
• Dann ab 14:30 Uhr: Studentische
Studienberatung (3x30 Minuten pro
Studierende/r, jedes NB ein Raum,
also 3 NF/Stud. machbar)
• bei Überschneidung mit DAP2-Übungsgruppe:
nach vorheriger Email an ÜG-Leiter/in befreit
Binäre Suchbäume
„Warum soll ich heute hier bleiben?“
• Datenstruktur zur Unterstützung der
Operationen des ADT Dictionary:
Binäre Suchbäume begegnen Ihnen ständig!
„Warum soll mich das interessieren?“
Beliebte Klausuraufgaben!
Petra Mutzel
DAP2 SS08
3
• INSERT(K k,V v)
– Falls k nicht schon in D ist, dann wird ein neuer
Schlüssel k mit Wert v in D eingefügt, andernfalls
wird der Wert des Schlüssels k auf v geändert.
4
• MINIMUM (MAXIMUM)
– Sucht den Schlüssel mit kleinstem (größtem)
Wert.
• DELETE(K k)
– Entfernt Schlüssel k mit Wert aus D (falls k in D)
• PREDECESSOR (SUCCESSOR)
– Ausgehend von einem gegebenen Element
suchen wir das Element mit dem nächstkleineren
(nächstgrößeren) Schlüssel.
• SEARCH(K k): V
– Gibt den bei Schlüssel k gespeicherten Wert
zurück (falls k in D)
DAP2 SS08
DAP2 SS08
Zusätzliche Operationen der
Binären Suchbäume
Operationen des ADT Dictionary
Petra Mutzel
Petra Mutzel
5
Petra Mutzel
DAP2 SS08
6
1
Worst CaseDefinitionen
Analyse von BinarySearch
Überblick
•
Gewurzelter Baum (rekursiv):
– entweder leer oder
• Bezeichnungen
– Knoten (Wurzel) mit Verweisen auf mehrere
gewurzelte Bäume (Teilbäume)
• Traversierungen für binäre Bäume
• Implementierungen
• Analyse
Petra Mutzel
DAP2 SS08
•
Kind von Knoten v: Wurzelknoten eines nichtleeren Teilbaums von v
•
Blatt: Knoten ohne Kinder
7
Petra Mutzel
Worst Case Analyse
von BinarySearch
Bezeichnungen:
Gewurzelte
Bäume
linker
Unterbaum
von 5
•
3
7
4
2
Wurzel
Kanten
5
innere
Knoten
Knoten
8
linker
Unterbaum
von 5
Blätter: Knoten
ohne Kinder
Tiefe d(v): # der Elter-Knoten bis Wurzel (inkl.)
• 3 ist Wurzel des linken Unterbaums von 5
• 3 ist Elter von 2, 3 ist Elter von 4
• 2 ist linkes Kind von 3, 4 ist rechtes Kind von 3
•
Wurzel
linker
Unterbaum
von 5
5
3
2
4
h(T3)=1
d(3)=1
h(T8)=0
d(8)=2
7 d(Wurzel)=0 h(TWurzel)=2
8
Blätter: Knoten
ohne Kinder
Nachfolger(v): Menge aller Knoten im
Unterbaum mit Wurzel v
Höhe h(Tr) eines (Teil-)baumes Tr mit Wurzel r:
max { d(v): v ist Knoten in Tr }
5
3
2
4
d(3)=1
d(8)=2
7 d(Wurzel)=0
8
Blätter: Knoten
ohne Kinder
Tiefe d(v): # der Elter-Knoten bis Wurzel (inkl.)
Ebene: Menge aller Knoten mit gleicher Tiefe
Worst Case
Analyse von BinarySearch
Bezeichnungen
innere
Knoten
8
Worst Case
Analyse von BinarySearch
Bezeichnungen
Wurzel
innere
Knoten
DAP2 SS08
WorstWeitere
Case Analyse
von BinarySearch
Definitionen
•
Ein gewurzelter Baum heißt geordnet, wenn die
Reihenfolge der Kinder festgelegt ist
•
Ein binärer gewurzelter Baum ist ein gewurzelter
Baum, bei dem jeder Knoten genau zwei
Kindzeiger hat.
•
Ein geordneter gewurzelter binärer Baum
unterscheidet also zwischen linkem und rechtem
Kind bzw. linkem und rechtem Unterbaum.
•
Ein binärer Baum heißt vollständig, wenn alle
Blätter die gleiche Tiefe haben.
Petra Mutzel
DAP2 SS08
12
2
Worst
CaseBinärer
Analyse von
BinarySearch
Def.
Suchbaum
•
Ein binärer Suchbaum ist ein binärer
geordneter Baum, dessen Knoten einen
Suchschlüssel als Datum enthalten, und
der die Suchbaumeigenschaft erfüllt:
•
Suchbaumeigenschaft: Enthält ein Knoten
den Schlüssel x, so sind alle Schlüssel in
seinem linken Unterbaum kleiner als x und
alle Schlüssel im rechten Unterbaum
größer als x.
Worst
Case Analyse von
BinarySearch
Implementierung
binärer
Bäume
•
•
Achtung: alle Schlüssel verschieden
Petra Mutzel
DAP2 SS08
•
•
DAP2 SS08
Ausgabe von p
(5)
INORDER(p.right)
Level-Order-Traversierung: Durchsuche
zunächst alle Ebenen von links nach rechts,
wobei die Ebenen von oben nach unten
besucht werden.
•
Die wichtigste Traversierungsordnung für
binäre Suchbäume ist die InorderTraversierung, weil dabei die Schlüssel
aufsteigend sortiert durchlaufen werden.
Petra Mutzel
•
•
•
•
•
•
•
•
(2) if p ≠ NULL {
(4)
14
DAP2 SS08
16
Worst
Casefür
Analyse
von BinarySearch
Beispiel
INORDER-Aufruf
(1) Procedure INORDER(p)
INORDER(p.left)
DAP2 SS08
•
15
Inorder-Traversierung
(3)
Petra Mutzel
Worst
Case Analyse
vonbinäre
BinarySearch
Traversierungen
für
Bäume
Inorder-Traversierung: Durchsuche rekursiv
zunächst den linken Unterbaum, dann die
Wurzel, durchsuche dann den rechten
Unterbaum.
Preorder-Traversierung: Besuche zuerst die
Wurzel, durchsuche dann rekursiv den linken
Unterbaum, dann den rechten.
Postorder-Traversierung: Durchsuche
rekursiv zunächst den linken Unterbaum,
durchsuche dann rekursiv den rechten
Unterbaum, besuche dann die Wurzel.
Petra Mutzel
Zugriff auf den Baum erfolgt über seinen
Wurzelknoten root
13
Worst
Case Analysefür
vonbinäre
BinarySearch
Traversierungen
Bäume
•
Realisierung als verallgemeinerte Listen mit
bis zu zwei Nachfolgern:
– x.key: Schlüssel von Knoten x
– x.info: zum Schlüssel zu speichernde Daten
– x.parent: Elter von Knoten x
– x.left: linkes Kind von Knoten x
– x.right: rechtes Kind von Knoten x
(6) }
INORDER(5)
INORDER(2)
Ausgabe von „2“
INORDER(1)
Ausgabe von „1“
Ausgabe von „5“
INORDER(3)
Ausgabe von „3“
5
2
3
1
Aufruf: INORDER(root)
Inorder: 2,1,5,3
Beispiel Inorder-Traversierung (s. Skript)
Petra Mutzel
DAP2 SS08
17
Petra Mutzel
DAP2 SS08
18
3
Inorder-Traversierung
Pre
Inorder-Traversierung
Post
(1) Procedure INORDER(p)
PREORDER(p)
(1) Procedure INORDER(p)
POSTORDER(p)
(2) if p ≠ NULL {
(2) if p ≠ NULL {
(3)
INORDER(p.left)
INORDER(p.left)
(3)
INORDER(p.left)
POSTORDER(p.left)
(4)
Ausgabe
PREORDER(p.left)
Ausgabe von
von pp
(4)
Ausgabe
von
p p
Ausgabe
POSTORDER(p.right)
von
(5)
INORDER(p.right)
PREORDER(p.right)
(5)
INORDER(p.right)
INORDER(p.right)
(6) }
(6) }
Petra Mutzel
DAP2 SS08
19
Aus Inorder-Traversierung und PreorderTraversierungsreihenfolge kann der binäre
Baum eindeutig rekonstruiert werden, wenn er
lauter verschiedene Schlüssel enthält.
•
•
1.
•
Dies gilt nicht, wenn lediglich Preorder- und
Postorder-Reihenfolge gegeben sind.
5
5
Beispiel:
2
1
3
2
3
1
Petra Mutzel
Preorder: 5,2,1,3
Postorder: 1,2,3,5
DAP2 SS08
Finde die Position im Baum mit Wurzel r, an
der s gespeichert ist (bzw. sein müßte):
Idee: nutze Suchbaumeigenschaft:
Vergleiche s mit dem Schlüssel s´ an der
Wurzel (des Teilbaums)
Falls gefunden: STOP!
Sonst: Falls s < s´: suche im linken Teilbaum
Sonst: suche im rechten Teilbaum
Gehe zu 1.
Pseudocode s. Skript
Ausgabe: nicht gefunden!
Petra Mutzel
DAP2 SS08
22
in binären Suchbäumen
•
1.
2.
3.
4.
1. Suche nach q.key → Suche endet mit der
Position eines leeren Unterbaums
2. Einfügen von q an diese Position
5.
Pseudocode s. Skript
DAP2 SS08
20
Implementierung
Worst
Case Analysevon
von DELETE(r,s)
BinarySearch
Einfügen eines Knotens q in den Baum mit
Wurzel r
Petra Mutzel
2.
3.
4.
5.
6.
21
Implementierung
Worst Case Analysevon
vonINSERT(r,q)
BinarySearch
in binären Suchbäumen
•
DAP2 SS08
Implementierung
Worst Case Analysevon
vonSEARCH(r,s)
BinarySearch
in binären Suchbäumen
Worst
Case Analysefür
vonbinäre
BinarySearch
Traversierungen
Bäume
•
Petra Mutzel
23
Entfernt Knoten nit Schlüssel s im Baum mit
Wurzel r
Pseudocode s. Skript
Suche nach s → Suche endet an Knoten v
Falls v≠NULL, dann
Falls v keine Kinder besitzt, dann: streiche v
Falls v genau ein Kind hat: ändere 2 Zeiger
(„herausschneiden“)
Falls v zwei Kinder hat, dann hat y:=Successor(v)
kein linkes Kind (warum??): Herausschneiden
bzw. Entfernen von y und Ersetzen von v durch y.
Petra Mutzel
DAP2 SS08
24
4
Worst
Case Analyse
von BinarySearch
Beispiel
für DELETE(r,s)
Worst
Case Analyse
von BinarySearch
Beispiel
für DELETE(r,s)
15
15
5
16
20
12
3
5
Fall 1:
v ist Blatt
23
6
7
7
Petra Mutzel
DAP2 SS08
25
Worst
Case Analyse
von BinarySearch
Beispiel
für DELETE(r,s)
5
20
5
26
10
Successor(v): 6
16
20
12
3
23
13 18
10
DAP2 SS08
15
Fall 3: v hat
genau 2 Kinder
16
12
3
Petra Mutzel
Worst
Case Analyse
von BinarySearch
Beispiel
für DELETE(r,s)
15
Fall 3: v hat
genau 2 Kinder
13 18
23
Successor(q): 6
7
7
Petra Mutzel
DAP2 SS08
27
Worst Case
Analyse von BinarySearch
Successor-Suche
5
16
•
13 18
23
6
7
Petra Mutzel
DAP2 SS08
DAP2 SS08
28
Gibt den Nachfolger von Knoten p in der
Inorder-Durchmusterungsreihenfolge aus
1. Falls p rechtes Kind hat: Return
Minimum(p.right)
2. Sonst: Falls p linkes Kind ist: Return(p.parent)
3. Sonst: wandere solange nach oben bis der
aktuelle Knoten zum ersten Mal linkes Kind ist;
dann: Return(p.parent)
4. oder die Wurzel erreicht ist; dann: existiert kein
Nachfolger.
Pseudocode s. Skript
20
12
Petra Mutzel
Worst Case Analyse
BinarySearch
Implementierung
von von
SUCCESSOR(r,p)
Successor(5) = 6
Successor(12) =13
Successor(13) =15
15
10
20
13 18
10
6
3
16
12
3
23
13 18
10
Fall 2: v hat
genau ein Kind
29
Petra Mutzel
DAP2 SS08
30
5
Abhängigkeit
von
Worst
Case Analyseder
von Höhe
BinarySearch
Worst
Case Analyse
von BinarySearch
Analyse
der Operationen
der Einfügereihenfolge
Einfügereihenfolge: 1,3,4,6,8,9
1. Alle Operationen benötigen eine Laufzeit von
O(h(T)) für binäre Suchbäume, wobei h(T) die
Höhe des gegebenen Suchbaumes T ist.
1
Baum ist zu linearer Liste degeneriert
Problem: Suchzeit ist linear,
da h(T)=n-1
3
4
Einfügereihenfolge: 6,8,3,4,1,9
3
1
Petra Mutzel
DAP2 SS08
31
•
•
•
•
Ein binärer Suchbaum T kann im Extremfall zu
einer linearen Liste ausarten (z.B. Einfügereihenfolge sortiert).
Dann dauert die erfolglose Suche Θ(h(T))=Θ(n)
Der andere Extremfall sind vollständig
balancierte Bäume (d.h. alle Ebenen bis auf evtl.
die unterste sind voll besetzt); diese haben die
Höhe h(T)=Θ(log n).
Hier dauert die erfolglose Suche Θ(h(T))=Θ(log(n))
Wir werden sehen: für dieses gute Zeitverhalten
genügen auch „hinreichend“ balancierte Bäume
33
8
8
4
9
9
Petra Mutzel
Diskussion
•
6
6
Frage: Wie hoch kann h(T) für einen binären
Suchbaum mit n Knoten sein?
DAP2 SS08
32
32
Durchschnittliche Suchpfadlänge
Man kann zeigen:
• Die erwartete Suchpfadlänge (über alle
möglichen Permutationen von n
Einfügeoperationen) ist
I(n)=2 ln n - O(1) = 1.38629…log n-O(1)
•
D.h. für große n ist die durchschnittliche
Suchpfadlänge nur ca. 38% länger als im
Idealfall.
•
Allerdings ist diese Annahme, dass die Daten in einer
zufälligen Reihenfolge eingegeben werden, in vielen
Anwendungen nicht gerechtfertigt.
Lösung: Balancierte Suchbäume, s. nächste VO
34
6
Herunterladen