+ All Categories
Home > Documents > Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur...

Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur...

Date post: 05-Apr-2015
Category:
Upload: kai-heithoff
View: 106 times
Download: 0 times
Share this document with a friend
84
Heaps und Priority Queues Oliver Kohlbacher
Transcript
Page 1: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

Heaps und Priority Queues

Oliver Kohlbacher

Page 2: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

2

Heaps (Halden)

Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft: Jeder Knoten hat einen Schlüssel der extremer (kleiner/größer) oder gleich dem Schlüssel des Elterknoten ist (Heapeigenschaft).

5

14 11

14 11 11 12

Page 3: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

3

Priority Queues (Vorrangwarteschlangen)

Def.: Eine Priority Queue PQ ist ein abstrakter Datentyp, der eine Menge von Paaren (key, inf) aus Schlüssel key und Information inf verwaltet und die folgenden Basisoperationen unterstützt:

• insert – Einfügen eines Elements• find_min – Das kleinste Elements zurückgeben• remove_min – Entfernen des kleinsten Elements

Häufig werden zusätzlich noch die folgenden Operationen benötigt:• merge – Verschmelzen zweier Warteschlangen• decrease_key – Den Schlüssel eines Elements erniedrigen• create – Konstruktion der PQ aus einem unsortierten Feld

Page 4: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

4

Anwendungen von Warteschlangen

• Sortieren– Elemente einfügen– Elemente sortiert entnehmen

• Scheduling– Verteile priorisierte Prozesse auf Resource– Idee:

• Wähle Prozess mit höchster Priorität, ausführen• „altere“ alle Prozesse in der Schlange• Füge den ausgeführten Prozess wieder mit

Startpriorität ein

• Ereignisgesteuerte Simulationen

Page 5: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

5

Ereignisgesteuerte Simulation

• Beispiel: Paketdienst

1 – Anruf beim Paketdienst (T1 = 0) – erzeugt:

2 – Abholung (T2 = T1 + 60) – erzeugt:

3 – Ankunft im Sortierzentrum (T3 = T2 + 120)

4 – Noch ein Anruf (T4 = 40) – erzeugt:

5 – Abholung (T5 = T4 + 60) – erzeugt:

….

T1=0

1 24 35

T2 T3T4 T5

Page 6: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

6

