7. Übung zu Algorithmen I 1.Juni2016 - crypto.iti.kit.edu · Roadmap I Ganzzahliges Sortieren mit...

112
7. Übung zu Algorithmen I 1. Juni 2016 Lukas Barth [email protected] (mit Folien von Lisa Kohl)

Transcript of 7. Übung zu Algorithmen I 1.Juni2016 - crypto.iti.kit.edu · Roadmap I Ganzzahliges Sortieren mit...

7. Übung zu Algorithmen I1. Juni 2016

Lukas [email protected]

(mit Folien von Lisa Kohl)

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

Haben wir da keinen Experten?

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!

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

Zusammenfassung

Priority QueuesI Bucket QueueI Radix Heap

Ganzzahliges SortierenI Für rationale Zahlen!