Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap!...

121
Binäre Suchbäume Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Transcript of Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap!...

Page 1: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume

Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Page 2: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen

n  Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen:

Page 3: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen

n  Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n  Einfügen eines Elements n  Löschen eines Elements

Page 4: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen

n  Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n  Einfügen eines Elements n  Löschen eines Elements n  Suchen eines Elements

Page 5: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen

n  Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: n  Einfügen eines Elements n  Löschen eines Elements n  Suchen eines Elements

n  Anforderung: effizient auch bei grossen Mengen!

Page 6: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Anwendungen (I)

n  Telefonbuch (Menge von Namen mit zugehörigen Telefonnummern) n  Einfügen: Neue Telefonanschlüsse n  Löschen: Aufgegebene Telefonanschlüsse n  Suchen: Telefonnummer einer Person

Page 7: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Anwendungen (II)

n  Nutzerverwaltung (Menge von Nutzern mit Passwörtern und/oder weiteren Informationen) n  Einfügen: Neue Nutzer n  Löschen: Ex-Nutzer n  Suchen: Einloggen

Page 8: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Anwendungen (II)

n  Nutzerverwaltung (Menge von Nutzern mit Passwörtern und/oder weiteren Informationen) n  Einfügen: Neue Nutzer n  Löschen: Ex-Nutzer n  Suchen: Einloggen

n  Effizienz: Keine Wartezeit beim Ein-loggen, auch bei Millionen von Nutzern.

Page 9: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Menge wird als Liste gespeichert.

1

5 6 9 7

0

3

8

Page 10: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Menge wird als Liste gespeichert. n  Einfügen: zum Beispiel vorne anfügen

(effizient)

1

5 6 9 7

0

3

8

2

Page 11: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Menge wird als Liste gespeichert. n  Einfügen: zum Beispiel vorne anfügen

(effizient)

1

5 6 9 7

0

3

8

2

Page 12: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Menge wird als Liste gespeichert. n  Löschen: Durchlaufen der Liste bis zum

Element (oder bis zum Ende, falls nicht vorhanden), Zeiger umhängen.

1

5 6 9 7

0

3

8

2

Page 13: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Menge wird als Liste gespeichert. n  Suchen: Durchlaufen der Liste bis zum

Element (oder bis zum Ende, falls nicht vorhanden).

1

5 6 9 7

0

3

8

2

Page 14: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-portional zu n.

Page 15: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-portional zu n.

n  Facebook: Zeit zum Einloggen wäre proportional zur Anzahl der Nutzer.

Page 16: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen

Page 17: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen

List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for the 100 first ones for (int i=0; i<100; ++i) l.find(i);

Page 18: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen

List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for the 100 first ones for (int i=0; i<100; ++i) l.find(i); 6.5 Sekunden

Page 19: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen

List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for the 100 first ones for (int i=0; i<100; ++i) l.find(i); 6.5 Sekunden

Facebook hat 1,000,000,000 Nutzer, eine Suche würde 6.5 Sekunden dauern!

Page 20: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Listen

n  Beispiel: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen

n  Finden eines Elements: const Node* List::find (int key) { for (const Node* p = head_; p != 0; p = p>get_next()) if (p->get_key() == key) return p; return 0; }

Page 21: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Binären Suchbäumen.

n  Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-portional zu log2 n.

n  Facebook: Zeit zum Einloggen ist proportional zum Logarithmus der Anzahl der Nutzer.

Page 22: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Binären Suchbäumen.

n  Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-portional zu log2 n.

n  Facebook: Zeit zum Einloggen ist proportional zum Logarithmus der Anzahl der Nutzer.

log2(1,000,000,000) ≈ 30.

Page 23: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Binären Suchbäumen.

n  Falls die Menge n Elemente enthält, so ist der Aufwand fürs Suchen eines Elements im schlimmsten Fall pro-portional zu log2 n.

n  Auch Einfügen und Löschen geht in Zeit proportional to log2 n.

Page 24: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binärbäume, Definition und Terminologie

n  Ein binärer Baum ist entweder leer,...

Page 25: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binärbäume, Definition und Terminologie

n  Ein binärer Baum ist entweder leer,... n  oder er besteht aus einem Knoten

(Kreis) n  mit einem Schlüssel (hier: ganze Zahl),...

3

Page 26: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binärbäume, Definition und Terminologie

n  Ein binärer Baum ist entweder leer,... n  oder er besteht aus einem Knoten

(Kreis) n  mit einem Schlüssel (hier: ganze Zahl),... n  und einem linken und rechten

Teilbaum, die jeweils Binärbäume sind. 3