Binary Heap: Interfacetemplate <typename Key, typename Inf>class BinaryHeap{ public: typedef std::pair<Key, Inf> Item; […] Item& operator [] (int i); // Zugriff auf data void push_back(const Item& item); void push_down(int i); void push_up(int i); bool empty() const; // = (data.empty()) size_t size() const; // = data.size()

protected: std::vector<Item> data; // Wurzel in data[0]!};

Page 7: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

7

Priority Queue: Interfacetemplate <typename Key, typename Inf>class PriorityQueue{ public: typedef std::pair<Key, Inf> Item;

void insert(const Item& i); const Item& find_min() const; void delete_min(); void merge(PriorityQueue& pq); void decrease_key(int index, const Key& key); void create(const vector<Item>& array); bool empty() const; BinaryHeap<Key, Inf> heap;};

Page 8: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

8

Implementierung von insertvoid insert(const Item& item) { // Speichere im nächsten leeren Baumelement heap.push_back(item);

// Sortiere bis zur Wurzel neu heap.push_up(heap.size() - 1);}

7

9 25

22 15 30

Page 9: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

9

Implementierung von insertvoid insert(const Item& item) { // Speichere im nächsten leeren Baumelement heap.push_back(item);

// Sortiere bis zur Wurzel neu heap.push_up(heap.size() - 1);}

7

9 25

22 15 30 3

Page 10: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

10

Implementierung von insertvoid insert(const Item& item) { // Speichere im nächsten leeren Baumelement heap.push_back(item);

// Sortiere bis zur Wurzel neu heap.push_up(heap.size() - 1);}

7

9

22 15 30 3

25

Page 11: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

11

Implementierung von insertvoid insert(const Item& item) { // Speichere im nächsten leeren Baumelement heap.push_back(item);

// Sortiere bis zur Wurzel neu heap.push_up(heap.size() - 1);}

7

9

22 15 30 25

3

Page 12: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

12

Implementierung von insertvoid insert(const Item& item) { // Speichere im nächsten leeren Baumelement heap.push_back(item);

// Sortiere bis zur Wurzel neu heap.push_up(heap.size() - 1);}

7

9

22 15 30 25

3

Page 13: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

13

Implementierung von insert

• Schlimmstenfalls müssen log N Austausch-operationen auf dem Pfad zur Wurzel durchgeführt werden (für einen Heap mit N Elementen)

Laufzeit O(log N)• Komplexität von BinaryHeap::push_back?

void insert(const Item& item) { // Speichere im nächsten leeren Baumelement heap.push_back(item);

// Sortiere bis zur Wurzel neu heap.push_up(heap.size() - 1);}

Page 14: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

14

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

74 22 25 64 3 19 33

Page 15: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

15

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

74

22

64 3 19 33

25

Page 16: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

16

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

74

22

64 3 25 33

19

Page 17: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

17

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

74

3

64 22 25 33

19

Page 18: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

18

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

3

74

64 22 25 33

19

Page 19: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

19

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

3

22

64 74 25 33

19

Page 20: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

20

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen

3

22

64 74 25 33

19

Page 21: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

21

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!

• Konstruiere einen Heap mit N = 2h -1 Elementen• Von unten nach oben für jeden Knoten push_down• push_down für Höhe h: max. 2 (h – 1) Vergleiche

3

22

64 74 25 33

19

1 x für Heap der Größe 7

2 x für Heap der Größe 3

4 x für Heap der Größe 1

2h - 3 x für Höhe h

2h – 2 x für Höhe h - 1

2h – 1 x für Höhe h - 2

Page 22: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

22

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!

• Konstruiere einen Heap mit N = 2h -1 Elementen• Von unten nach oben für jeden Knoten push_down• push_down für Höhe h: max. 2 (h – 1) Vergleiche

1 x für Heap der Größe 7

2 x für Heap der Größe 3

4 x für Heap der Größe 1

2h - 3 x für Höhe h

2h – 2 x für Höhe h - 1

2h – 1 x für Höhe h - 2

2h-k

Page 23: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

23

Implementierung von create• Naiv: N * insert O(N log N)

• Konstruktion ist in Linearzeit möglich!• Konstruiere einen Heap mit N = 2h -1 Elementen• Von unten nach oben für jeden Knoten push_down• push_down für Höhe h: max. 2 (h – 1) Vergleiche

• Es gibt 2h-k Teilbäume der Höhe k

Page 24: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

24

Implementierung von create• push_down für Höhe h: max. 2 (h – 1) Vergleiche

• Es gibt 2h-k Teilbäume der Höhe k

Page 25: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

25

Implementierung von create• Analog kann man eine Schranke für die Konstruktion von unvollständigen binären

Heaps herleiten• create ist in O(N) möglich

void create(const vector<Item>& array) { // Implementierung: Übung! Kopiere Feldinhalt in Heap

Für t := (h – 1),…, 1, 0: Für alle Knoten v in Tiefe t: push_down(v)}

Page 26: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

26

Implementierung von find_min

• Das kleinste Element liegt immer in der Wurzel des Heaps find_min benötigt O(1) Zeit

• Der Heap selbst wird nicht verändert und nur eine Referenz auf das Element zurückgegeben.

const Item& find_min() const{ // Konsistenzprüfung if (heap.empty()) throw “Heap is empty!”;

// Das kleinste Element liegt in der Wurzel! return heap[0];}

Page 27: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

27

Einschub: Exceptions in C++const Item& find_min() const{ if (heap.empty()) throw “Heap is empty!”; […]}[…]

try{ pq.find_min(); […]}catch (const char* message){ std::cerr << “Error: “ << message << std::endl; […]}

Page 28: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

28

Implementierung von delete_minvoid delete_min() { if (heap.empty()) throw “Heap is empty!”;

// Letztes Element -> Wurzel, Heap verkleinern heap[0] = heap[heap.size() - 1]; head.pop_back();

// Heapeigenschaft wiederherstellen heap.push_down(0);}

• Maximal log2N Austauschoperationen

• Laufzeit O(log N)

Page 29: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

29

Implementierung von decrease_keyvoid decrease_key(int index, const Key& key) { if (index >= heap.size()) throw “illegal index!”; if (heap[index].first <= key) throw “no decrease!”;

// Letztes Element -> Wurzel, Heap verkleinern heap[index].first = key;

// Heapeigenschaft wiederherstellen heap.push_up(index);}

• Maximal log N Austauschoperationen • Laufzeit O(log N)

Page 30: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

30

Implementierung von mergevoid merge(const PriorityQueue& pq) { std::vector<Item> tmp(heap.size() + pq.heap.size());

std::copy(heap.data.begin(), heap.data.end(),tmp.begin());

std::copy(pq.heap.data.begin(), pq.heap.data.end()), tmp.begin() + heap.data.size());

create(tmp);}

• Idee: konkateniere die beiden Heaps, dann wie create• std::copy(iterator first, iterator last, iterator to)

kopiert den Bereich [first, last) nach [to,…)• Der Kopieralgorithmus benötigt Linearzeit, create ebenso Laufzeit O(N)

Page 31: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

31

Übersicht PQ mit binärem Heap

Operation Komplexität

insert O(log N)

find_min O(1)

delete_min O(log N)

decrease_key O(log N)

create O(N)

merge O(N)

Page 32: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

32

Übersicht PQ mit binärem Heap

Operation Komplexität

insert O(log N)

find_min O(1)

delete_min O(log N)

decrease_key O(log N)

create O(N)

merge O(N)

Page 33: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

33

B2 B1 B0

BinomialbäumeB0 B1 B2 B3

Bn

Bn-1

Bn-1

Bn-1 Bn-2 B1 B0

Bn

……..

Page 34: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

34

Eigenschaften von Binomialbäumen

Satz: Bn hat

1. Höhe n

2. 2n Knoten

3. Grad n in der Wurzel

4. Knoten in Tiefe k

Page 35: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

35

B0

B0

B1

B2

Eigenschaften von Binomialbäumen

Satz: Bn hat

1. Höhe n

2. 2n Knoten

3. Grad n in der Wurzel

4. Knoten in Tiefe k

B3

Bn-1

Bn-2

B1B0

Bn

B0

Rückgrat

Page 36: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

36

Eigenschaften von Binomialbäumen

Satz: Bn hat

1. Höhe n

2. 2n Knoten

3. Grad n in der Wurzel

4. Knoten in Tiefe k

Bew.: [2] durch Induktion

• B0 hat einen Knoten

• |Bn| = 2 |Bn-1| (nach Definition der Binomialbäume)

|Bn| = 2n

Page 37: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

37

Eigenschaften von Binomialbäumen

Satz: Bn hat

1. Höhe n

2. 2n Knoten

3. Grad n in der Wurzel

4. Knoten in Tiefe k Bn-1 Bn-2 B1 B0

Bn

……..

B2 B1 B0

B3

Page 38: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

38

Eigenschaften von Binomialbäumen

Satz: Bn hat

1. Höhe n

2. 2n Knoten

3. Grad n in der Wurzel

4. Knoten in Tiefe k

Bn

Bn-1

Bn-1

Bew.: [4] durch Induktion

Ann.: Bn hat Knk Knoten in Tiefe k

n = 0: K00 = 1, keine weiteren Knoten, also K0

k = 0 = 8 k > 0

Page 39: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

39

Eigenschaften von Binomialbäumen

Satz: Bn hat

1. Höhe n

2. 2n Knoten

3. Grad n in der Wurzel

4. Knoten in Tiefe k

Bn

Bn-1

Bn-1

Bew.: [4] durch Induktion

Ann.: Bn hat Knk Knoten in Tiefe k

n = 0: K00 = 1, keine weiteren Knoten, also K0

k = 0 = 8 k > 0

Page 40: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

40

Binomial-Heap

Def.: Ein Binomial-Heap ist eine Datenstruktur die aus einem Wald von Binomialbäumen besteht. Jeder der Bäume besitzt die Heapeigenschaft und ist mit einem Index k = 0…N versehen. Der Baum mit dem Index k enthält entweder 2k Knoten oder ist leer.

B0 B2 B3

Page 41: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

41

Priority Queue mit Binomial-Heaps

34

3545

87

7

B0B2

12

1355

87

23

9926

26

B3

min

• Binomialbäume in einer zirkulär verketteter Liste

•min: Zeiger auf Baum mit der kleinsten Wurzel

• Binomialbäume lassen sich z.B. durch Zeiger auf

1. Kind und nächstes Geschwister implementieren

Page 42: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

42

Struktur von Binomial-Heaps

• Idee: Die N Elemente eines Heaps lassen sich auf

eine Menge von Binomialbäumen verteilen, die

der Binärdarstellung von N entspricht

• Einem gesetzten Bit k entspricht ein

Binomialbaum Bk, der 2k Knoten enthält

• Jeder Binomialbaum muß die Heapeigenschaft

besitzen Wurzel ist das Minimum des Baums

• Ein solcher Heap besitzt höchstens log2N Bäume

Page 43: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

43

Struktur von Binomial-Heaps

• Idee: Die N Elemente eines Heaps lassen sich auf eine Menge von

Binomialbäumen verteilen, die der Binärdarstellung von N entspricht

Bsp.: N = 9 = 10012

Heap enthält zwei Bäume: B0 (ein Knoten) und B3 (acht Knoten)B0 B3

Page 44: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

44

Struktur von Binomial-Heaps

• Jeder Binomialbaum muß die Heapeigenschaft besitzen Wurzel ist das Minimum des Baums

Bsp.: N = 9 = 10012

Heap enthält zwei Bäume: B0 (ein Knoten) und B3 (acht Knoten)

5

B0

2

37

8

3

44

5

B3

min

Page 45: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

45

merge mit Binomial-Heaps

• Merge-Operation entspricht dem Addieren zweier Binärzahlen• Bsp.: zwei Heaps H1, H2 mit N1 = 9 = 10012, N2 = 5 = 1012 1001 + 101 1110

5

B0

2

37

8

3

44

5

B3

5

98

9

3

B0 B2

Page 46: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

46

merge mit Binomial-Heapsfor (k = 0; k <= log2(N1 + N2); ++k){ m = #Bk 2 (H1 [ H2); if (m == 1) {// behalten Bk } else if (m == 2){// vereinige beide Bk zu Bk+1} else if (m == 3){// vereinige zwei Bk zu Bk+1, // behalte drittes Bk }}

5

B0

2

37

8

3

44

5

B3

5

98

9

3

B0 B2

Tree& join(Tree& A, Tree& B){ if (A.root.key < B.root.key) return A.root.insert_child(B.root); else return B.root.insert_child(A.root);}

Page 47: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

47

merge mit Binomial-Heapsfor (k = 0; k <= log2(N1 + N2); ++k){ m = #Bk 2 (H1 [ H2); if (m == 1) {// behalten Bk } else if (m == 2){// vereinige beide Bk zu Bk+1} else if (m == 3){// vereinige zwei Bk zu Bk+1, // behalte drittes Bk }}

3

B1

2

37

8

3

44

5

B3

5

98

95

B2

Tree& join(Tree& A, Tree& B){ if (A.root.key < B.root.key) return A.root.insert_child(B.root); else return B.root.insert_child(A.root);}

Page 48: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

48

merge mit Binomial-Heapsfor (k = 0; k <= log2(N1 + N2); ++k){ m = #Bk 2 (H1 [ H2); if (m == 1) {// behalten Bk } else if (m == 2){// vereinige beide Bk zu Bk+1} else if (m == 3){// vereinige zwei Bk zu Bk+1, // behalte drittes Bk }}

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

Page 49: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

49

merge mit Binomial-Heapsfor (k = 0; k <= log2(N1 + N2); ++k){ m = #Bk 2 (H1 [ H2); if (m == 1) {// behalten Bk } else if (m == 2){// vereinige beide Bk zu Bk+1} else if (m == 3){// vereinige zwei Bk zu Bk+1, // behalte drittes Bk }}

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

Page 50: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

50

merge mit Binomial-Heapsfor (k = 0; k <= log2(N1 + N2); ++k){ m = #Bk 2 (H1 [ H2); if (m == 1) {// behalten Bk } else if (m == 2){// vereinige beide Bk zu Bk+1} else if (m == 3){// vereinige zwei Bk zu Bk+1, // behalte drittes Bk }}

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

Ergebnis: Heap mit N1 + N2 Knoten:

1001 + 101 1110

min = min(min(H1), min(H2))

min

Page 51: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

51

merge mit Binomial-Heapsfor (k = 0; k <= log2(N1 + N2); ++k){ m = #Bk 2 (H1 [ H2); if (m == 1) {// behalten Bk } else if (m == 2){// vereinige beide Bk zu Bk+1} else if (m == 3){// vereinige zwei Bk zu Bk+1, // behalte drittes Bk }}

Analyse:• Join-Operation auf zwei Bäumen erfolgt in O(1)• Ergebnis-Heap hat N = N1 + N2 Knoten, max. log2N Bäume

• log2N Bäume entstanden durch max. log2N Join-Operationen

Komplexität: O(log2N) = O(log2(N1 + N2))

Page 52: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

52

Vergleich binärer Heap und Binomial-Heap

Operation Binärer Heap Binomial-Heap

insert O(log N) ?

find_min O(1) ?

delete_min O(log N) ?

decrease_key O(log N) ?

create O(N) ?

merge O(N) O(log N)

Page 53: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

53

insert mit Binomial-Heapsvoid insert(const Item& item){ Tree trivial_tree(item); this->root = &merge(*this, trivial_tree);}

Analyse:• Implementierung erfolgt über merge• Tree(const Item&) erzeugt B0 mit item in der Wurzel

Komplexität: O(log N)

Warum nicht O(1)? „Übertrag“! 1111111 + 1

10000000

Page 54: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

54

create, find_min mit Binomial-Heaps

• create naiv: schlimmstenfalls N * insert = O(N log N)

• Bessere Abschätzung– Einfügen von N Elementen entspricht binärem Zählen bis N

– Übungsblatt 5: Amortisierte Analyse des Binärzählers• Erzeugen eines trivialen Baums (B0): O(1)

• merge für zwei Binomialbäume: O(1)

• Bit setzen/löschen im Binärzähler elementare Merge-Operation

Komplexität: O(N)

• find_min ist trivial: wir haben den min-Pointer! Komplexität: O(1)

Page 55: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

55

delete_min mit Binomial-Heaps

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

min

1. Entferne min aus der Wurzelliste

Page 56: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

56

delete_min mit Binomial-Heaps

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

min

2. Lösche min

Page 57: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

57

delete_min mit Binomial-Heaps

3

B1

7

8

3

44

5

5

5

98

9

B2

min

3. Füge Kinder von min ein

B2 B1

3B0

Page 58: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

58

delete_min mit Binomial-Heaps

3

B1

7

8

3

44

5

5

5

98

9

B2

min

B2 B1

3B0

3. Füge Kinder von min ein

Page 59: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

59

delete_min mit Binomial-Heaps

3

B1

3

44

5

5

5

98

9

B2

min

B2

7

8

B1

3B0

3. Füge Kinder von min ein

Page 60: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

60

delete_min mit Binomial-Heaps

3

B1

3

44

5

5

5

98

9

B2

min

B27

8

3B0

3. Füge Kinder von min ein

Page 61: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

61

delete_min mit Binomial-Heaps

3

B2

3

44

5

5

5

98

9

B2

min

B27

8

3B0

3. Füge Kinder von min ein

Page 62: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

62

delete_min mit Binomial-Heaps

3

B2

3

44

5

5

5

98

9

B2

min

B27

8

3B0

3. Füge Kinder von min ein

Page 63: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

63

delete_min mit Binomial-Heaps

3

B2

3

44

5

5

5

98

9

min

B27

8

3B0

3. Füge Kinder von min ein

Page 64: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

64

delete_min mit Binomial-Heaps

3

B2

3

44

5

5 5

98

9

min

B27

8

3B0

3. Füge Kinder von min ein

Page 65: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

65

delete_min mit Binomial-Heaps

3

B3

3

44

5

5 5

98

9

min

B27

8

3B0

3. Füge Kinder von min ein

Page 66: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

66

delete_min mit Binomial-Heaps

3

B3

5 5

98

9

min

3

44

5

B27

8

3B0

3. Füge Kinder von min ein

Page 67: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

67

delete_min mit Binomial-Heaps

3

B3

5 5

98

9

min

3

44

5

B2

7

8

3B0

3. Füge Kinder von min ein

Page 68: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

68

delete_min mit Binomial-Heaps

3

B3

5 5

98

9

min

4. Neues min Element suchen

3

44

5

B2

7

8

3B0

Page 69: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

69

delete_min mit Binomial-Heapsvoid delete_min(){ // 1. Entferne min aus Wurzelliste root_list.erase(min);

// 2. Lösche min Tree* child = min->first_child; delete min;

// 3. Füge Kinder ein while (child != 0) { Tree* next_child = child->next; merge(*child); child = next_child; }

// 4. Finde neues Minimum min = minimum(); // Geht über Wurzelliste, findet minimum}

Page 70: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

70

delete_min mit Binomial-Heapsvoid delete_min(){ // 1. Entferne min aus Wurzelliste O(1) root_list.erase(min);

// 2. Lösche min O(1) Tree* child = min->first_child;´ delete min;

// 3. Füge Kinder ein O(log N) while (child != 0) { Tree* next_child = child->next; merge(*child); child = next_child; }

// 4. Finde neues Minimum O(log N) min = minimum(); // Geht über Wurzelliste, findet minimum}

Page 71: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

71

decrease_key mit Binomial-Heaps

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

min

1. Fall: decrease_key auf min

Page 72: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

72

decrease_key mit Binomial-Heaps

3

B1

1

37

8

3

44

5

B3

5

5

98

9

B2

min

1. Fall: decrease_key auf min - O(1)

Page 73: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

73

decrease_key mit Binomial-Heaps

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

min

2. Fall: decrease_key auf bel. Wurzel

Page 74: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

74

decrease_key mit Binomial-Heaps

1

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

min

2. Fall: decrease_key auf bel. Wurzel - O(1)

Page 75: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

75

decrease_key mit Binomial-Heaps

3

B1

2

37

8

3

44

5

B3

5

5

98

9

B2

min

3. Fall: decrease_key auf bel. Element

Page 76: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

76

decrease_key mit Binomial-Heaps

3

B1

2

37

8

3

44

5

B3

5

5

98

1

B2

min

3. Fall: decrease_key auf bel. Element

Page 77: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

77

decrease_key mit Binomial-Heaps

5

98

1

B23

B1

2

37

8

3

44

5

B3

5min

3. Fall: decrease_key auf bel. Element

Page 78: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

78

decrease_key mit Binomial-Heaps

5

91

8

B23

B1

2

37

8

3

44

5

B3

5min

3. Fall: decrease_key auf bel. Element

Page 79: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

79

decrease_key mit Binomial-Heaps

1

95

8

B23

B1

2

37

8

3

44

5

B3

5min

3. Fall: decrease_key auf bel. Element

Page 80: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

80

decrease_key mit Binomial-Heaps

1

95

8

B23

B1

2

37

8

3

44

5

B3

5min

3. Fall: decrease_key auf bel. Element

Page 81: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

81

decrease_key mit Binomial-Heaps

1

95

8

B23

B1

2

37

8

3

44

5

B3

5min

3. Fall: decrease_key auf bel. Element - O(log N)

Page 82: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

82

Vergleich binärer Heap und Binomial-Heap

Operation Binärer Heap Binomial-Heap

insert O(log N) O(log N)

find_min O(1) O(1)

delete_min O(log N) O(log N)

decrease_key O(log N) O(log N)

create O(N) O(N)

merge O(N) O(log N)

Page 83: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

83

Die Heap-Algorithmen der STLvector<int> my_heap(20); […]std::make_heap(my_heap.begin(), my_heap.end());[…]// Hinzufügenmy_heap.push_back(item);std::push_heap(my_heap.begin(), my_heap.end());

• Die STL definiert die Standardoperationen auf binären Heaps im Header <algorithm>

• Die Algorithmen arbeiten auf beliebigen Containern mit wahlfreiemn Zugriff – sie benötigen nur entsprechende Iteratoren

Page 84: Heaps und Priority Queues Oliver Kohlbacher. 2 Heaps (Halden) Def.: Ein Heap ist eine Datenstruktur in Form eines Baums mit der folgenden Eigenschaft:

84

Die STL-Klasse priority_queue// Aus STL header <queue>:template <typename T, typename Container, typename Compare>class priority_queue{ public: […] void push(const value_type& item); // insert const_reference top() const; // find_min void pop(); // insert};

• priority_queue ist im Header <queue> definiert• Die Klasse ist ein Adapter, d.h sie setzt auf einen bereits

implementierten Container auf (vector<T>)• Die Implementierung basiert auf binären Heaps• Durch Wahl von Compare wird die Ordnung bestimmt


Recommended