7. Übung zu Algorithmen I 1.Juni2016 - crypto.iti.kit.edu · Roadmap I Ganzzahliges Sortieren mit...
Transcript of 7. Übung zu Algorithmen I 1.Juni2016 - crypto.iti.kit.edu · Roadmap I Ganzzahliges Sortieren mit...
Roadmap
I Ganzzahliges Sortieren mit reellen Zahlen
I Schnellere Priority Queues
I Bucket QueueI Radix Heap
Organisatorisches
I Nächste Woche: Übungsklausur!
I Deshalb: Heute kein Übungsblatt!
I ÜB 6, Aufgabe 1b): dpartition ist kaputt
I Volle Punktzahl auf die 1bI Wir reparieren den Pseudocode
Organisatorisches
I Nächste Woche: Übungsklausur!
I Deshalb: Heute kein Übungsblatt!
I ÜB 6, Aufgabe 1b): dpartition ist kaputt
I Volle Punktzahl auf die 1bI Wir reparieren den Pseudocode
Erinnerung: Bucketsort
Procedure KSort(s : Sequence of Element)b=〈〈〉 , . . . , 〈〉〉 : Array [0..K − 1] of Sequence of Elementforeach e ∈ s do b[key(e)].pushBack(e)s := concatenation of b[0], . . . , b[K − 1]
Zeit: O(n + K )
s e
b[0] b[1] b[2] b[3] b[4]
Bucket Sort für [0, 1)
I Annahme: Zahlen uniform gleichverteilt im Intervall [0, 1)
I Vorgehen:1. teile Interval [0, 1) in n Buckets der gleichen Größe2. sortiere Eingabe in die Buckets3. sortiere die Zahlen in jedem Bucket (mit Insertionsort)
Bucket Sort für [0, 1)
I Annahme: Zahlen uniform gleichverteilt im Intervall [0, 1)
I Vorgehen:
1. teile Interval [0, 1) in n Buckets der gleichen Größe2. sortiere Eingabe in die Buckets3. sortiere die Zahlen in jedem Bucket (mit Insertionsort)
Bucket Sort für [0, 1)
I Annahme: Zahlen uniform gleichverteilt im Intervall [0, 1)
I Vorgehen:1. teile Interval [0, 1) in n Buckets der gleichen Größe
2. sortiere Eingabe in die Buckets3. sortiere die Zahlen in jedem Bucket (mit Insertionsort)
Bucket Sort für [0, 1)
I Annahme: Zahlen uniform gleichverteilt im Intervall [0, 1)
I Vorgehen:1. teile Interval [0, 1) in n Buckets der gleichen Größe2. sortiere Eingabe in die Buckets
3. sortiere die Zahlen in jedem Bucket (mit Insertionsort)
Bucket Sort für [0, 1)
I Annahme: Zahlen uniform gleichverteilt im Intervall [0, 1)
I Vorgehen:1. teile Interval [0, 1) in n Buckets der gleichen Größe2. sortiere Eingabe in die Buckets3. sortiere die Zahlen in jedem Bucket (mit Insertionsort)
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.90.11
0.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.90.11
0.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234
0.90.11
0.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.11
0.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.90.11
0.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.90.11
0.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.110.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.110.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.110.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56
0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.110.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.110.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.661
0.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.110.11
0.11
0.89
0.89
0.89
0.19
0.190.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.9
0.11
0.11
0.11
0.89
0.89
0.89
0.19
0.19
0.19
0.8
0.8
0.56 0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Beispiel
a = 0.234, 0.9, 0.11, 0.89, 0.19, 0.8, 0.56, 0.87, 0.661, 0.01
<0.1 <0.2 <0.3 <0.4 <0.5 <0.6 <0.7 <0.8 <0.9 ≥0.9
0.234 0.90.11
0.11
0.11
0.89
0.89
0.89
0.19
0.19
0.19
0.8
0.8
0.56
0.87
0.87
0.6610.01
Bucket Sort für [0, 1)Pseudocode
Function ibsort(a : Array of [0, 1)) : Array of [0, 1)n:= a. lengthfor i := 1 to n do
insert a[i ] into list b[bn · a[i ]c]for i := 0 to n − 1 do
sort list b[i ] with insertion sortconcatenate lists b[0], b[1], . . . and write result in array breturn b
Bucket Sort für [0, 1)Pseudocode
Function ibsort(a : Array of [0, 1)) : Array of [0, 1)n:= a. lengthfor i := 1 to n do
insert a[i ] into list b[bn · a[i ]c]
insert a[i ] into list b[bn · a[i ]c]
for i := 0 to n − 1 dosort list b[i ] with insertion sort
concatenate lists b[0], b[1], . . . and write result in array breturn b
Bucket Sort für [0, 1)Pseudocode
Function ibsort(a : Array of [0, 1)) : Array of [0, 1)n:= a. lengthfor i := 1 to n do
insert a[i ] into list b[bn · a[i ]c]for i := 0 to n − 1 do
sort list b[i ] with insertion sort
sort list b[i ] with insertion sort
concatenate lists b[0], b[1], . . . and write result in array breturn b
Bucket Sort für [0, 1)Pseudocode
Function ibsort(a : Array of [0, 1)) : Array of [0, 1)n:= a. lengthfor i := 1 to n do
insert a[i ] into list b[bn · a[i ]c]for i := 0 to n − 1 do
sort list b[i ] with insertion sortconcatenate lists b[0], b[1], . . . and write result in array b
concatenate lists b[0], b[1], . . . and write result in array b
return b
Bucket Sort für [0, 1)Laufzeit
I interessanter Teil: sort list b[i ] with insertion sort (?)
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I definiere Zufallsvariable Xij :
Xij =
1 falls Element j in Bucket i landet0 sonst
I definiere Zufallsvariable Xi für die Größe der Buckets i :
Xi =n∑
j=1
Xij
Bucket Sort für [0, 1)Laufzeit
I interessanter Teil: sort list b[i ] with insertion sort (?)
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I definiere Zufallsvariable Xij :
Xij =
1 falls Element j in Bucket i landet0 sonst
I definiere Zufallsvariable Xi für die Größe der Buckets i :
Xi =n∑
j=1
Xij
Bucket Sort für [0, 1)Laufzeit
I interessanter Teil: sort list b[i ] with insertion sort (?)
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I definiere Zufallsvariable Xij :
Xij =
1 falls Element j in Bucket i landet0 sonst
I definiere Zufallsvariable Xi für die Größe der Buckets i :
Xi =n∑
j=1
Xij
Bucket Sort für [0, 1)Laufzeit
I interessanter Teil: sort list b[i ] with insertion sort (?)
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I definiere Zufallsvariable Xij :
Xij =
1 falls Element j in Bucket i landet0 sonst
I definiere Zufallsvariable Xi für die Größe der Buckets i :
Xi =n∑
j=1
Xij
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]
=n∑
j=1E[Xij ]
=n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)I Erwartet konstante Länge!I Erwartet konstanter Aufwand pro InsertionsortI Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]=
n∑j=1
E[Xij ]
=n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)I Erwartet konstante Länge!I Erwartet konstanter Aufwand pro InsertionsortI Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]=
n∑j=1
E[Xij ]
=n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)
I Erwartet konstante Länge!I Erwartet konstanter Aufwand pro InsertionsortI Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]=
n∑j=1
E[Xij ] =n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)
I Erwartet konstante Länge!I Erwartet konstanter Aufwand pro InsertionsortI Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]=
n∑j=1
E[Xij ] =n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)I Erwartet konstante Länge!
I Erwartet konstanter Aufwand pro InsertionsortI Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]=
n∑j=1
E[Xij ] =n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)I Erwartet konstante Länge!I Erwartet konstanter Aufwand pro Insertionsort
I Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Laufzeit
I E[Xi ] = E
[n∑
j=1Xij
]=
n∑j=1
E[Xij ] =n∑
j=1
1n
= 1
I jedes Element landet mit Wkt. p := 1/n in b[i ]
I E[Xij ] = 1 · 1n
+ 0 ·(1− 1
n
)I Erwartet konstante Länge!I Erwartet konstanter Aufwand pro InsertionsortI Erwartet O(n) insgesamt
Bucket Sort für [0, 1)Was ist mit der Schranke?
I Haben wir jetzt die Ω (n log n)-Schranke ausgetrickst?
I Nein! Wir haben Gleichverteilung angenommen!
Bucket Sort für [0, 1)Was ist mit der Schranke?
I Haben wir jetzt die Ω (n log n)-Schranke ausgetrickst?I Nein! Wir haben Gleichverteilung angenommen!
Sortieren - Auf einen Blick
Worst Case Erwartet BemerkungInsertionsort O(n2) O(n2) stabilQuicksort O(n2) O(n log n) in-placeMergesort O(n log n) O(n log n) stabilBucketsort O(n + k) O(n + k) k : Anzahl
möglicher SchlüsselRadixsort O(d(n + K )) O(d(n + K )) d = logK (max)
Bubblesort O(n2) O(n2) stabil
Thanks Obama!
Sortieren - Auf einen Blick
Worst Case Erwartet BemerkungInsertionsort O(n2) O(n2) stabilQuicksort O(n2) O(n log n) in-placeMergesort O(n log n) O(n log n) stabilBucketsort O(n + k) O(n + k) k : Anzahl
möglicher SchlüsselRadixsort O(d(n + K )) O(d(n + K )) d = logK (max)Bubblesort O(n2) O(n2) stabil
Thanks Obama!
Sortieren - Auf einen Blick
Worst Case Erwartet BemerkungInsertionsort O(n2) O(n2) stabilQuicksort O(n2) O(n log n) in-placeMergesort O(n log n) O(n log n) stabilBucketsort O(n + k) O(n + k) k : Anzahl
möglicher SchlüsselRadixsort O(d(n + K )) O(d(n + K )) d = logK (max)Bubblesort O(n2) O(n2) stabil
Thanks Obama!
Priority QueuesErinnerung
Operation Binary Heap Fibonacci Heap (Buch)build O(n) O(n)size O(1) O(1)min O(1) O(1)insert O(log n) O(1)deleteMin O(log n) O(log n)remove O(log n) O(log n)decreaseKey O(log n) O(1) am.merge O(n) O(1)
Priority QueuesZwei Annahmen
MonotonizitätI Für ein einzufügendes v und das aktuelle Minimum min
gelte:v ≥ min
Beschränkte SpanneI Für ein einzufügendes v und ein (a priori bekanntes) C
gelte:v < min+C
I Alle Werte sind ganzzahlig
Priority QueuesZwei Annahmen
MonotonizitätI Für ein einzufügendes v und das aktuelle Minimum min
gelte:v ≥ min
Beschränkte SpanneI Für ein einzufügendes v und ein (a priori bekanntes) C
gelte:v < min+C
I Alle Werte sind ganzzahlig
Bucket QueueEin erster Ansatz
mod 12
01
2
3
456
7
8
9
10
11
I Zyklisches Array derGröße C
I Feld i : AlleElemente x , für diex ≡ i mod C
I min-Pointer
Bucket QueueEin erster Ansatz
I Zyklisches Array derGröße C
I Feld i : AlleElemente x , für diex ≡ i mod C
I min-Pointer
Bucket QueueEin erster Ansatz
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
I Zyklisches Array derGröße C
I Feld i : AlleElemente x , für diex ≡ i mod C
I min-Pointer
Bucket QueueEin erster Ansatz
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
25I Zyklisches Array der
Größe C
I Feld i : AlleElemente x , für diex ≡ i mod C
I min-Pointer
Bucket QueueEin erster Ansatz
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
25 I Zyklisches Array derGröße C
I Feld i : AlleElemente x , für diex ≡ i mod C
I min-Pointer
Bucket QueueEin erster Ansatz
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
min
25 I Zyklisches Array derGröße C
I Feld i : AlleElemente x , für diex ≡ i mod C
I min-Pointer
Bucket Queueinsert
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
min
25
I EineModulo-Rechnung,eine Listenoperation
I O(1)
Bucket QueuedeleteMin
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
min
25
I Wenn min-Feld nichtleer: EineListenoperation
I Wenn min-Feld leer:min maximal C malinkrementieren
I O(C )
Bucket QueuedeleteMin
mod 12
01
2
3
456
7
8
9
10
11
13
1515
1718
min
25
I Wenn min-Feld nichtleer: EineListenoperation
I Wenn min-Feld leer:min maximal C malinkrementieren
I O(C )
Binary Radix Heap
IdeeI Wir wollen O(logC ) LaufzeitenI C unterschiedliche Werte können mit log2 C Bits
unterschieden werdenI Felder ≈ Bits?
Most Significant Differencemsd(x , y) := höchstwertiges Bit, in dem dieBinärdarstellungen von x und y sich unterscheiden
60 = 1 1 1 0 042 = 1 1 0 1 0
msd(60, 42) = 4
Binary Radix Heap
IdeeI Wir wollen O(logC ) LaufzeitenI C unterschiedliche Werte können mit log2 C Bits
unterschieden werdenI Felder ≈ Bits?
Most Significant Differencemsd(x , y) := höchstwertiges Bit, in dem dieBinärdarstellungen von x und y sich unterscheiden
60 = 1 1 1 0 042 = 1 1 0 1 0
msd(60, 42) = 4
Binary Radix Heap
IdeeI Wir wollen O(logC ) LaufzeitenI C unterschiedliche Werte können mit log2 C Bits
unterschieden werdenI Felder ≈ Bits?
Most Significant Differencemsd(x , y) := höchstwertiges Bit, in dem dieBinärdarstellungen von x und y sich unterscheiden
60 = 1 1 1 1 0 042 = 1 0 1 0 1 0
msd(60, 42) = 4
Binary Radix Heap
IdeeI Wir wollen O(logC ) LaufzeitenI C unterschiedliche Werte können mit log2 C Bits
unterschieden werdenI Felder ≈ Bits?
Most Significant Differencemsd(x , y) := höchstwertiges Bit, in dem dieBinärdarstellungen von x und y sich unterscheiden
60 = 1 1 1 1 0 042 = 1 0 1 0 1 0
msd(60, 42) = 4
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9
16→ 10000
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9
16→ 10000
16
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 16
10→ 01010
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 16
10→ 01010
10
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11→ 01011
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11→ 01011
11
Binary Radix Heap
DatenstrukturI K = dlogCe+ 1 Buckets, nummeriert −1, 0, 1, . . . logCI Minimale Elemente in Bucket −1I Element x > min gehört in Bucket msd(min, x)
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11
Binary Radix HeapSchummelei
Sei C = 16. Was ist mit diesen Zahlen:511 = 111111111512 = 1000000000
I Offenbar ist msd(511, 512) = 9I Aber wir haben nur dlog2 16e+ 1 = 5 Buckets?
511 = 111111111511 + 1 = 1000000000511 + 2 = 1000000001
...511 + 16 = 1000001111
Binary Radix HeapSchummelei
Sei C = 16. Was ist mit diesen Zahlen:511 = 111111111512 = 1000000000
I Offenbar ist msd(511, 512) = 9I Aber wir haben nur dlog2 16e+ 1 = 5 Buckets?
511 = 111111111511 + 1 = 1000000000511 + 2 = 1000000001
...511 + 16 = 1000001111
Binary Radix HeapSchummelei
Sei C = 16. Was ist mit diesen Zahlen:511 = 111111111512 = 1000000000
I Offenbar ist msd(511, 512) = 9I Aber wir haben nur dlog2 16e+ 1 = 5 Buckets?
511 = 111111111511 + 1 = 1000000000511 + 2 = 1000000001
...511 + 16 = 1000001111
Binary Radix Heapinsert
Bestimmen von msd(min, x)I Kombination aus XOR, Logarithmus und AbrundenI Können Prozessoren in konstanter Zeit...
I Eigentlich ist das geschummelt...
Ins richtige Bucket einfügenI Nur noch Listenoperation
Binary Radix Heapinsert
Bestimmen von msd(min, x)I Kombination aus XOR, Logarithmus und AbrundenI Können Prozessoren in konstanter Zeit...
I Eigentlich ist das geschummelt...
Ins richtige Bucket einfügenI Nur noch Listenoperation
Binary Radix Heapinsert
Bestimmen von msd(min, x)I Kombination aus XOR, Logarithmus und AbrundenI Können Prozessoren in konstanter Zeit...
I Eigentlich ist das geschummelt...
Ins richtige Bucket einfügenI Nur noch Listenoperation
Binary Radix HeapdeleteMin
Fall 1: Bucket -1 nicht leerI Ein Element daraus zurückgeben
Fall 2: Bucket -1 leerI Nächstes nicht-leeres Bucket suchenI Kleinste(s) Element(e) daraus zum Minimum erklären und
nach -1 verschieben
I Was ist mit der Invariante...?
Binary Radix HeapdeleteMin
Fall 1: Bucket -1 nicht leerI Ein Element daraus zurückgeben
Fall 2: Bucket -1 leerI Nächstes nicht-leeres Bucket suchenI Kleinste(s) Element(e) daraus zum Minimum erklären und
nach -1 verschieben
I Was ist mit der Invariante...?
Binary Radix HeapdeleteMin
Fall 1: Bucket -1 nicht leerI Ein Element daraus zurückgeben
Fall 2: Bucket -1 leerI Nächstes nicht-leeres Bucket suchenI Kleinste(s) Element(e) daraus zum Minimum erklären und
nach -1 verschiebenI Was ist mit der Invariante...?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
1610
11
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
1610
11
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
16
11
10
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
16
11
10
01010 01011 0100*
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
16
11
10
01010 01011 0100*
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
16
11
10
01010 01011 0100*
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
1610
01010 01011 0100*
11
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
1610
01010 01011 0100*
11
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschoben
I Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
1610
01010 01011 0100*
11
I Nur Elemente eines Buckets müssen betrachtet werdenI Diese werden alle mindestens um einen Bucket verschobenI Wie oft kann ein Element verschoben werden?
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!
I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro ElementI Zahle logC beim Entfernen des entsprechenden Elements
ein
Kosten für deleteMin
I O(logC ) zum finden eines gefüllten BucketsI O(logC ) Einzahlung in die AmortisationI Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro Element
I Zahle logC beim Entfernen des entsprechenden Elementsein
Kosten für deleteMin
I O(logC ) zum finden eines gefüllten BucketsI O(logC ) Einzahlung in die AmortisationI Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro ElementI Zahle logC beim Entfernen des entsprechenden Elements
ein
Kosten für deleteMin
I O(logC ) zum finden eines gefüllten BucketsI O(logC ) Einzahlung in die AmortisationI Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro ElementI Zahle logC beim Entfernen des entsprechenden Elements
ein
Kosten für deleteMinI O(logC ) zum finden eines gefüllten Buckets
I O(logC ) Einzahlung in die AmortisationI Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro ElementI Zahle logC beim Entfernen des entsprechenden Elements
ein
Kosten für deleteMinI O(logC ) zum finden eines gefüllten BucketsI O(logC ) Einzahlung in die Amortisation
I Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro ElementI Zahle logC beim Entfernen des entsprechenden Elements
ein
Kosten für deleteMinI O(logC ) zum finden eines gefüllten BucketsI O(logC ) Einzahlung in die AmortisationI Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapdeleteMin - Amortisierung
I Jedes betrachtete Element wird verschoben!I Pro Element: maximal logC Mal verschiebenI Gesamtkosten logC pro ElementI Zahle logC beim Entfernen des entsprechenden Elements
ein
Kosten für deleteMinI O(logC ) zum finden eines gefüllten BucketsI O(logC ) Einzahlung in die AmortisationI Kosten fürs Verteilen des Buckets: Wird noch bezahlt!
⇒ O(logC ) amortisiert
Binary Radix HeapUnd was ist mit C?
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11
Warum kann man keine Elemente x > min+C ins letzteBucket einfügen?
I Angenommen, im letzten Bucket sind sehr große ElementeI ... und wir müssen das letzte Bucket leeren und
umverteilen...I Dann können welche übrig bleiben!I Das durfte aber in der Amortisierung nicht passieren!
Binary Radix HeapUnd was ist mit C?
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11
Warum kann man keine Elemente x > min+C ins letzteBucket einfügen?
I Angenommen, im letzten Bucket sind sehr große ElementeI ... und wir müssen das letzte Bucket leeren und
umverteilen...
I Dann können welche übrig bleiben!I Das durfte aber in der Amortisierung nicht passieren!
Binary Radix HeapUnd was ist mit C?
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11
Warum kann man keine Elemente x > min+C ins letzteBucket einfügen?
I Angenommen, im letzten Bucket sind sehr große ElementeI ... und wir müssen das letzte Bucket leeren und
umverteilen...I Dann können welche übrig bleiben!
I Das durfte aber in der Amortisierung nicht passieren!
Binary Radix HeapUnd was ist mit C?
01001 01000 0101* 011** 00*** 1**** ≥ 100000
−1 0 1 2 3 4 5
9 1610
11
Warum kann man keine Elemente x > min+C ins letzteBucket einfügen?
I Angenommen, im letzten Bucket sind sehr große ElementeI ... und wir müssen das letzte Bucket leeren und
umverteilen...I Dann können welche übrig bleiben!I Das durfte aber in der Amortisierung nicht passieren!
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
9
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
9
16→ 0121
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
9
16→ 0121
16
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
9 16
13→ 0111
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
9 16
13→ 0111
13
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
16
13
0121
0111
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
16130111
0121
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
16
0111 011[0,2] 01[0,2]*
130111
0121
16 hat sich nicht bewegt! E
Binary Radix HeapWarum nicht ternäre Radix Heaps...?
Behauptung: Das ganze wird kompakter, wenn man Basis 3wählt!
0100 010[1,2] 01[1,2]* 0[0,2]** [1,2]** ≥ 100000
−1 0 1 2 3 4
16
0111 011[0,2] 01[0,2]*
130111
0121
16 hat sich nicht bewegt! E
Schnelle HeapsZusammenfassung
VoraussetzungenI MonotonizitätI Beschränkte Spanne
Bucket Queueinsert O(1)
deleteMin O(C )
Radix Heapinsert O(1)
deleteMin O(logC ) amortisiert