Page 27: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binärbäume, Definition und Terminologie

n  Ein binärer Baum ist entweder leer,... n  oder er besteht aus einem Knoten

(Kreis) n  mit einem Schlüssel (hier: ganze Zahl),... n  und einem linken und rechten

Teilbaum, die jeweils Binärbäume sind. 3

Rechter Teilbaum Linker Teilbaum

Wurzel des Baums

Page 28: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume

n  Ein Binärbaum heisst binärer Suchbaum, wenn er leer ist, oder wenn folgende Bedingungen gelten: n  Sowohl der linke als auch der rechte

Teilbaum sind binäre Suchbäume. n  Der Schlüssel der Wurzel ist

n  > alle Schlüssel im linken Teilbaum, und n  ≦ alle Schlüssel im rechten Teilbaum.

Page 29: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Beispiel

4

3 8

6 9

7 5

1

2

Page 30: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Beispiel

4

3 8

6 9

7 5

1

2 Blätter des Baums

Page 31: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

5 ?

Page 32: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

= 5 ? nein

Page 33: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

> 5 ?

ja

Nein, also muss die 5 rechts sein.

Page 34: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

= 5 ? nein

Page 35: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

> 5 ?

nein

Ja, also muss die 5 links sein.

Page 36: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

= 5 ? nein

Page 37: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

> 5 ?

nein

Ja, also muss die 5 links sein.

Page 38: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2 = 5 ?

Ja, Schlüssel gefunden!

Page 39: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Suchen nach einem Schlüssel

4

3 8

6 9

7 5

1

2

0 ?

0 müsste links von der 1 sein, Teilbaum ist aber leer ⇒ 0 nicht da.

Page 40: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit binären Suchbäumen

n  Speichere die Elemente der Menge als Schlüssel in einem binären Suchbaum!

Page 41: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit binären Suchbäumen

n  Speichere die Elemente der Menge als Schlüssel in einem binären Suchbaum!

n  Suchzeit ist proportional zur Höhe des Baums (Länge des längsten Pfades von der Wurzel bis zu einem Blatt).

Page 42: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit binären Suchbäumen

4

3 8

6 9

7 5

1

2 Höhe 3

Page 43: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit binären Suchbäumen

n  Speichere die Elemente der Menge als Schlüssel in einem binären Suchbaum!

n  Suchzeit ist proportional zur Höhe des Baums (Länge des längsten Pfades von der Wurzel bis zu einem Blatt).

n  Einfügen und Löschen von Elementen?

Page 44: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Einfügen

n  Neues Element suchen und als Blatt an der passenden Stelle anhängen!

Page 45: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Einfügen

4

3 8

6 9

7 5

1

2

0 einfügen

0 müsste links von der 1 sein, Teilbaum ist aber leer ⇒ neues Blatt

Page 46: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Einfügen

4

3 8

6 9

7 5

1

2

0 einfügen

0

Page 47: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Einfügen

n  Neues Element suchen und als Blatt an der passenden Stelle anhängen!

n  Auch die Einfügezeit ist proportional zur Höhe des Baums.

Page 48: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

n  Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen!

Page 49: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

n  Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen!

n  Rotation: lokale Operation, welche die Positionen von Knoten verändert, nicht jedoch die Suchbaumeigenschaften.

Page 50: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Rotation eines Teilbaums

s

t

A B

B

Page 51: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Rotation eines Teilbaums

s

t

A B

C

A < t ≦ B < s ≦ C

Page 52: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Rotation eines Teilbaums

s

t

A B

C

A < t ≦ B < s ≦ C

t

s

A

B C

Rechtsrotation

A < t ≦ B < s ≦ C =

Page 53: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Rotation eines Teilbaums

s

t

A B

C

A < t ≦ B < s ≦ C

t

s

A

B C

Rechtsrotation

A < t ≦ B < s ≦ C

Linksrotation

=

Page 54: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 8

6 9

7 5

1

2

8 löschen

Page 55: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 8

6 9

7 5

1

2

8 löschen

Rechtsrotation (Linksrotation wäre auch möglich)

A B

C

Page 56: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 6

5 8

7

1

2

8 löschen

9

A

B C

Page 57: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 6

5 8

7

1

2

8 löschen

Linksrotation (Rechtsrotation wäre auch möglich)

9 A

B C

B und C sind leere Bäume

Page 58: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 6

5 9

8

1

2

8 löschen

7

A B

C

B und C sind leere Bäume

Page 59: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 6

5 9

8

1

2

8 löschen

Rechtsrotation (Linksrotation wäre nicht möglich) 7

