Binomiale Heaps

Werbung
Binomiale Heaps
17.01.2003
Christian John / Tobias Berger
Nr.1
Binomiale Heaps
Gliederung:
1. Binomialer Baum
2. Binomialer Heap
3. Operationen auf Binomialen Heaps
3.1 - make-heap
3.2 - minimum(h)
3.3 - link(y,z)
3.4 - merge(h1,h2)
17.01.2003
Christian John / Tobias Berger
Nr.2
Binomiale Heaps
1. Binomialer Baum = Basisstruktur für Binomiale Heaps
Definition:
Für ein k>=0 definieren wir die Struktur des Binomialen Baumes:
B0
ist ein Baum mit nur einem Knoten
entsteht aus zwei Bäumen Bk , indem man die
k ? 1 Wurzel des einen Baumes zum Sohn des anderen
macht
B
17.01.2003
Christian John / Tobias Berger
Nr.3
Binomiale Heaps
B0
Bk
Bk
Bk ? 1
17.01.2003
Christian John / Tobias Berger
Nr.4
Binomiale Heaps
Verschmelzung Binomialer Bäume:
Die Verschmelzung Binomialer Bäume erfolgt gleich der Addition
von Binärzahlen, wobei die Anzahl der Knoten der Bäume in
Binärzahlen dargestellt wird:
+
B1
0I0
17.01.2003
=
B2
B1
+
0I0
Christian John / Tobias Berger
=
I00
Nr.5
Binomiale Heaps
Eigenschaften für Binomiale Bäume:
Bk besteht exakt aus 2k Knoten
• Bk hat die Höhe k
•
• es ergeben sich genau
?k ?
?? ??
?i ?
Knoten in der Tiefe i mit i=0,1,2,...,k
• die Wurzel besitzt Ausgangsgrad k und die Teilbäume von links
nach rechts sind Bk ?1 ,...., B0
Alle Knoten haben einen kleineren Grad als die Wurzel.
17.01.2003
Christian John / Tobias Berger
Nr.6
Binomiale Heaps
Beweise der Eigenschaften für Binomiale Bäume:
•
•
Bk besteht aus zwei Bäumen Bk ?1 , also Bk = 2 Bk ?1 = 2k
da bei der Konstruktion von Bk ein Baum Bk ? 1 Unterbaum der
Wurzel des anderen Bk ?1 wird, erhöht sich die Höhe von Bk
gegenüber der von Bk ? 1 um genau 1
17.01.2003
Christian John / Tobias Berger
Nr.7
Binomiale Heaps
Beweise der Eigenschaften für Binomiale Bäume:
• Aufgrund der Konstruktion von
Bk ergibt sich die Anzahl der
Knoten auf Höhe i als Summe der Anzahl der Knoten auf Höhe i
in
Bk ? 1 plus Anzahl der Knoten auf Höhe i -1 in Bk ?1
Also:
17.01.2003
? k ? 1?
??
??
? i ?
+
? k ? 1?
??
??
? i ? 1?
=
?k ?
?? ??
?i ?
Christian John / Tobias Berger
Nr.8
Binomiale Heaps
Beweise der Eigenschaften für Binomiale Bäume:
Bk verändert nur den Ausgangsgrad der
Wurzel des rechten Teilbaumes Bk ? 1 . Dieser Grad war vor
• die Konstruktion von
der Konstruktion k - 1 und ist nun k, da links ein
Teilbaum hinzugekommen ist. Dieser Teilbaum ist Bk ?1 , und die
anderen Unterbäume der Wurzel sind nach Voraussetzung
Bk ? 2 ,..., B0
17.01.2003
Christian John / Tobias Berger
Nr.9
Binomiale Heaps
Korollar:
Der maximale Grad eines Knotens in einem Binomialen Baum, der
n Knoten hat, ist ld n
n = 2k
ld n = k
ld n = log2 n
17.01.2003
(Logarithmus zur Basis 2)
Christian John / Tobias Berger
Nr.10
Binomiale Heaps
2. Binomialer Heap = Eine Baumstruktur die sich aus Binomialen
Bäumen zusammensetzt; jeder Knoten enthält einen Schlüssel
Definition:
Jeder dieser Bäume ist Heap-geordnet, das heißt, der Schlüssel
eines Knotens ist kleiner/gleich der Schlüssel seiner Söhne. Es darf
kein Baum mit gleichem Grad mehrfach vorhanden sein.
17.01.2003
Christian John / Tobias Berger
Nr.11
Binomiale Heaps
Zusammenhang zwischen Binomialem Heap und Binärzahlen:
Ein Binomialer Heap, zusammengesetzt aus Binomialen Bäumen,
lässt sich als Binärzahl verwalten!
Ein Heap mit folgenden Bäumen B0 ,
Binärzahl wie folgt schreiben: IIII
B1 , B2 , B3 , lässt sich als
Ein Baum mit vier Knoten kann als Binärzahl 0I00 dargestellt
werden; wenn Bäume verschmelzen, gleicht dieses einer Addition
von Binärzahlen.
17.01.2003
Christian John / Tobias Berger
Nr.12
Binomiale Heaps
Ein Binomialer Heap mit n Knoten besteht aus höchstens ?ld n?+1
Binomialen Bäumen:
10
8
B0
13
33
B1
41
000I + 00I0
17.01.2003
7
+
2
23
B2
0I00
49
25
6
47
31
54
B3
+
I000
Christian John / Tobias Berger
17
=
IIII
Nr.13
Binomiale Heaps
Repräsentation des Heap
1010
0
01 1
2
12
1
01 6
3
25
0
18
0
11
1
27
0
child
17.01.2003
10 10
2
14
1
17
0
38
0
29
0
P
key
degree
sibling
Christian John / Tobias Berger
Nr.14
Binomiale Heaps
3. Operationen auf Binomiale Heaps
3.1 make-heap()
Erzeugt einen leeren Heap. Ein leerer Heap wird einfach durch
einen nil-Zeiger repräsentiert
Laufzeit:
17.01.2003
? (1)
Christian John / Tobias Berger
Nr.15
Binomiale Heaps
3.2 minimum(h)
Liefert einen Zeiger auf den Knoten mit dem kleinsten Schlüssel im
Heap h. Die Wurzeln der Binomialen Bäume werden also durchsucht.
Laufzeit: ? (ld n)
17.01.2003
Christian John / Tobias Berger
Nr.16
Binomiale Heaps
minimum(h)
min-ptr := nil;
x := head[h];
min := maxint;
while x <> nil do
if key[x] < min then
min := key[x];
min-ptr := x;
endif;
x := sibling[x];
endwhile;
return min-ptr;
17.01.2003
Christian John / Tobias Berger
Nr.17
Binomiale Heaps
3.3 link(y,z)
Diese Funktion “linkt“ drei Zeiger von zwei Knoten um; der Knoten
y wird Sohn von z: y bekommt den bisherigen Sohn von z als
Bruder, bevor y selber der Sohn von z wird.
Laufzeit:
17.01.2003
? (1)
Christian John / Tobias Berger
Nr.18
Binomiale Heaps
link(y,z)
p[y] := z;
sibling[y] := child[z];
child[z] := y;
degree[z] := degree[z] + 1;
17.01.2003
Christian John / Tobias Berger
Nr.19
Binomiale Heaps
3.4 merge(h1,h2)
Merge durchläuft beide Teilmengen sequentiell und erzeugt
die Gesamtfolge sequentiell. Die Gesamtfolge ist kein Binomialer
Heap.
Laufzeit: ? (ld n)
17.01.2003
Christian John / Tobias Berger
Nr.20
Binomiale Heaps
merge(h1,h2)
h-ptr := make-heap();
last-ptr := head[h];
x-ptr := head[h1];
y-ptr := head[h2];
while(x-ptr != nil && y-ptr != nil)
if(degree[x-ptr]<=degree[y-ptr])
sibling[last-ptr] := x-ptr;
x-ptr := sibling[x-ptr];
else
sibling[last-ptr] := y-ptr;
y-ptr := sibling[y-ptr];
last-ptr := sibling[y-ptr];
17.01.2003
Christian John / Tobias Berger
Nr.21
Binomiale Heaps
merge(h1,h2) 2.Teil
while(x-ptr != nil)
sibling[last-ptr] := x-ptr;
x-ptr := sibling[x-ptr];
while(y-ptr != nil)
sibling[last-ptr] := y-ptr;
y-ptr := sibling[y-ptr];
17.01.2003
Christian John / Tobias Berger
Nr.22
Binomiale Heaps
Beispiel der union-Funktion:
Heap[5]:
Heap[7]:
17.01.2003
Christian John / Tobias Berger
Nr.23
1. Binomiale Heaps
Binomiale Heaps
Inhalt
1. Operationen | Wiederholungen
1.1
Binomialer Heap
1.2
minimum(h)
1.3
Datenstruktur eines Heapelements
1.3
link (y,z)
1.4
merge(h1,h2)
2. weitere Operationen
2.1
union(h1,h2)
2.2
insert (h,x)
2.3
extract_min(h)
2.4
decrease key(h,x,k)
2.5
delete key(h,x)
3. Anwendungsbeispiel
17.01.2003
Christian John / Tobias Berger
Nr.24
Binomiale Heaps
Operationen | Wiederholungen | 1
17.01.2003
Christian John / Tobias Berger
Nr.25
1. Operationen | Wiederholungen
Binomiale Heaps
1.1 Binomialer Heap
B0
B1
10
8
13
B2
B3
7
33
2
23
41
49
25
6
47
31
17
54
0001 + 0010
17.01.2003
+
0100
+
Christian John / Tobias Berger
1000
= 1111
Nr.26
1. Operationen | Wiederholungen
Binomiale Heaps
1.2 Datenstruktur eines Heapelements
parent
key
degree
child
17.01.2003
sibling
Christian John / Tobias Berger
Nr.27
1. Operationen | Wiederholungen
Binomiale Heaps
1.2 Datenstruktur eines Heapelements
010
1
0
11
0
2
12
1
18
0
16
0
3
25
0
11
1
09
1
2
14
1
17
0
38
0
29
0
27
0
17.01.2003
Christian John / Tobias Berger
Nr.28
1. Operationen | Wiederholungen
Binomiale Heaps
1.2 minimum(h)
Liefert einen Zeiger auf den Knoten mit dem kleinsten Schlüssel im
Heap h.
Die Wurzeln der Binomialen Bäume werden also durchsucht.
Laufzeit: O (ld n)
17.01.2003
Christian John / Tobias Berger
Nr.29
1. Operationen | Wiederholungen
Binomiale Heaps
1.3 link (y,z)
Diese Funktion “linkt“ drei Zeiger von zwei Knoten um;
der Knoten y wird Sohn von z;
y bekommt den bisherigen Sohn von z als Bruder,
bevor y selber der Sohn von z wird.
Laufzeit: O (1)
link(y,z)
p[y] := z;
sibling[y] := child[z];
child[z] := y;
degree[z] := degree[z] + 1;
17.01.2003
Christian John / Tobias Berger
Nr.30
1. Operationen | Wiederholungen
Binomiale Heaps
1.4 merge(h1,h2)
merge(h1,h2) durchläuft beide Teilmengen sequentiell und
erzeugt die Gesamtfolge sequentiell.
Die Gesamtfolge ist kein Binomialer Heap.
Laufzeit: O (ld n)
17.01.2003
Christian John / Tobias Berger
Nr.31
Binomiale Heaps
weitere Operationen | 2
17.01.2003
Christian John / Tobias Berger
Nr.32
2. weitere Operationen
Binomiale Heaps
2.1 union(h1,h2)
verbindet die die zwei Heaps h1 und h2 und gibt den neuen Head h zurück
benutzt die bekannten Funktionen:
- make()
- link()
- merge()
Laufzeit: O (ld n) (siehe später)
23 22 21 20
Beispiel:
+
17.01.2003
1
0
1
0
1
1
0
0
1
1
1
0
Christian John / Tobias Berger
Nr.33
2. weitere Operationen
Binomiale Heaps
2.1 union(h1,h2) - BEISPIEL
merge()
Heap[5]:
Heap[7]:
Heap[13]:
step1
step2
Heap[13]:
Heap[13]:
step3
Heap[13]:
Beispiel einer union-Funktion
17.01.2003
Christian John / Tobias Berger
Nr.34
2. weitere Operationen
Binomiale Heaps
2.1 union(h1,h2) - PSEUDO CODE
h := make-heap()
head[h] := merge(h1,h 2)
if head[h] = nil
then return h
prev-x := nil
x := head[h]
next-x := sibling[x]
while next-x <> nil
do if (degree[x] <> degree[next-x]) or (sibling[next-x] <> nil
and degree[sibling[next-x]] = degree[x])
then prev-x := x
x := next-x
else if key[x] <= key[next-x]
then sibling[x] := sibling[next-x]
link(next-x,x)
else if prev-x = NIL
then head[H] := next-x
else sibling[prev-x] := next-x
link(x,next-x)
x := next-x
next-x := sibling[x]
return h
17.01.2003
Christian John / Tobias Berger
Nr.35
2. weitere Operationen
Binomiale Heaps
2.1 union(h1,h2) - AUFWAND
Aufwand :
17.01.2003
make_heap()
heap_merge()
while()
O(1)
O(ld n)
O(1) * ( ?ldn1 ?+ ?ldn2 ?+ 2 )
union(h1,h2)
O(ld n)
Christian John / Tobias Berger
Nr.36
2. weitere Operationen
Binomiale Heaps
2.2 insert(h,x)
Stützt sich auf union ab.
Es wird ein Heap h‘ mit x als einzigem Knoten erzeugt
und mit h vereinigt.
Laufzeit: O (ld n)
17.01.2003
Christian John / Tobias Berger
Nr.37
2. weitere Operationen
Binomiale Heaps
2.2 insert(h,x) - PSEUDO CODE
insert(h,x)
h‘ := make-heap();
p[x] := nil;
child[x] := nil;
sibling := nil;
degree[x] := 0;
head[h‘] := x;
h := union(h, h‘);
return h;
17.01.2003
Christian John / Tobias Berger
Nr.38
2. weitere Operationen
Binomiale Heaps
2.3 extract_min(h)
Liefert einen Verweis auf den Knoten mit dem kleinsten Schlüssel
und entfernt diesen aus dem Heap.
Laufzeit: O (ld n)
17.01.2003
Christian John / Tobias Berger
Nr.39
2. weitere Operationen
Binomiale Heaps
2.3 extract_min(h) - PSEUDO CODE
extract_min(h)
1 finde die Wurzel x mit minimalem Schlüssel in der Wurzelliste von h
und entferne x aus der Wurzelliste;
2 h‘ := make-heap();
3 kehre die Reihenfolge der verketteten Söhne von x um
und setzte head[h‘] auf den Kopf der umgedrehten Liste;
4 h := union(h, h‘);
5 return h
Laufzeit: O(ld n)
17.01.2003
Christian John / Tobias Berger
Nr.40
2. weitere Operationen
Binomiale Heaps
2.3 extract_min(h) - BEISPIEL
Heap[7]:
Heap[3]:
x
Heap[3]:
x.child
Heap[3]:
3
1
3
1
2
2
union()
17.01.2003
Christian John / Tobias Berger
Nr.41
2. weitere Operationen
Binomiale Heaps
2.3 extract_min(h) - BEISPIEL
x
x.child
013
1
2
12
1
7
0
18
0
02
1
4
1
45
0
17.01.2003
25
0
2
12
1
7
0
18
0
02
1
4
1
25
0
45
0
Christian John / Tobias Berger
Nr.42
2. weitere Operationen
Binomiale Heaps
2.3 extract_min(h) - BEISPIEL
x.child
Heap[]
nil
012
1
12
1
25
0
x.child
12
1
25
0
temp
Heap[]
Heap[]
x.child
x.child
x.child.sibling
Heap[].sibling
temp
Heap[]
1
12
0
Heap[]
x.child
25
0
x.child
12
1
012
1
Heap[]
nil
25
0
17.01.2003
12
1
012
1
Christian John / Tobias Berger
Nr.43
2. weitere Operationen
Binomiale Heaps
2.3 extract_min(h) - BEISPIEL
x.child
12
1
25
0
Heap[]
1
12
0
x.child
12
1
temp
Heap[]
Heap[]
x.child
x.child
x.child.sibling
Heap[].sibling
temp
25
0
25
0
17.01.2003
25
0
Christian John / Tobias Berger
temp
1
12
0
nil
Heap[]
temp
1
12
0
x.child
12
1
nil
Heap[]
x.child
12
1
temp
nil
Heap[]
temp
1
12
0
nil
Nr.44
2. weitere Operationen
Binomiale Heaps
2.4 decrease_key(h,x,k)
Gegeben: Element z, dessen Schlüssel man verkleinern will
Wenn der neue Wert k kleiner ist als der bisherige x, wird z so oft mit
seinem Vater getauscht, bis der Wert des Vater kleiner ist als k oder z
die Wurzel ist.
Dieses wird gemacht um die Heapstruktur wieder herzustellen.
Laufzeit: O(ld n)
17.01.2003
Christian John / Tobias Berger
Nr.45
2. weitere Operationen
Binomiale Heaps
2.4 decrease_key(h,x,k)
if k > key[x]
then error „new key is greater than current key“
key[x]
k
y
x
z
p[y]
while z
= nil
and key[y] < key[z]
do exchange key[y]
key[z]
//if y and z have satellite fields,exchange them,too
17.01.2003
y
z
z
p[y]
Christian John / Tobias Berger
Nr.46
2. weitere Operationen
Binomiale Heaps
2.4 decrease_key(h,x,k) - BEISPIEL
6
10
7
16
7
16
10
7
28
23
77
13
11
8
14
17
38
29
27
42
17.01.2003
Christian John / Tobias Berger
Nr.47
2. weitere Operationen
Binomiale Heaps
2.5 delete_key(h,x)
Gegeben: Element x, welches wir löschen wollen
Setze Wert von z auf decrease_key()
delete_minimum
Laufzeit: O(ld n)
17.01.2003
Christian John / Tobias Berger
Nr.48
Binomiale Heaps
Anwendungsbeispiel | 3
17.01.2003
Christian John / Tobias Berger
Nr.49
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
D
2
3
Gesucht: minimal spannender Baum
möglich mit binomialen Heaps?
4
E
5
C
7
1
8
A
B
6
17.01.2003
Christian John / Tobias Berger
Nr.50
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
D
2
3
4
E
C
5
7
1
8
A
B
6
A
6
1
A- B
A- E
7
A- C
B
8
5
B-C
B-E
6
B-A
C
3
2
E
1
C-D
D-E
7
4
3
2
5
C-A
C-E
D-C
E-D
E-B
8
C-B
17.01.2003
D
Christian John / Tobias Berger
E-A
4
E-C
Nr.51
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume - PSEUDOCODE
mst()
Aufwand
T <- nil
O( |E| * ld(|E|) )
foreach Knoten vi ? V
Ei <- make_heap()
union(Ei,{(vi,v):v ? E}
anz = |V|
while anz > 1
e = extract_min(E1)
if(e.anf, e.end liegen in versch Zuskomp)
anz = anz-1
T <- T+{e}
union (E1, Ei)
return T
17.01.2003
Christian John / Tobias Berger
Nr.52
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
D
2
3
4
E
C
5
7
1
8
A
B
6
A
6
1
A- B
A- E
7
A- C
B
8
5
B-C
B-E
6
B-A
C
3
17.01.2003
2
E
1
C-D
D-E
7
4
3
2
5
C-A
C-E
D-C
E-D
E-B
8
anz = 5
D
C-B
Christian John / Tobias Berger
E-A
4
E-C
Nr.53
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
A
6
1
A- B
E-A
7
2
5
A- C
E-D
E-B
A
5
B-C
B-E
C
6
B-A
nicht in
E-B
E-D
6
4
A- B
E-C
A- C
17.01.2003
D
2
C-D
D-E
7
4
3
C-A
C-E
D-C
E
nil
C-B
2
7
3
8
E-C
5
anz = 4
8
die Liste
4
anz = 4
B
B
8
5
B-C
B-E
6
B-A
C
3
D
2
C-D
D-E
7
4
3
C-A
C-E
D-C
E
nil
8
C-B
Christian John / Tobias Berger
Nr.54
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
A
2
4
D-E
E-C
3
6
5
D-C
A- B
E-B
A
5
B-C
B-E
C
6
B-A
nicht in
D-C
E-C
6
5
A- B
E-B
A- C
17.01.2003
D
E
nil
nil
7
4
C-A
C-E
8
C-B
4
7
3
C-D
A- C
3
anz = 3
8
die Liste
7
anz = 3
B
B
8
5
B-C
B-E
6
B-A
C
3
D
E
nil
nil
C-D
7
4
C-A
C-E
8
C-B
Christian John / Tobias Berger
Nr.55
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
A
B
3
anz = 2
C-D
4
7
4
E-C
C-A
C-E
6
5
8
A- B
E-B
C-B
7
C
8
5
B-C
B-E
D
nil
E
nil
nil
6
B-A
nicht in
die Liste
A
4
7
4
C-E
C-A
E-C
B
8
5
B-C
B-E
C
nil
D
A- C
8
6
5
C-B
A- B
E-B
7
anz = 2
17.01.2003
nil
6
nicht in
B-A
E
nil
die Liste
A- C
Christian John / Tobias Berger
Nr.56
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
A
4
6
C-E
A- B
5
7
7
E-B
C-A
A- C
A
8
5
B-C
B-E
C
D
nil
E
nil
nil
6
B-A
nicht in
die Liste
8
anz = 2
B
C-B
5
6
E-B
A- B
B
8
5
B-C
B-E
7
7
6
C-A
A- C
B-A
C
D
nil
E
nil
nil
8
anz =2
C-B
17.01.2003
Christian John / Tobias Berger
Nr.57
3. Anwendungsbeispiel Binomiale Heaps
3.1 minimal spannende Bäume
A
8
5
6
B-C
B-E
A- B
6
7
7
B-A
C-A
A- C
B
C
nil
D
nil
E
nil
nil
8
anz =1
C-B
D
2
3
E
C
1
minimal spannender Baum
5
A
17.01.2003
B
Christian John / Tobias Berger
Nr.58
Binomiale Heaps
Quellen:
http://www.olli.informatik.uni-oldenburg.de/BHeapA/index.html
http://www.informatik.uniulm.de/dbis/f&l/lehre/SS99/ProseminarSS99/BinomialHeap
s.pdf
http://www.uni-paderborn.de/cs/heiss/lehre/ws97/
ausarbeitungen/marquardt.ps.gz
http://www.informatik.uni-bonn.de/~meinard/papers/
Misc/merzenich98.ps
17.01.2003
Christian John / Tobias Berger
Nr.59
Herunterladen