A B

C

A, B, C sind leere Bäume

Page 60: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 6

5 9

7

1

2

8 löschen

8

A

B

A, B, C sind leere Bäume

C

Page 61: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

4

3 6

5 9

7

1

2

8 löschen

delete 8

Page 62: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Binäre Suchbäume: Löschen

n  Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen!

n  Rotation: lokale Operation, welche die Positionen von Knoten verändert, nicht jedoch die Suchbaumeigenschaften.

n  Auch die Löschzeit ist proportional zur Höhe des Baums (nicht mehr ganz so offensichtlich)

Page 63: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

n  bestimmt die Laufzeit des n  Suchens, n  Einfügens, n  Löschens.

Page 64: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

n  bestimmt die Laufzeit des n  Suchens, n  Einfügens, n  Löschens.

n  kann aber bereits bei einer ungünstigen Einfügereihenfolge sehr gross werden!

Page 65: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

n  bestimmt die Laufzeit des n  Suchens, n  Einfügens, n  Löschens.

n  kann aber bereits bei einer ungünstigen Einfügereihenfolge sehr gross werden!

n  Laufzeit im schlimmsten Fall nicht besser als bei einer Liste!

Page 66: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

1

Beispiel: Einfügen in sortierter Reihenfolge

Page 67: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

1

Beispiel: Einfügen in sortierter Reihenfolge

2

Page 68: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

1

Beispiel: Einfügen in sortierter Reihenfolge

2

3

Page 69: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Höhe eines binären Suchbaums...

1

Beispiel: Einfügen in sortierter Reihenfolge

2

3

n

Höhe = n-1, Baum sieht aus und verhält sich wie eine Liste.

Page 70: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Abhilfe: Balancierung

n  Beim Einfügen und Löschen stets darauf achten, dass der Baum „balanciert“ ist, (d.h. keine grossen Höhenunterschiede zwischen linken und rechten Teil-bäumen)

Page 71: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Abhilfe: Balancierung

n  Beim Einfügen und Löschen stets darauf achten, dass der Baum „balanciert“ ist, (d.h. keine grossen Höhenunterschiede zwischen linken und rechten Teil-bäumen)

n  Verschiedene Möglichkeiten (mehr oder weniger kompliziert): n  AVL-Bäume, Rot-Schwarz-Bäume,...

Page 72: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Abhilfe: Balancierung

n  Beim Einfügen und Löschen stets darauf achten, dass der Baum „balanciert“ ist, (d.h. keine grossen Höhenunterschiede zwischen linken und rechten Teil-bäumen)

n  Verschiedene Möglichkeiten (mehr oder weniger kompliziert): n  AVL-Bäume, Rot-Schwarz-Bäume,... n  Hier: Treaps (randomisierte Suchbäume)

Page 73: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treap = Tree + Heap

n  Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten: n  Sowohl der linke als auch der rechte

Teilbaum sind Heaps. n  Der Schlüssel der Wurzel ist

n  das Maximum aller Schlüssel.

Page 74: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Heap: Schlüssel heissen Prioritäten

n  Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten: n  Sowohl der linke als auch der rechte

Teilbaum sind Heaps. n  Die Priorität der Wurzel ist

n  das Maximum aller Prioritäten.

Page 75: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Heap: Beispiel

9

7 8

6 5

1 2

4

3

Page 76: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps

n  Ein Binärbaum heisst Treap, wenn jeder Knoten einen Schlüssel und eine Priorität hat, so dass folgende Eigen-schaften gelten: n  Der Baum ist ein binärer Suchbaum bzgl.

der Schlüssel. n  Der Baum ist ein Heap bzgl. der Prioritäten.

Page 77: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treap: Beispiel

4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

Schlüssel Prioritäten

Page 78: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Eindeutigkeit

n  Satz: Für n Knoten mit verschiedenen Schlüsseln und Prioritäten gibt es genau einen Treap mit diesen Knoten.

Page 79: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Eindeutigkeit

n  Satz: Für n Knoten mit verschiedenen Schlüsseln und Prioritäten gibt es genau einen Treap mit diesen Knoten.

n  Beweis: Die Wurzel ist der Knoten mit der höchsten Priorität; im linken Teilbaum sind alle Knoten mit kleineren und im rechten Teilbaum alle Knoten mit grösseren Schlüsseln. Mit Induktion sind die Teilbäume auch eindeutig.

Page 80: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps mit zufälligen Prioritäten

n  Wir benutzen einen Treap als binären Suchbaum.

Page 81: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps mit zufälligen Prioritäten

n  Wir benutzen einen Treap als binären Suchbaum.

n  Beim Einfügen eines neuen Schlüssels wird seine Priorität zufällig gewählt.

Page 82: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps mit zufälligen Prioritäten

n  Wir benutzen einen Treap als binären Suchbaum.

n  Beim Einfügen eines neuen Schlüssels wird seine Priorität zufällig gewählt.

n  Wie bei normalen binären Suchbäumen: neuer Knoten wird neues Blatt.

Page 83: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps mit zufälligen Prioritäten

n  Wir benutzen einen Treap als binären Suchbaum.

n  Beim Einfügen eines neuen Schlüssels wird seine Priorität zufällig gewählt.

n  Wie bei normalen binären Suchbäumen: neuer Knoten wird neues Blatt.

n  Zusätzlich muss die Treap-Eigenschaft wieder hergestellt werden!

Page 84: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

Page 85: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3 0, 7.5

Neues Blatt

Page 86: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3 0, 7.5

Heap-Eigenschaft verletzt: 4 < 7.5

Page 87: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3 0, 7.5

Rechtsrotation!

Page 88: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

0, 7.5

Page 89: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

0, 7.5 Heap-Eigenschaft verletzt: 7 < 7.5

Page 90: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7 8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

0, 7.5

Rechtsrotation!

Page 91: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7

8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

0, 7.5

Page 92: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Einfügen 0 einfügen, mit zufälliger Priorität 7.5 4, 9

3, 7

8, 8

6, 6 9, 5

7, 1 5, 2

1, 4

2, 3

0, 7.5 Heap-Eigenschaft ok, wir haben wieder einen Treap!

Page 93: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Löschen

n  Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen!

Page 94: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Löschen

n  Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen!

n  Stets so rotieren, dass der Knoten mit seinem Nachfolger höherer Priorität vertauscht wird. Das erhält die Heap-Eigenschaft.

Page 95: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Löschen

n  Element suchen, seinen Knoten durch Rotationen zu einem Blatt machen, Blatt löschen!

n  Stets so rotieren, dass der Knoten mit seinem Nachfolger höherer Priorität vertauscht wird. Das erhält die Heap-Eigenschaft.

n  Suchbaum-Eigenschaft gilt wieder nach Löschen des Blatts.

Page 96: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Laufzeit

n  Satz (Seidel, Aragon 1996): In einem Treap über n Knoten mit zufälligen Prioritäten ist der zeitliche Aufwand für eine Einfüge-, Lösch- oder Suchopera-tion im Erwartungswert proportional zu log2n.

Page 97: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps: Laufzeit

n  Satz (Seidel, Aragon 1996): In einem Treap über n Knoten mit zufälligen Prioritäten ist der zeitliche Aufwand für eine Einfüge-, Lösch- oder Suchopera-tion im Erwartungswert proportional zu log2n.

n  Mehr dazu in der nächsten Stunde.

Page 98: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Treaps

n  Zur Erinnerung: Suche nach den letzten 100 Elementen in einer Liste von 10,000,000 Elementen

List l; for (int i=0; i<10000000; ++i) l.push_front(i); // ...and search for the 100 first ones for (int i=0; i<100; ++i) l.find(i); 6.5 Sekunden

Page 99: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Mengen: Lösung mit Treaps

n  Neu: Suche nach den letzten 100 Elementen in einem Treap von 10,000,000 Elementen

Treap t; for (int i=0; i<10000000; ++i) t.insert(i); // ...and search for the 100 first ones for (int i=0; i<100; ++i) t.find(i); 0.017 Sekunden

Page 100: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Sortieren mit Treaps

n  Folgerung: Durch Einfügen einer Folge von n Zahlen in einen Treap mit zufäl-ligen Prioritäten kann die Folge in Zeit proportional zu n log2n sortiert werden.

Page 101: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Sortieren mit Treaps

n  Folgerung: Durch Einfügen einer Folge von n Zahlen in einen Treap mit zufäl-ligen Prioritäten kann die Folge in Zeit proportional zu n log2n sortiert werden.

n  Gleicher optimaler Proportionalitäts-faktor wie Mergesort

Page 102: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Sortieren mit Treaps

n  Folgerung: Durch Einfügen einer Folge von n Zahlen in einen Treap mit zufäl-ligen Prioritäten kann die Folge in Zeit proportional zu n log2n sortiert werden.

n  Gleicher optimaler Proportionalitäts-faktor wie Mergesort

n  Das Treap-basierte Verfahren ist im wesentlichen äquivalent zu Quicksort.

Page 103: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps in C++

n  Aehnlich wie bei Listen: n  Klasse TreapNode für die Knoten n  Jeder TreapNode speichert ausser

Schlüssel und Priorität zwei Zeiger auf TreapNodes (linkes und rechtes Kind = Wurzeln des linken und rechten Teilbaums)

Page 104: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Treaps in C++

n  Aehnlich wie bei Listen: n  Klasse TreapNode für die Knoten n  Jeder TreapNode speichert ausser

Schlüssel und Priorität zwei Zeiger auf TreapNodes (linkes und rechtes Kind = Wurzeln des linken und rechten Teilbaums)

n  Klasse Treap; jeder Treap ist durch einen Zeiger auf den Wurzelknoten repräsentiert.

Page 105: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse TreapNode class TreapNode !{!public:! // constructor! TreapNode( int key, int priority, TreapNode* left = 0, TreapNode* right = 0);!! // Getters! int get_key() const;! int get_priority() const;! const TreapNode* get_left() const;! const TreapNode* get_right() const;!

!!private:! int key_;! double priority_;! TreapNode* left_;! TreapNode* right_; !! friend class Treap;!}; !

Page 106: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse TreapNode class TreapNode !{!public:! // constructor! TreapNode( int key, int priority, TreapNode* left = 0, TreapNode* right = 0);!! // Getters! int get_key() const;! int get_priority() const;! const TreapNode* get_left() const;! const TreapNode* get_right() const;!

!!private:! int key_;! double priority_;! TreapNode* left_;! TreapNode* right_; !! friend class Treap;!}; !

Wie bei Facebook: Freunde dürfen auf private Daten und Methoden (Mitgliedsfunktionen) zugreifen.

Page 107: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Die „Viererbande“ class Treap { public: // default constructor: // POST: *this is an empty tree Treap();

// copy constructor // POST *this is a copy of other Treap(const Treap& other); // assignment operator // Post: other was assigned to *this Treap& operator= (const Treap& other);

// Destructor ~Treap(); …

Konstruktor

Copy-Konstruktor

Zuweisungs-operator

Destruktor

Page 108: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Die „Viererbande“ + Wurzel class Treap { public: // default constructor: // POST: *this is an empty tree Treap();

// copy constructor // POST *this is a copy of other Treap(const Treap& other); // assignment operator // Post: other was assigned to *this Treap& operator= (const Treap& other);

// Destructor ~Treap(); private: TreapNode* root_; …

Konstruktor

Copy-Konstruktor

Zuweisungs-operator

Destruktor

Zeiger auf die Wurzel (0: leerer Treap)

Page 109: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

void Treap::insert(const int key)!{! insert (root_, key, std::rand());!}!

Page 110: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

void Treap::insert(const int key)!{! insert (root_, key, std::rand());!}!

private Hilfsfunktion Zufällige Priorität

Page 111: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

Page 112: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf eine leere Blattposition.

8, 8

current

9, 10

Page 113: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf eine leere Blattposition.

8, 8

current

9, 10

9, 10

Page 114: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf eine leere Blattposition.

8, 8

current

9, 10

Damit das klappt, muss current ein Alias des entsprechenden Zeigers im Baum sein, keine Kopie!

9, 10

Page 115: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf eine leere Blattposition.

8, 8

current

9, 10

Heap-Eigenschaft ist noch verletzt; das wird „weiter oben“ in der Rekursion repariert.

9, 10

Page 116: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf einen Knoten.

9, 10

current

8, 8

9 8

Page 117: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf einen Knoten.

9, 10

current

8, 8

9, 10 A

Page 118: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf einen Knoten.

9, 10

current

8, 8

9, 10

10 8

A

Page 119: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf einen Knoten.

9, 10

current

8, 8

9, 10

Page 120: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf einen Knoten.

9, 10

current

9, 10

8, 8

A

Page 121: Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps · 2012. 12. 3. · Treap = Tree + Heap! Ein Binärbaum heisst Heap, wenn er leer ist, oder wenn folgende Bedingungen gelten:

Die Klasse Treap Einfügen

// PRE: current is a pointer in *this // POST: a new TreapNode with key and priority is inserted into the // subtree hanging off current

void Treap::insert (TreapNode*& current, const int key, const int priority) { if (current == 0) current = new TreapNode (key, priority); else if (key < current->key_) {

insert (current->left_, key, priority); if (priority > current->get_priority())

rotate_right (current); } else { insert (current->right_, key, priority);

if (priority > current->get_priority()) rotate_left (current);

} }

current verweist auf einen Knoten.

9, 10

current

9, 10

8, 8 Fertig! A