Algorithmen und Datenstrukturen

Werbung
SS15
Algorithmen und Datenstrukturen
6. Kapitel
Sortieralgorithmen
Martin Dietzfelbinger
Mai 2015
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
6.1 Erinnerung, Grundbegriffe
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
1
6.1 Erinnerung, Grundbegriffe
a1
a2
a3
an
10
1
4
5
1
9
4
1
8
US
SO
RA
OR
RT
HM
LG
IE
IT
Item:
Schlüssel
Daten:
1
1
1
4
4
5
8
9
10
SO
RT
IE
RA
LG
OR
IT
HM
US
x
"key"
dat
"data"
"Stabilität"
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
1
Sortierproblem, abstrakt: Siehe Kapitel 1.
Input: Array A[1..n],
Einträge sind Objekte mit Schlüssel- und Datenteil:
A[i].key und A[i].data.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
2
Sortierproblem, abstrakt: Siehe Kapitel 1.
Input: Array A[1..n],
Einträge sind Objekte mit Schlüssel- und Datenteil:
A[i].key und A[i].data.
Achtung: In Bildern unterdrücken wir oft den Datenteil. Das Objekt wird
also einfach als Schlüssel dargestellt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
2
Sortierproblem, abstrakt: Siehe Kapitel 1.
Input: Array A[1..n],
Einträge sind Objekte mit Schlüssel- und Datenteil:
A[i].key und A[i].data.
Achtung: In Bildern unterdrücken wir oft den Datenteil. Das Objekt wird
also einfach als Schlüssel dargestellt.
Schon gesehen: Sortieralgorithmus Straight Insertion Sort.
Bei Vorkommen gleicher Sortierschlüssel: Sortierverfahren
heißt stabil, wenn Objekte mit identischen Schlüsseln in der
Ausgabe in derselben Reihenfolge stehen wie in der Eingabe.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
2
Maßzahlen für Sortieralgorithmen:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Maßzahlen für Sortieralgorithmen:
In Abhängigkeit von n fragen wir nach:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Maßzahlen für Sortieralgorithmen:
In Abhängigkeit von n fragen wir nach:
1. Laufzeit (in O-Notation);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Maßzahlen für Sortieralgorithmen:
In Abhängigkeit von n fragen wir nach:
1. Laufzeit (in O-Notation);
2. Anzahl der Vergleiche ( wesentliche Vergleiche“)
”
A[i].key < A[j].key“
”
FG KTuEA, TU Ilmenau
bzw. A[i].key ≤ A[j].key“;
”
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Maßzahlen für Sortieralgorithmen:
In Abhängigkeit von n fragen wir nach:
1. Laufzeit (in O-Notation);
2. Anzahl der Vergleiche ( wesentliche Vergleiche“)
”
A[i].key < A[j].key“
”
bzw. A[i].key ≤ A[j].key“;
”
3. Anzahl der Datenverschiebungen oder Kopiervorgänge
(wichtig bei sehr umfangreichen Objekten);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Maßzahlen für Sortieralgorithmen:
In Abhängigkeit von n fragen wir nach:
1. Laufzeit (in O-Notation);
2. Anzahl der Vergleiche ( wesentliche Vergleiche“)
”
A[i].key < A[j].key“
”
bzw. A[i].key ≤ A[j].key“;
”
3. Anzahl der Datenverschiebungen oder Kopiervorgänge
(wichtig bei sehr umfangreichen Objekten);
4. der neben dem Array A[1..n] (bzw. der zu sortierenden
Liste) benötigte Speicherplatz;
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Maßzahlen für Sortieralgorithmen:
In Abhängigkeit von n fragen wir nach:
1. Laufzeit (in O-Notation);
2. Anzahl der Vergleiche ( wesentliche Vergleiche“)
”
A[i].key < A[j].key“
”
bzw. A[i].key ≤ A[j].key“;
”
3. Anzahl der Datenverschiebungen oder Kopiervorgänge
(wichtig bei sehr umfangreichen Objekten);
4. der neben dem Array A[1..n] (bzw. der zu sortierenden
Liste) benötigte Speicherplatz;
wenn dieser nur O(1), also von n unabhängig, ist:
Algorithmus arbeitet in situ“ oder in-place“.
”
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
Straight Insertion Sort:
1
2 n(n
n2
2
− 1) ≈
Vergleiche
Schlechtester Fall:
(kann auch vorkommen); Zeit Θ(n2).
Bester Fall: n − 1 Vergleiche, Zeit Θ(n).
Durchschnittlicher Fall, alle Eingabereihenfolgen gleich
wahrscheinlich: Zeit Θ(n2).
Stabil, in situ.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
4
6.2 Mergesort
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
5
6.2 Mergesort
(engl. merge = vermengen, reißverschlussartig zusammenfügen)
Algorithmenparadigma oder -schema:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
5
6.2 Mergesort
(engl. merge = vermengen, reißverschlussartig zusammenfügen)
Algorithmenparadigma oder -schema:
Divide-and-Conquer“ (D-a-C)
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
5
6.2 Mergesort
(engl. merge = vermengen, reißverschlussartig zusammenfügen)
Algorithmenparadigma oder -schema:
Divide-and-Conquer“ (D-a-C)
”
( teile und herrsche“)
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
5
MergeSort ist
Sortierproblem.
FG KTuEA, TU Ilmenau
konkreter
D-a-C-Algorithmus
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
für
das
6
MergeSort ist
Sortierproblem.
konkreter
D-a-C-Algorithmus
für
das
Lege eine Trivialitätsschranke n0 ≥ 1 fest.
(Einfachster Fall: n0 = 1, für n = 1 ist nichts zu tun.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
6
MergeSort ist
Sortierproblem.
konkreter
D-a-C-Algorithmus
für
das
Lege eine Trivialitätsschranke n0 ≥ 1 fest.
(Einfachster Fall: n0 = 1, für n = 1 ist nichts zu tun.)
Falls 2 ≤ n ≤ n0:
Sortiere mit einem naiven Algorithmus (z. B. Straight Insertion Sort).
Sonst:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
6
MergeSort ist
Sortierproblem.
konkreter
D-a-C-Algorithmus
für
das
Lege eine Trivialitätsschranke n0 ≥ 1 fest.
(Einfachster Fall: n0 = 1, für n = 1 ist nichts zu tun.)
Falls 2 ≤ n ≤ n0:
Sortiere mit einem naiven Algorithmus (z. B. Straight Insertion Sort).
Sonst:
Teilen: Setze m := dn/2e.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
6
MergeSort ist
Sortierproblem.
konkreter
D-a-C-Algorithmus
für
das
Lege eine Trivialitätsschranke n0 ≥ 1 fest.
(Einfachster Fall: n0 = 1, für n = 1 ist nichts zu tun.)
Falls 2 ≤ n ≤ n0:
Sortiere mit einem naiven Algorithmus (z. B. Straight Insertion Sort).
Sonst:
Teilen: Setze m := dn/2e.
Rekursion für Teilprobleme:
Sortiere a1, . . . , am rekursiv, Ergebnis a01, . . . , a0m;
sortiere am+1, . . . , an rekursiv, Ergebnis a0m+1, . . . , a0n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
6
MergeSort ist
Sortierproblem.
konkreter
D-a-C-Algorithmus
für
das
Lege eine Trivialitätsschranke n0 ≥ 1 fest.
(Einfachster Fall: n0 = 1, für n = 1 ist nichts zu tun.)
Falls 2 ≤ n ≤ n0:
Sortiere mit einem naiven Algorithmus (z. B. Straight Insertion Sort).
Sonst:
Teilen: Setze m := dn/2e.
Rekursion für Teilprobleme:
Sortiere a1, . . . , am rekursiv, Ergebnis a01, . . . , a0m;
sortiere am+1, . . . , an rekursiv, Ergebnis a0m+1, . . . , a0n.
Kombinieren:
Mische“ die Folgen a01, . . . , a0m und a0m+1, . . . , a0n zu einer
”
sortierten Folge zusammen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
6
Prozedur r MergeSort(a, b):
A:
a
5
b
m
7
2
3
6
3
1
a
2
FG KTuEA, TU Ilmenau
2
b
m
3
5
6
3
Rekur−
sion
Rekur−
sion
A:
5
7
1
2
3
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3
5
7
Prozedur r MergeSort(a, b):
A:
a
5
b
m
7
2
3
6
3
1
a
2
2
b
m
3
5
6
3
Rekur−
sion
Rekur−
sion
A:
5
7
1
2
3
3
5
Aufteilen von A[a . . . b] in A[a . . . m] und A[m + 1 . . . b].
Rekursives Sortieren der beiden Segmente.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
7
Prozedur r MergeSort(a, b):
A:
a
5
b
m
7
2
3
6
3
1
a
2
2
b
m
3
5
6
3
Rekur−
sion
Rekur−
sion
A:
5
7
1
2
3
3
5
Aufteilen von A[a . . . b] in A[a . . . m] und A[m + 1 . . . b].
Rekursives Sortieren der beiden Segmente.
Dann: Merge(a, m, b).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
7
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
(3)
else
(4)
m ← b(a + b)/2c;
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
(3)
else
(4)
m ← b(a + b)/2c;
(5)
if a < m then r MergeSort(a, m);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
(3)
else
(4)
m ← b(a + b)/2c;
(5)
if a < m then r MergeSort(a, m);
(6)
if m + 1 < b then r MergeSort(m + 1, b);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
(3)
else
(4)
m ← b(a + b)/2c;
(5)
if a < m then r MergeSort(a, m);
(6)
if m + 1 < b then r MergeSort(m + 1, b);
(7)
Merge(a, m, b) // benutzt Hilfsarray B[1..n]
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
(3)
else
(4)
m ← b(a + b)/2c;
(5)
if a < m then r MergeSort(a, m);
(6)
if m + 1 < b then r MergeSort(m + 1, b);
(7)
Merge(a, m, b) // benutzt Hilfsarray B[1..n]
Prozedur MergeSort(A[1..n])
// sortiert A[1..n]
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Datenstruktur: 2 Arrays A[1..n] (Ein-/Ausgabe), B[1..n] (Hilfsarray)
Prozedur r MergeSort(a, b)
// für 1 ≤ a < b ≤ n, sortiert A[a..b]
(1)
if b − a ≤ n0
(2)
then StraightInsertionSort(a, b)
(3)
else
(4)
m ← b(a + b)/2c;
(5)
if a < m then r MergeSort(a, m);
(6)
if m + 1 < b then r MergeSort(m + 1, b);
(7)
Merge(a, m, b) // benutzt Hilfsarray B[1..n]
Prozedur MergeSort(A[1..n])
// sortiert A[1..n]
(1)
if n ≤ n0
(2)
then StraightInsertionSort(1, n)
(3)
else r MergeSort(1, n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
8
Benötigt: Prozedur Merge(a, m, b), 1 ≤ a ≤ m < b ≤ n
die folgendes tut:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
9
Benötigt: Prozedur Merge(a, m, b), 1 ≤ a ≤ m < b ≤ n
die folgendes tut:
Voraussetzung: A[a . . m] und A[m + 1 . . b] sind sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
9
Benötigt: Prozedur Merge(a, m, b), 1 ≤ a ≤ m < b ≤ n
die folgendes tut:
Voraussetzung: A[a . . m] und A[m + 1 . . b] sind sortiert.
Resultat: A[a . . b] ist sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
9
Benötigt: Prozedur Merge(a, m, b), 1 ≤ a ≤ m < b ≤ n
die folgendes tut:
Voraussetzung: A[a . . m] und A[m + 1 . . b] sind sortiert.
Resultat: A[a . . b] ist sortiert.
Ansatz: Quasiparalleler Durchlauf durch die Teilarrays:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
9
Benötigt: Prozedur Merge(a, m, b), 1 ≤ a ≤ m < b ≤ n
die folgendes tut:
Voraussetzung: A[a . . m] und A[m + 1 . . b] sind sortiert.
Resultat: A[a . . b] ist sortiert.
Ansatz: Quasiparalleler Durchlauf durch die Teilarrays:
Reißverschlussverfahren“.
”
Benutze Hilfsarray B[a . . b] für das Ergebnis.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
9
a
b
m
2
3
5
6
7
1
2
3
3
5
1
2
2
3
3
3
5
5
6
7
a
FG KTuEA, TU Ilmenau
m
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
b
10
a
b
m
2
3
5
6
7
1
2
3
3
5
1
2
2
3
3
3
5
5
6
7
a
m
b
Mischen von A[a . . . m] und A[m + 1 . . . b].
Rote Pfeile: i–k-Paare in Zeile (6).
Grüne Pfeile: j–k-Paare in Zeile (7).
Blaue Pfeile: i–k-Paare in Zeile (8), Kopieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
10
Prozedur Merge(a, m, b)
// für 1 ≤ a ≤ m < b ≤ n, sortiert A[a..b],
// nimmt an, dass A[a..m] und A[m + 1..b] sortiert sind.
(1)
i ← a;
// Index in A[a..m]
(2)
j ← m + 1; // Index in A[m + 1..b]
(3)
k ← a;
// Index in B[a..b]
(4)
while i ≤ m and j ≤ b do
(5)
if A[i] ≤ A[j]
(6)
then B[k] ← A[i]; i++; k++
(7)
else B[k] ← A[j]; j++; k++
// verbleibendes Schlussstück kopieren:
(8)
while i ≤ m do B[k] ← A[i]; i++; k++;
(9)
while j ≤ b do B[k] ← A[j]; j++; k++;
// B[a..b] nach A[a..b] kopieren:
(10) for k from a to b do A[k] ← B[k].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
11
Eigenschaften von Prozedur Merge(a, m, b):
• korrekt;
• höchstens b − a Schlüsselvergleiche
(bei jedem Vergleich ein Transport, am Ende mindestens ein Eintrag übrig);
• Zeitbedarf Θ(b − a);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
12
Eigenschaften von Prozedur Merge(a, m, b):
• korrekt;
• höchstens b − a Schlüsselvergleiche
(bei jedem Vergleich ein Transport, am Ende mindestens ein Eintrag übrig);
• Zeitbedarf Θ(b − a);
• Merge ist stabil
(Vergleichsmodus Zeile (5) bevorzugt linkes Teilarray).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
12
Eigenschaften von Prozedur Merge(a, m, b):
• korrekt;
• höchstens b − a Schlüsselvergleiche
(bei jedem Vergleich ein Transport, am Ende mindestens ein Eintrag übrig);
• Zeitbedarf Θ(b − a);
• Merge ist stabil
(Vergleichsmodus Zeile (5) bevorzugt linkes Teilarray).
Satz 6.2.1
MergeSort(A[1..n]) sortiert A[1..n] stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
12
Eigenschaften von Prozedur Merge(a, m, b):
• korrekt;
• höchstens b − a Schlüsselvergleiche
(bei jedem Vergleich ein Transport, am Ende mindestens ein Eintrag übrig);
• Zeitbedarf Θ(b − a);
• Merge ist stabil
(Vergleichsmodus Zeile (5) bevorzugt linkes Teilarray).
Satz 6.2.1
MergeSort(A[1..n]) sortiert A[1..n] stabil.
Beweis: Durch Induktion über rekursive Aufrufe von
r MergeSort(a, b) zeigt man, dass diese Prozedur das betreffende Teilarray stabil sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
12
Zeitanalyse von Mergesort über Rekurrenzgleichungen“:
”
Wir zählen nur Vergleiche.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
13
Zeitanalyse von Mergesort über Rekurrenzgleichungen“:
”
Wir zählen nur Vergleiche.
C(n) = Anzahl der Vergleiche beim Sortieren von n Eingaben,
schlechtester Fall.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
13
Zeitanalyse von Mergesort über Rekurrenzgleichungen“:
”
Wir zählen nur Vergleiche.
C(n) = Anzahl der Vergleiche beim Sortieren von n Eingaben,
schlechtester Fall.
C(1) = 0, C(2) = 1, C(3) = 3.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
13
Zeitanalyse von Mergesort über Rekurrenzgleichungen“:
”
Wir zählen nur Vergleiche.
C(n) = Anzahl der Vergleiche beim Sortieren von n Eingaben,
schlechtester Fall.
C(1) = 0, C(2) = 1, C(3) = 3.
C(n) = C(dn/2e) + C(bn/2c) + n − 1.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
13
Zeitanalyse von Mergesort über Rekurrenzgleichungen“:
”
Wir zählen nur Vergleiche.
C(n) = Anzahl der Vergleiche beim Sortieren von n Eingaben,
schlechtester Fall.
C(1) = 0, C(2) = 1, C(3) = 3.
C(n) = C(dn/2e) + C(bn/2c) + n − 1.
Ausrechnen von Hand liefert:
n
C(n)
1
0
2
1
FG KTuEA, TU Ilmenau
3
3
4
5
5
8
6
11
7
14
8
17
9
21
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
10
25
11
29
12
33
13
37
14
41
13
...
...
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
FG KTuEA, TU Ilmenau
1
0
2
1
4
5
8
17
16
49
32
129
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
64
321
...
...
14
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
n
C(n)
1
0
2
1
FG KTuEA, TU Ilmenau
3
3
4
5
5
8
6
11
7
14
8
17
9
21
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
10
25
11
29
12
33
13
37
14
41
14
...
...
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
n
C(n)
1
0
2
1
3
3
4
5
5
8
6
11
7
14
8
17
9
21
10
25
11
29
12
33
13
37
14
41
Zwischen 2k−1 und 2k jeweils Zuwachs um k.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
...
...
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
n
C(n)
1
0
2
1
3
3
4
5
5
8
6
11
7
14
8
17
9
21
10
25
11
29
12
33
13
37
14
41
Zwischen 2k−1 und 2k jeweils Zuwachs um k.
Damit Vermutung: Für 2k−1 < n ≤ 2k , d. h. k = dlog ne:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
...
...
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
n
C(n)
1
0
2
1
3
3
4
5
5
8
6
11
7
14
8
17
9
21
10
25
11
29
12
33
13
37
14
41
Zwischen 2k−1 und 2k jeweils Zuwachs um k.
Damit Vermutung: Für 2k−1 < n ≤ 2k , d. h. k = dlog ne:
C(n) = (k − 2)2k−1 + 1 +
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
...
...
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
n
C(n)
1
0
2
1
3
3
4
5
5
8
6
11
7
14
8
17
9
21
10
25
11
29
12
33
13
37
14
41
Zwischen 2k−1 und 2k jeweils Zuwachs um k.
Damit Vermutung: Für 2k−1 < n ≤ 2k , d. h. k = dlog ne:
C(n) = (k − 2)2k−1 + 1 + (n − 2k−1)k
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
...
...
Zunächst: Zweierpotenzen n = 2k , k ≥ 0.
n
C(n)
1
0
2
1
4
5
8
17
16
49
32
129
64
321
...
...
Geratene Beobachtung: k ≥ 0 ⇒ C(2k ) = (k − 1) · 2k + 1.
(Kann durch Induktion über k bewiesen werden.)
n
C(n)
1
0
2
1
3
3
4
5
5
8
6
11
7
14
8
17
9
21
10
25
11
29
12
33
13
37
14
41
Zwischen 2k−1 und 2k jeweils Zuwachs um k.
Damit Vermutung: Für 2k−1 < n ≤ 2k , d. h. k = dlog ne:
C(n) = (k − 2)2k−1 + 1 + (n − 2k−1)k = nk − 2k + 1.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
14
...
...
Satz 6.2.2
C(n) = ndlog ne − 2dlog ne + 1, für n ≥ 1.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
15
Satz 6.2.2
C(n) = ndlog ne − 2dlog ne + 1, für n ≥ 1.
Beweis: Induktion über n, unter Benutzung der Behauptung“
”
k
für n = 2 .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
15
Satz 6.2.2
C(n) = ndlog ne − 2dlog ne + 1, für n ≥ 1.
Beweis: Induktion über n, unter Benutzung der Behauptung“
”
k
für n = 2 .
Details (für Interessierte): Druckfolien.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
15
Satz 6.2.2
C(n) = ndlog ne − 2dlog ne + 1, für n ≥ 1.
Beweis: Induktion über n, unter Benutzung der Behauptung“
”
k
für n = 2 .
Details (für Interessierte): Druckfolien.
Korollar 6.2.3
C(n) ≤ n log n, für n ≥ 1.
Korollar 6.2.4
Die Rechenzeit von Mergesort ist Θ(n log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
15
Variante 1: (Sollte man immer anwenden)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
16
Variante 1: (Sollte man immer anwenden)
Ziel: Überproportional hohen Zeitaufwand für die vielen
rekursiven Aufrufe bei kleinen Teilarrays vermeiden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
16
Variante 1: (Sollte man immer anwenden)
Ziel: Überproportional hohen Zeitaufwand für die vielen
rekursiven Aufrufe bei kleinen Teilarrays vermeiden.
Strategie: In r MergeSort kleine Teilarrays (b − a ≤ n0)
durch (z. B.) StraightInsertionSort sortieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
16
Variante 1: (Sollte man immer anwenden)
Ziel: Überproportional hohen Zeitaufwand für die vielen
rekursiven Aufrufe bei kleinen Teilarrays vermeiden.
Strategie: In r MergeSort kleine Teilarrays (b − a ≤ n0)
durch (z. B.) StraightInsertionSort sortieren.
Das optimale n0 auf einer konkreten Maschine kann ein
Experiment liefern.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
16
Variante 2: Mergesort für lineare Listen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
(Durchlaufe L, hänge die Einträge abwechselnd an L1 und L2
an. Kosten: Θ(Länge von L).)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
(Durchlaufe L, hänge die Einträge abwechselnd an L1 und L2
an. Kosten: Θ(Länge von L).)
Auf L1 und L2 wird der Algorithmus rekursiv angewendet.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
(Durchlaufe L, hänge die Einträge abwechselnd an L1 und L2
an. Kosten: Θ(Länge von L).)
Auf L1 und L2 wird der Algorithmus rekursiv angewendet.
Dann werden die beiden nun sortierten Listen gemischt“.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
(Durchlaufe L, hänge die Einträge abwechselnd an L1 und L2
an. Kosten: Θ(Länge von L).)
Auf L1 und L2 wird der Algorithmus rekursiv angewendet.
Dann werden die beiden nun sortierten Listen gemischt“.
”
Analyse der Vergleiche: Identisch zum Obigen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
(Durchlaufe L, hänge die Einträge abwechselnd an L1 und L2
an. Kosten: Θ(Länge von L).)
Auf L1 und L2 wird der Algorithmus rekursiv angewendet.
Dann werden die beiden nun sortierten Listen gemischt“.
”
Analyse der Vergleiche: Identisch zum Obigen.
Laufzeit: Proportional zur Anzahl der Vergleiche, also auch
Θ(n log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 2: Mergesort für lineare Listen.
Wenn die Liste L nur ein Element enthält, ist nichts zu tun.
Andernfalls wird L in 2 Teillisten L1, L2 der halben Länge
zerteilt.
(Durchlaufe L, hänge die Einträge abwechselnd an L1 und L2
an. Kosten: Θ(Länge von L).)
Auf L1 und L2 wird der Algorithmus rekursiv angewendet.
Dann werden die beiden nun sortierten Listen gemischt“.
”
Analyse der Vergleiche: Identisch zum Obigen.
Laufzeit: Proportional zur Anzahl der Vergleiche, also auch
Θ(n log n).
Kein zusätzlicher Platz (aber Zeiger für die Liste).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
17
Variante 3: Iteratives Mergesort, bottom-up“
”
Beispiel:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
18
Variante 3: Iteratives Mergesort, bottom-up“
”
Idee: Arbeite in Runden i = 1, 2, 3, . . . , dlog ne.
Beispiel:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
18
Runde
A:
7
2
9
6
3
1
6 10
2 17 12
6
2
7
4
C:
2
7
6
9
1
3
6 10
2 17 6
12
2
7
4
A:
2
6
7
9
1
3
6 10
2
6
12 17
2
4
7
C:
1
2
3
6
6
7
9 10
2
2
4
6
7
12 17
A:
1
2
2
2
3
4
6
6
7
7
9
10 12 17
1
2
3
4
FG KTuEA, TU Ilmenau
6
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
19
Variante 3: Iteratives Mergesort, bottom-up“
”
Vor Runde i:
Teilarrays A[(l − 1) · 2i + 1 . . . l · 2i] sind aufsteigend sortiert.
(Eventuell ist das am weitesten rechts stehende Teilarray unvollständig.)
In Runde i führe merge((l − 2) · 2i + 1, (l − 1)2i, l · 2i) aus,
für l = 2, 4, 6, . . . , 2bn/2i+1c,
mit Hilfe eines zweiten Arrays B.
(Mögliche Sonderrolle für unvollständige Teilarrays ganz
rechts.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
20
Trick, spart Kopierarbeit:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
21
Trick, spart Kopierarbeit:
Benutze 2 Arrays, die in jeder Runde ihre Rolle wechseln.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
21
Trick, spart Kopierarbeit:
Benutze 2 Arrays, die in jeder Runde ihre Rolle wechseln.
Zeitverhalten von iterativem Mergesort:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
21
Trick, spart Kopierarbeit:
Benutze 2 Arrays, die in jeder Runde ihre Rolle wechseln.
Zeitverhalten von iterativem Mergesort:
wie bei rekursivem Mergesort.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
21
Trick, spart Kopierarbeit:
Benutze 2 Arrays, die in jeder Runde ihre Rolle wechseln.
Zeitverhalten von iterativem Mergesort:
wie bei rekursivem Mergesort.
Alternative, einfache Zeitanalyse für diese Variante:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
21
Trick, spart Kopierarbeit:
Benutze 2 Arrays, die in jeder Runde ihre Rolle wechseln.
Zeitverhalten von iterativem Mergesort:
wie bei rekursivem Mergesort.
Alternative, einfache Zeitanalyse für diese Variante:
Jede Runde kostet offenbar < n Vergleiche und Zeit Θ(n),
und es gibt dlog ne Runden: also ist die die Zahl der Vergleiche
< ndlog ne und die Gesamtzeit
Θ(ndlog ne) = Θ(n log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
21
Variante 4: Mehrweg-Mergesort
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
22
Variante 4: Mehrweg-Mergesort
Besonders in Kombination mit dem iterativen Verfahren interessant ist die Möglichkeit, in einer merge-Runde nicht nur ein
Array, sondern 3, 4, oder mehr Teilarrays zusammenzumischen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
22
Variante 4: Mehrweg-Mergesort
Besonders in Kombination mit dem iterativen Verfahren interessant ist die Möglichkeit, in einer merge-Runde nicht nur ein
Array, sondern 3, 4, oder mehr Teilarrays zusammenzumischen.
Beispiel:
A:
1 7 9 13 2 5 7 9
3 6 6 10
2 4 11 12
4−way merge: wähle kleinstes Element
aus 4 (Rest−)Arrays.
C:
1 2 2 3 4 5 6 6 7 7
Die nächsten gewählten Elemente: "9" aus 1.Teilarray,
"9" aus 2. Teilarray, 10, 11, etc.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
22
Benötigt: Auswahl des kleinsten aus k“. Dafür: Heap (später).
”
Beim Sortieren von Daten auf Hintergrundspeichern (Platten)
bringt diese Variante gebenüber dem Mischen von zwei Teilfolgen Laufzeitvorteile, da die Anzahl der Seitenfehler (page
faults) verringert wird.
Für Sortieren von großen Datenmengen auf Hintergrundspeichern: Mergesort-artige Verfahren benutzen!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
23
Benötigt: Auswahl des kleinsten aus k“. Dafür: Heap (später).
”
Beim Sortieren von Daten auf Hintergrundspeichern (Platten)
bringt diese Variante gebenüber dem Mischen von zwei Teilfolgen Laufzeitvorteile, da die Anzahl der Seitenfehler (page
faults) verringert wird.
Für Sortieren von großen Datenmengen auf Hintergrundspeichern: Mergesort-artige Verfahren benutzen!
Ein ähnlicher Effekt tritt auch beim Sortieren im Hauptspeicher
ein: Die Zahl der Cachefehler (cache misses) sinkt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
23
6.3 Quicksort
Schnelles Sortieren im Durchschnitt
(C. A. R. Hoare, 1960)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
24
6.3 Quicksort
Schnelles Sortieren im Durchschnitt
(C. A. R. Hoare, 1960)
Folgt ebenfalls dem
Divide-and-Conquer-Ansatz
Zentrale Teilaufgabe:
Sortiere (Teil-)Array A[a..b], wo 1 ≤ a ≤ b ≤ n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
24
6.3 Quicksort
Schnelles Sortieren im Durchschnitt
(C. A. R. Hoare, 1960)
Folgt ebenfalls dem
Divide-and-Conquer-Ansatz
Zentrale Teilaufgabe:
Sortiere (Teil-)Array A[a..b], wo 1 ≤ a ≤ b ≤ n.
Zu erledigen von einer (rekursiven) Prozedur r qsort(a, b).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
24
Kernstück: Partitionieren und rekursiv sortieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
25
Kernstück: Partitionieren und rekursiv sortieren.
Quicksort−Schema:
Teilaufgabe: Sortiere A[a...b]
x
4
a
23
17
9
1
5
8
b
16
Partitioniere!
5
1
FG KTuEA, TU Ilmenau
4
8
1
9
p
23
16
17
9
>9
Sortiere
rekursiv
Sortiere
rekursiv
4
5
8
9
16
17
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
23
25
Ansatz für r qsort(a, b), Korrektheit:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
26
Ansatz für r qsort(a, b), Korrektheit:
0) Trivialitätstest: Wenn a ≥ b, ist nichts zu tun.
(Oder: Wenn b − a < n0: StraightInsertionSort(a, b).)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
26
Ansatz für r qsort(a, b), Korrektheit:
0) Trivialitätstest: Wenn a ≥ b, ist nichts zu tun.
(Oder: Wenn b − a < n0: StraightInsertionSort(a, b).)
1. Teile: (Hier partitioniere“)
”
Wähle x ∈ {A[a].key,...,A[b].key}.
Arrangiere die Einträge von A[a..b] so um, dass
A[a].key, . . . ,A[p − 1].key ≤ A[p].key = x < A[p + 1].key, . . . ,A[b].key
für ein p mit a ≤ p ≤ b.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
26
Ansatz für r qsort(a, b), Korrektheit:
0) Trivialitätstest: Wenn a ≥ b, ist nichts zu tun.
(Oder: Wenn b − a < n0: StraightInsertionSort(a, b).)
1. Teile: (Hier partitioniere“)
”
Wähle x ∈ {A[a].key,...,A[b].key}.
Arrangiere die Einträge von A[a..b] so um, dass
A[a].key, . . . ,A[p − 1].key ≤ A[p].key = x < A[p + 1].key, . . . ,A[b].key
für ein p mit a ≤ p ≤ b.
2. Teilprobleme rekursiv lösen:
r qsort(a, p − 1) (links), r qsort(p + 1, b) (rechts).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
26
Ansatz für r qsort(a, b), Korrektheit:
0) Trivialitätstest: Wenn a ≥ b, ist nichts zu tun.
(Oder: Wenn b − a < n0: StraightInsertionSort(a, b).)
1. Teile: (Hier partitioniere“)
”
Wähle x ∈ {A[a].key,...,A[b].key}.
Arrangiere die Einträge von A[a..b] so um, dass
A[a].key, . . . ,A[p − 1].key ≤ A[p].key = x < A[p + 1].key, . . . ,A[b].key
für ein p mit a ≤ p ≤ b.
2. Teilprobleme rekursiv lösen:
r qsort(a, p − 1) (links), r qsort(p + 1, b) (rechts).
Nach I.V. gilt nun: A[a..p − 1], A[p + 1..b] sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
26
Ansatz für r qsort(a, b), Korrektheit:
0) Trivialitätstest: Wenn a ≥ b, ist nichts zu tun.
(Oder: Wenn b − a < n0: StraightInsertionSort(a, b).)
1. Teile: (Hier partitioniere“)
”
Wähle x ∈ {A[a].key,...,A[b].key}.
Arrangiere die Einträge von A[a..b] so um, dass
A[a].key, . . . ,A[p − 1].key ≤ A[p].key = x < A[p + 1].key, . . . ,A[b].key
für ein p mit a ≤ p ≤ b.
2. Teilprobleme rekursiv lösen:
r qsort(a, p − 1) (links), r qsort(p + 1, b) (rechts).
Nach I.V. gilt nun: A[a..p − 1], A[p + 1..b] sortiert.
3. Kombiniere: Es ist nichts zu tun: A[a..b] ist sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
26
Kernstück: Partitionieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
x := A[b].key (letztes Element des Teilarrays)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
x := A[b].key (letztes Element des Teilarrays)
x := A[b(a + b)/2c].key (Mitte des Teilarrays)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
x := A[b].key (letztes Element des Teilarrays)
x := A[b(a + b)/2c].key (Mitte des Teilarrays)
Clever Quicksort“: x ist der Median von A[a].key,
”
A[b].key, A[b(a + b)/2c].key
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
x := A[b].key (letztes Element des Teilarrays)
x := A[b(a + b)/2c].key (Mitte des Teilarrays)
Clever Quicksort“: x ist der Median von A[a].key,
”
A[b].key, A[b(a + b)/2c].key
Randomisiertes Quicksort“
”
Wähle einen der b − a + 1 Einträge in A[a..b] zufällig.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
x := A[b].key (letztes Element des Teilarrays)
x := A[b(a + b)/2c].key (Mitte des Teilarrays)
Clever Quicksort“: x ist der Median von A[a].key,
”
A[b].key, A[b(a + b)/2c].key
Randomisiertes Quicksort“
”
Wähle einen der b − a + 1 Einträge in A[a..b] zufällig.
Allgemein: Wähle ein s mit a ≤ s ≤ b,
vertausche A[a] mit A[s].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren.
Woher nehmen wir das Pivotelement“ x?
”
Beispiele: x := A[a].key (erstes Element des Teilarrays)
x := A[b].key (letztes Element des Teilarrays)
x := A[b(a + b)/2c].key (Mitte des Teilarrays)
Clever Quicksort“: x ist der Median von A[a].key,
”
A[b].key, A[b(a + b)/2c].key
Randomisiertes Quicksort“
”
Wähle einen der b − a + 1 Einträge in A[a..b] zufällig.
Allgemein: Wähle ein s mit a ≤ s ≤ b,
vertausche A[a] mit A[s].
Dann: Pivotelement x := A[a].key.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
27
Kernstück: Partitionieren. Pivotelelement: x = A[a].key
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
28
Kernstück: Partitionieren. Pivotelelement: x = A[a].key
Klar: b−a Vergleiche genügen, um Schlüssel ≤ x nach links“
”
und Schlüssel > x nach rechts“ zu schaffen, und den Eintrag
”
mit dem Pivotelement an die Stelle zwischen den Bereichen
zu schreiben.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
28
Kernstück: Partitionieren. Pivotelelement: x = A[a].key
Klar: b−a Vergleiche genügen, um Schlüssel ≤ x nach links“
”
und Schlüssel > x nach rechts“ zu schaffen, und den Eintrag
”
mit dem Pivotelement an die Stelle zwischen den Bereichen
zu schreiben.
Eine sehr geschickte Methode wurde schon von C. A. R.
Hoare angegeben:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
28
Kernstück: Partitionieren. Pivotelelement: x = A[a].key
Klar: b−a Vergleiche genügen, um Schlüssel ≤ x nach links“
”
und Schlüssel > x nach rechts“ zu schaffen, und den Eintrag
”
mit dem Pivotelement an die Stelle zwischen den Bereichen
zu schreiben.
Eine sehr geschickte Methode wurde schon von C. A. R.
Hoare angegeben: kein zusätzlicher Platz, keine unnötige
Datenbewegung.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
28
Kernstück: Partitionieren. Pivotelelement: x = A[a].key
Klar: b−a Vergleiche genügen, um Schlüssel ≤ x nach links“
”
und Schlüssel > x nach rechts“ zu schaffen, und den Eintrag
”
mit dem Pivotelement an die Stelle zwischen den Bereichen
zu schreiben.
Eine sehr geschickte Methode wurde schon von C. A. R.
Hoare angegeben: kein zusätzlicher Platz, keine unnötige
Datenbewegung.
Hier: Variante des in der AuP-Vorlesung angegebenen Verfahrens.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
28
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
FG KTuEA, TU Ilmenau
?
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
000
111
29
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
?
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
000
111
Ignoriere A[a].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
29
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
?
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
000
111
Ignoriere A[a].
Lasse ab a + 1 einen Zeiger“ (Index) i nach rechts wandern,
”
bis ein Schlüssel > x erreicht wird.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
29
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
?
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
000
111
Ignoriere A[a].
Lasse ab a + 1 einen Zeiger“ (Index) i nach rechts wandern,
”
bis ein Schlüssel > x erreicht wird.
Lasse ab b einen Zeiger“ j (Index) nach links wandern, bis
”
ein Schlüssel ≤ x erreicht wird.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
29
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
?
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
000
111
Ignoriere A[a].
Lasse ab a + 1 einen Zeiger“ (Index) i nach rechts wandern,
”
bis ein Schlüssel > x erreicht wird.
Lasse ab b einen Zeiger“ j (Index) nach links wandern, bis
”
ein Schlüssel ≤ x erreicht wird.
Falls i < j: Vertausche A[i] und A[j].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
29
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
000
111
?
Ignoriere A[a].
Lasse ab a + 1 einen Zeiger“ (Index) i nach rechts wandern,
”
bis ein Schlüssel > x erreicht wird.
Lasse ab b einen Zeiger“ j (Index) nach links wandern, bis
”
ein Schlüssel ≤ x erreicht wird.
Falls i < j: Vertausche A[i] und A[j].
a
11111
00000
00
11
00000
11111
00
11
x
x
00000
11111
00
11
i
x
j
?
b
1111
0000
000
111
0000
000
111
>x 1111
>x
0000
1111
000
111
REST
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
29
a+1
i
0000
1111
00
11
0000
00
11
x
>x
x 1111
0000
1111
00
11
j 1111
b
0000
000
111
0000
000
111
x 1111
>x
0000
1111
000
111
?
Ignoriere A[a].
Lasse ab a + 1 einen Zeiger“ (Index) i nach rechts wandern,
”
bis ein Schlüssel > x erreicht wird.
Lasse ab b einen Zeiger“ j (Index) nach links wandern, bis
”
ein Schlüssel ≤ x erreicht wird.
Falls i < j: Vertausche A[i] und A[j].
a
11111
00000
00
11
00000
11111
00
11
x
x
00000
11111
00
11
i
x
j
?
b
1111
0000
000
111
0000
000
111
>x 1111
>x
0000
1111
000
111
REST
Erhöhe i um 1, erniedrige j um 1. Wiederhole.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
29
. . . bis sich i und j treffen“ und überkreuzen“.
”
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
30
. . . bis sich i und j treffen“ und überkreuzen“.
”
”
a
x
a
z
x
j i
z
x
j i
x
b
>x
b
>x
p=j
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
30
. . . bis sich i und j treffen“ und überkreuzen“.
”
”
a
x
a
z
x
j i
z
x
j i
x
b
>x
b
>x
p=j
Vertausche A[a] mit A[j].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
30
. . . bis sich i und j treffen“ und überkreuzen“.
”
”
a
x
a
z
x
j i
z
x
j i
x
b
>x
b
>x
p=j
Vertausche A[a] mit A[j].
Position p des Pivotelements jetzt: A[j].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
30
. . . bis sich i und j treffen“ und überkreuzen“.
”
”
a
x
a
z
x
j i
z
x
j i
x
b
>x
b
>x
p=j
Vertausche A[a] mit A[j].
Position p des Pivotelements jetzt: A[j].
Sorgfalt bei der Implementierung der Idee nötig. Randfälle und Abschluss
korrekt behandeln! Nach einigem Tüfteln ergibt sich:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
30
Prozedur partition(a, b, p)
// Partitionierungsprozedur in r qsort(a, b)
// Voraussetzung: a < b; Pivotelement: A[a]
(1)
x ← A[a].key;
(2)
i ← a + 1; j ← b;
(3)
while (i ≤ j) do
// noch nicht fertig; Hauptschleife
(4)
while (i ≤ j) and (A[i].key ≤ x) do i++;
(5)
while (j > i) and (A[j].key > x) do j--;
(6)
if (i = j) then j--;
// Wissen: A[i].key > x
(7)
if (i < j) then
(8)
vertausche A[i] und A[j];
(9)
i++; j--;
(10)
if (a < j) then vertausche A[a] und A[j];
(11)
p ← j; // Rückgabewert
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
31
Beispiel für partition:
2
5
20 7 16 18 30
a
x =20
// 7 16 18 30
i
x =20
// 7 16 18 30
i
x =20
// 7 16 18 9
x =20
// 7
FG KTuEA, TU Ilmenau
16 18 9
12 25
8
9 35 31
b
Vorbereitung
12 25
8
9
j
12 25
8
9
j
12 25
i
8
j
30
12 25
i
8
j
30
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Vertauschen
32
x =20
// 7
x =20
// 7
x =20
// 7
16 18 9
16 18 9
16 18 9
12 25
i
8
j
12
8
j
25 30
i
8
25 30
12
30
Vertauschen
fertig!
Aufräumen
8
7
16 18 9
12
20 25 30
p
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
33
Lemma 6.3.1
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Lemma 6.3.1 Ein Aufruf partition(a, b, p)
bewirkt folgendes, wenn 1 ≤ a < b ≤ n gilt:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Lemma 6.3.1 Ein Aufruf partition(a, b, p)
bewirkt folgendes, wenn 1 ≤ a < b ≤ n gilt:
Sei x = A[a].key (vor Aufruf), p der Inhalt von p (nach Aufruf).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Lemma 6.3.1 Ein Aufruf partition(a, b, p)
bewirkt folgendes, wenn 1 ≤ a < b ≤ n gilt:
Sei x = A[a].key (vor Aufruf), p der Inhalt von p (nach Aufruf).
(a) A[a . . b] wird so umarrangiert, dass x = A[p].key und
A[a].key,. . . ,A[p−1].key ≤ x < A[p+1].key,. . . ,A[b].key.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Lemma 6.3.1 Ein Aufruf partition(a, b, p)
bewirkt folgendes, wenn 1 ≤ a < b ≤ n gilt:
Sei x = A[a].key (vor Aufruf), p der Inhalt von p (nach Aufruf).
(a) A[a . . b] wird so umarrangiert, dass x = A[p].key und
A[a].key,. . . ,A[p−1].key ≤ x < A[p+1].key,. . . ,A[b].key.
(b) An welche Stelle A[j], a ≤ j ≤ b, gelangt, hängt nur von
der Menge {i ∈ [a + 1, b] | A[i].key > x} ab,
nicht von den konkreten Schlüsselwerten.
(Beweis: (a) Nicht prüfungsrelevant, siehe Druckfolien. (b) Alle Entscheidungen werden nur aufgrund von Vergleichen mit x getroffen.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Lemma 6.3.1 Ein Aufruf partition(a, b, p)
bewirkt folgendes, wenn 1 ≤ a < b ≤ n gilt:
Sei x = A[a].key (vor Aufruf), p der Inhalt von p (nach Aufruf).
(a) A[a . . b] wird so umarrangiert, dass x = A[p].key und
A[a].key,. . . ,A[p−1].key ≤ x < A[p+1].key,. . . ,A[b].key.
(b) An welche Stelle A[j], a ≤ j ≤ b, gelangt, hängt nur von
der Menge {i ∈ [a + 1, b] | A[i].key > x} ab,
nicht von den konkreten Schlüsselwerten.
(Beweis: (a) Nicht prüfungsrelevant, siehe Druckfolien. (b) Alle Entscheidungen werden nur aufgrund von Vergleichen mit x getroffen.)
Lemma 6.3.2 Bei partition(a, b, p) gilt:
(a) Die Anzahl der Schlüsselvergleiche ist exakt b − a;
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Lemma 6.3.1 Ein Aufruf partition(a, b, p)
bewirkt folgendes, wenn 1 ≤ a < b ≤ n gilt:
Sei x = A[a].key (vor Aufruf), p der Inhalt von p (nach Aufruf).
(a) A[a . . b] wird so umarrangiert, dass x = A[p].key und
A[a].key,. . . ,A[p−1].key ≤ x < A[p+1].key,. . . ,A[b].key.
(b) An welche Stelle A[j], a ≤ j ≤ b, gelangt, hängt nur von
der Menge {i ∈ [a + 1, b] | A[i].key > x} ab,
nicht von den konkreten Schlüsselwerten.
(Beweis: (a) Nicht prüfungsrelevant, siehe Druckfolien. (b) Alle Entscheidungen werden nur aufgrund von Vergleichen mit x getroffen.)
Lemma 6.3.2 Bei partition(a, b, p) gilt:
(a) Die Anzahl der Schlüsselvergleiche ist exakt b − a;
(b) der (Zeit-)Aufwand ist Θ(b − a).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
34
Prozedur r qsort(a, b)
// Rekursive Prozedur im Quicksort-Algorithmus, 1 ≤ a < b ≤ n
(1)
s ← ein Element von {a, . . . , b};
// Es gibt verschiedene Methoden/Arten, s zu wählen!
(2)
if (a < s) then vertausche A[a] und A[s];
(3)
partition(a, b, p); // p: Ausgabeparameter
(4)
if a < p − 1 then r qsort(a, p − 1);
(5)
if p + 1 < b then r qsort(p + 1, b).
Effiziente Variation zu den Abbruchkriterien in Zeilen (4), (5):
Teilarrays der Länge ≤ n0 mit StraightInsertionSort(a, b)
sortieren, für ein passendes n0.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
35
Lemma 6.3.3
Ein Aufruf von r qsort(a, b) sortiert A[a . . b].
(Beweis schon gesehen.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
36
Lemma 6.3.3
Ein Aufruf von r qsort(a, b) sortiert A[a . . b].
(Beweis schon gesehen.)
Um A[1 . . n] zu sortieren:
Prozedur quicksort(A[1..n])
(1) if n > 1 then r qsort(1, n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
36
Die Laufzeit von r qsort(a, b)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
37
Die Laufzeit von r qsort(a, b), wobei n = b − a + 1.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
37
Die Laufzeit von r qsort(a, b), wobei n = b − a + 1.
Der Aufwand für einen Aufruf ist O(1)
plus der Aufwand für partition(a, b, p)
plus der Aufwand für die rekursiven Aufrufe.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
37
Die Laufzeit von r qsort(a, b), wobei n = b − a + 1.
Der Aufwand für einen Aufruf ist O(1)
plus der Aufwand für partition(a, b, p)
plus der Aufwand für die rekursiven Aufrufe.
Der Aufwand für partition(a, b, p) ist proportional zu b − a,
und das ist genau die Anzahl der Schlüsselvergleiche, die
partition(a, b, p) durchführt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
37
Die Laufzeit von r qsort(a, b), wobei n = b − a + 1.
Der Aufwand für einen Aufruf ist O(1)
plus der Aufwand für partition(a, b, p)
plus der Aufwand für die rekursiven Aufrufe.
Der Aufwand für partition(a, b, p) ist proportional zu b − a,
und das ist genau die Anzahl der Schlüsselvergleiche, die
partition(a, b, p) durchführt.
In jedem Aufruf ist ein anderer Arrayeintrag Pivotelement.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
37
Die Laufzeit von r qsort(a, b), wobei n = b − a + 1.
Der Aufwand für einen Aufruf ist O(1)
plus der Aufwand für partition(a, b, p)
plus der Aufwand für die rekursiven Aufrufe.
Der Aufwand für partition(a, b, p) ist proportional zu b − a,
und das ist genau die Anzahl der Schlüsselvergleiche, die
partition(a, b, p) durchführt.
In jedem Aufruf ist ein anderer Arrayeintrag Pivotelement.
Gesamtaufwand für r qsort(a, b), wobei n = b − a + 1:
O(n) plus O(Gesamtanzahl
aller{zSchlüsselvergleiche}).
|
=:V
V ist eine Größe, die von der Anordnung der Eingabe abhängt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
37
Schlechtester Fall: ( worst case“)
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
Konsequenz: Es werden niemals dieselben Schlüssel später
nochmals verglichen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
Konsequenz: Es werden niemals dieselben Schlüssel später
nochmals verglichen.
1
n
Also: V ≤ 2 = 2 n(n − 1).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
Konsequenz: Es werden niemals dieselben Schlüssel später
nochmals verglichen.
1
n
Also: V ≤ 2 = 2 n(n − 1).
Dieser Wert kommt vor, wenn die Eingabe schon sortiert ist
und man in Prozedur r qsort(a, b) immer A[a] als Pivotelement wählt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
Konsequenz: Es werden niemals dieselben Schlüssel später
nochmals verglichen.
1
n
Also: V ≤ 2 = 2 n(n − 1).
Dieser Wert kommt vor, wenn die Eingabe schon sortiert ist
und man in Prozedur r qsort(a, b) immer A[a] als Pivotelement wählt.
(Dann ist das linke Teilarray leer, das rechte enthält b − a Elemente.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
Konsequenz: Es werden niemals dieselben Schlüssel später
nochmals verglichen.
1
n
Also: V ≤ 2 = 2 n(n − 1).
Dieser Wert kommt vor, wenn die Eingabe schon sortiert ist
und man in Prozedur r qsort(a, b) immer A[a] als Pivotelement wählt.
(Dann ist das linke Teilarray leer, das rechte enthält b − a Elemente.
n
Rekursionstiefe n, und V = (n − 1) + (n − 2) + · · · + 3 + 2 + 1 = 2 .)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Schlechtester Fall: ( worst case“)
”
Wenn zwei Schlüssel verglichen werden, ist einer davon (x)
das Pivotelement, der andere wandert in eines der beiden
Teilarrays.
Konsequenz: Es werden niemals dieselben Schlüssel später
nochmals verglichen.
1
n
Also: V ≤ 2 = 2 n(n − 1).
Dieser Wert kommt vor, wenn die Eingabe schon sortiert ist
und man in Prozedur r qsort(a, b) immer A[a] als Pivotelement wählt.
(Dann ist das linke Teilarray leer, das rechte enthält b − a Elemente.
n
Rekursionstiefe n, und V = (n − 1) + (n − 2) + · · · + 3 + 2 + 1 = 2 .)
Achtung: Ähnlicher Effekt, wenn Array fast“ sortiert.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
38
Durchschnittlicher/erwarteter Fall?
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
39
Durchschnittlicher/erwarteter Fall?
Wahrscheinlichkeitsannahme:
Die Eingabeschlüssel sind verschieden. – O.B.d.A.:
Eingabeschlüssel sind n verschiedene Zahlen x1 < . . . < xn.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
39
Durchschnittlicher/erwarteter Fall?
Wahrscheinlichkeitsannahme:
Die Eingabeschlüssel sind verschieden. – O.B.d.A.:
Eingabeschlüssel sind n verschiedene Zahlen x1 < . . . < xn.
Jede Anordnung der Eingabeschlüssel hat dieselbe Wahrscheinlichkeit. (Es gibt n! solche Anordnungen.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
39
Durchschnittlicher/erwarteter Fall?
Wahrscheinlichkeitsannahme:
Die Eingabeschlüssel sind verschieden. – O.B.d.A.:
Eingabeschlüssel sind n verschiedene Zahlen x1 < . . . < xn.
Jede Anordnung der Eingabeschlüssel hat dieselbe Wahrscheinlichkeit. (Es gibt n! solche Anordnungen.)
Als Pivotelement wählen wir den Eintrag an einer festen Stelle,
z. B. A[a].
Unter dieser Wahrscheinlichkeitsannahme wird V zu einer
Zufallsgröße.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
39
Durchschnittlicher/erwarteter Fall?
Wahrscheinlichkeitsannahme:
Die Eingabeschlüssel sind verschieden. – O.B.d.A.:
Eingabeschlüssel sind n verschiedene Zahlen x1 < . . . < xn.
Jede Anordnung der Eingabeschlüssel hat dieselbe Wahrscheinlichkeit. (Es gibt n! solche Anordnungen.)
Als Pivotelement wählen wir den Eintrag an einer festen Stelle,
z. B. A[a].
Unter dieser Wahrscheinlichkeitsannahme wird V zu einer
Zufallsgröße.
Wir untersuchen den Erwartungswert/Mittelwert von V .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
39
Durchschnittlicher/erwarteter Fall?
Wahrscheinlichkeitsannahme:
Die Eingabeschlüssel sind verschieden. – O.B.d.A.:
Eingabeschlüssel sind n verschiedene Zahlen x1 < . . . < xn.
Jede Anordnung der Eingabeschlüssel hat dieselbe Wahrscheinlichkeit. (Es gibt n! solche Anordnungen.)
Als Pivotelement wählen wir den Eintrag an einer festen Stelle,
z. B. A[a].
Unter dieser Wahrscheinlichkeitsannahme wird V zu einer
Zufallsgröße.
Wir untersuchen den Erwartungswert/Mittelwert von V .
(Vorsicht! Die folgende Überlegung gilt nicht für Clever-Quicksort“ und
”
nicht, wenn die Schlüssel nicht alle verschieden sind.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
39
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 =
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
FG KTuEA, TU Ilmenau
C2 =
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
FG KTuEA, TU Ilmenau
C2 = 1,
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
C2 = 1,
C3: Wenn man beim ersten r qsort(a, b)-Aufruf mit b = a + 2
das mittlere Element x2 als Pivot hat, gibt es 2 Vergleiche
insgesamt.
Wahrscheinlichkeit hierfür: 13 .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
C2 = 1,
C3: Wenn man beim ersten r qsort(a, b)-Aufruf mit b = a + 2
das mittlere Element x2 als Pivot hat, gibt es 2 Vergleiche
insgesamt.
Wahrscheinlichkeit hierfür: 13 .
Wenn man x1 oder x3 als Pivot hat, hat man zunächst 2
Vergleiche, und einer der rekursiven Aufrufe führt zu einem
dritten.
Insgesamt: 3 Vergleiche. Wahrscheinlichkeit hierfür: 23 .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
C2 = 1,
C3: Wenn man beim ersten r qsort(a, b)-Aufruf mit b = a + 2
das mittlere Element x2 als Pivot hat, gibt es 2 Vergleiche
insgesamt.
Wahrscheinlichkeit hierfür: 13 .
Wenn man x1 oder x3 als Pivot hat, hat man zunächst 2
Vergleiche, und einer der rekursiven Aufrufe führt zu einem
dritten.
Insgesamt: 3 Vergleiche. Wahrscheinlichkeit hierfür: 23 .
Mittlere Vergleichsanzahl:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
C2 = 1,
C3: Wenn man beim ersten r qsort(a, b)-Aufruf mit b = a + 2
das mittlere Element x2 als Pivot hat, gibt es 2 Vergleiche
insgesamt.
Wahrscheinlichkeit hierfür: 13 .
Wenn man x1 oder x3 als Pivot hat, hat man zunächst 2
Vergleiche, und einer der rekursiven Aufrufe führt zu einem
dritten.
Insgesamt: 3 Vergleiche. Wahrscheinlichkeit hierfür: 23 .
Mittlere Vergleichsanzahl: C3 = 31 · 2
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
C2 = 1,
C3: Wenn man beim ersten r qsort(a, b)-Aufruf mit b = a + 2
das mittlere Element x2 als Pivot hat, gibt es 2 Vergleiche
insgesamt.
Wahrscheinlichkeit hierfür: 13 .
Wenn man x1 oder x3 als Pivot hat, hat man zunächst 2
Vergleiche, und einer der rekursiven Aufrufe führt zu einem
dritten.
Insgesamt: 3 Vergleiche. Wahrscheinlichkeit hierfür: 23 .
Mittlere Vergleichsanzahl: C3 = 31 · 2 + 32 · 3
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn := die erwartete Anzahl der Vergleiche beim Sortieren
eines Teilarrays mit n Einträgen mit r qsort
C0 = 0,
C1 = 0,
C2 = 1,
C3: Wenn man beim ersten r qsort(a, b)-Aufruf mit b = a + 2
das mittlere Element x2 als Pivot hat, gibt es 2 Vergleiche
insgesamt.
Wahrscheinlichkeit hierfür: 13 .
Wenn man x1 oder x3 als Pivot hat, hat man zunächst 2
Vergleiche, und einer der rekursiven Aufrufe führt zu einem
dritten.
Insgesamt: 3 Vergleiche. Wahrscheinlichkeit hierfür: 23 .
Mittlere Vergleichsanzahl: C3 = 31 · 2 + 32 · 3 = 83 .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
40
Cn: Wenn man beim ersten r qsort(a, b)-Aufruf
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
41
Cn: Wenn man beim ersten r qsort(a, b)-Aufruf
das i-t kleinste Element xi als Pivotelement hat,
dann erzeugt dieser Aufruf selbst zunächst genau n − 1
Vergleiche,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
41
Cn: Wenn man beim ersten r qsort(a, b)-Aufruf
das i-t kleinste Element xi als Pivotelement hat,
dann erzeugt dieser Aufruf selbst zunächst genau n − 1
Vergleiche,
und es entstehen die rekursiven Aufrufe
r qsort(a, a + i − 2) (wenn i ≥ 3)
r qsort(a + i, b) (wenn i ≤ n − 2)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
41
Cn: Wenn man beim ersten r qsort(a, b)-Aufruf
das i-t kleinste Element xi als Pivotelement hat,
dann erzeugt dieser Aufruf selbst zunächst genau n − 1
Vergleiche,
und es entstehen die rekursiven Aufrufe
r qsort(a, a + i − 2) (wenn i ≥ 3)
r qsort(a + i, b) (wenn i ≤ n − 2)
Diese kosten im Durchschnitt Ci−1 und Cn−i Vergleiche.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
41
Cn: Wenn man beim ersten r qsort(a, b)-Aufruf
das i-t kleinste Element xi als Pivotelement hat,
dann erzeugt dieser Aufruf selbst zunächst genau n − 1
Vergleiche,
und es entstehen die rekursiven Aufrufe
r qsort(a, a + i − 2) (wenn i ≥ 3)
r qsort(a + i, b) (wenn i ≤ n − 2)
Diese kosten im Durchschnitt Ci−1 und Cn−i Vergleiche.
(Beachte: Da anfangs die Schlüssel zufällig angeordnet waren, und bei
partition die Schlüssel nur mit dem Pivotelement verglichen werden, ist
nachher die Anordnung in der beiden Teilarrays ebenfalls zufällig.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
41
Falls also xi Pivotelement ist:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
42
Falls also xi Pivotelement ist:
Durchschnittliche Kosten sind (n − 1) + Ci−1 + Cn−i.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
42
Falls also xi Pivotelement ist:
Durchschnittliche Kosten sind (n − 1) + Ci−1 + Cn−i.
Die Wahrscheinlichkeit, dass xi Pivotelement ist, ist gleich
1/n, weil
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
42
Falls also xi Pivotelement ist:
Durchschnittliche Kosten sind (n − 1) + Ci−1 + Cn−i.
Die Wahrscheinlichkeit, dass xi Pivotelement ist, ist gleich
1/n, weil
nach der W-Annahme jede Anordnung der Einträge x1, . . . , xn
in A[a . . b] gleichwahrscheinlich ist (Lemma 6.3.1(b)).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
42
Falls also xi Pivotelement ist:
Durchschnittliche Kosten sind (n − 1) + Ci−1 + Cn−i.
Die Wahrscheinlichkeit, dass xi Pivotelement ist, ist gleich
1/n, weil
nach der W-Annahme jede Anordnung der Einträge x1, . . . , xn
in A[a . . b] gleichwahrscheinlich ist (Lemma 6.3.1(b)).
Also:
Cn
FG KTuEA, TU Ilmenau
n
X
1
·
((n − 1) + Ci−1 + Cn−i)
=
n i=1
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
42
Falls also xi Pivotelement ist:
Durchschnittliche Kosten sind (n − 1) + Ci−1 + Cn−i.
Die Wahrscheinlichkeit, dass xi Pivotelement ist, ist gleich
1/n, weil
nach der W-Annahme jede Anordnung der Einträge x1, . . . , xn
in A[a . . b] gleichwahrscheinlich ist (Lemma 6.3.1(b)).
Also:
Cn
n
X
1
·
((n − 1) + Ci−1 + Cn−i)
=
n i=1
n
1 X
= (n − 1) + ·
(Ci−1 + Cn−i).
n i=1
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
42
Abschnitt 4.2 in Kap. 4, Folien 32–37 :
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
43
Abschnitt 4.2 in Kap. 4, Folien 32–37 :
Rekursionsformel für die mittlere totale Weglänge A(n) in
zufällig erzeugten binären Suchbäumen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
43
Abschnitt 4.2 in Kap. 4, Folien 32–37 :
Rekursionsformel für die mittlere totale Weglänge A(n) in
zufällig erzeugten binären Suchbäumen.
A(0) = A(1) = 0, A(2) = 1,
Pn
1
A(n) = (n − 1) + n · i=1(A(i − 1) + A(n − i)).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
43
Abschnitt 4.2 in Kap. 4, Folien 32–37 :
Rekursionsformel für die mittlere totale Weglänge A(n) in
zufällig erzeugten binären Suchbäumen.
A(0) = A(1) = 0, A(2) = 1,
Pn
1
A(n) = (n − 1) + n · i=1(A(i − 1) + A(n − i)).
Das ist genau die gleiche Rekursion wie die für Cn!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
43
Abschnitt 4.2 in Kap. 4, Folien 32–37 :
Rekursionsformel für die mittlere totale Weglänge A(n) in
zufällig erzeugten binären Suchbäumen.
A(0) = A(1) = 0, A(2) = 1,
Pn
1
A(n) = (n − 1) + n · i=1(A(i − 1) + A(n − i)).
Das ist genau die gleiche Rekursion wie die für Cn!
Bemerkung: Dies ist kein Zufall, sondern es besteht eine enge Verbindung der beiden Verfahren Quicksort und Erzeugen von Suchbäumen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
43
Abschnitt 4.2 in Kap. 4, Folien 32–37 :
Rekursionsformel für die mittlere totale Weglänge A(n) in
zufällig erzeugten binären Suchbäumen.
A(0) = A(1) = 0, A(2) = 1,
Pn
1
A(n) = (n − 1) + n · i=1(A(i − 1) + A(n − i)).
Das ist genau die gleiche Rekursion wie die für Cn!
Bemerkung: Dies ist kein Zufall, sondern es besteht eine enge Verbindung der beiden Verfahren Quicksort und Erzeugen von Suchbäumen.
Also sind auch die Lösungen identisch.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
43
Satz 6.3.4
Die erwartete Vergleichsanzahl bei der Anwendung von Quicksort auf ein Array mit n verschiedenen Einträgen, die zufällig
angeordnet sind, ist
2(n + 1)Hn − 4n ≈ (2 ln 2)n log n − 2,846 . . . n.
Dabei ist 2 ln 2 ≈ 1,386 (die Quicksort-Konstante“).
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
44
Bemerkung:
Dieselbe Aussage gilt für die randomisierte Version, bei der
das Pivotelement zufällig gewählt wird,
und zwar für jedes beliebige feste Eingabearray A[1 . . n].
Randomisierung
Quicksort.
FG KTuEA, TU Ilmenau
verhindert
worst-case-Eingaben
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
bei
45
Bemerkung:
Dieselbe Aussage gilt für die randomisierte Version, bei der
das Pivotelement zufällig gewählt wird,
und zwar für jedes beliebige feste Eingabearray A[1 . . n].
Randomisierung
Quicksort.
verhindert
worst-case-Eingaben
bei
Bemerkung:
Eine O(n log n)-Laufzeit stellt sich bei (randomisiertem)
Quicksort sogar mit hoher Wahrscheinlichkeit ein.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
45
Bemerkung:
Dieselbe Aussage gilt für die randomisierte Version, bei der
das Pivotelement zufällig gewählt wird,
und zwar für jedes beliebige feste Eingabearray A[1 . . n].
Randomisierung
Quicksort.
verhindert
worst-case-Eingaben
bei
Bemerkung:
Eine O(n log n)-Laufzeit stellt sich bei (randomisiertem)
Quicksort sogar mit hoher Wahrscheinlichkeit ein.
( Zuverlässigkeitsaussage“.)
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
45
Bemerkungen:
• Quicksort ist in der Praxis sehr schnell.
(Partition-Prozedur ist auch Cache-freundlich.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
46
Bemerkungen:
• Quicksort ist in der Praxis sehr schnell.
(Partition-Prozedur ist auch Cache-freundlich.)
• Vermeide rekursive Aufrufe für allzu kleine Teilarrays:
besser direkt mit StraightInsertionSort sortieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
46
Bemerkungen:
• Quicksort ist in der Praxis sehr schnell.
(Partition-Prozedur ist auch Cache-freundlich.)
• Vermeide rekursive Aufrufe für allzu kleine Teilarrays:
besser direkt mit StraightInsertionSort sortieren.
• Warnung 1: Wenn A[1 . . n] teilweise sortiert ist, und man das Pivotelement naiv wählt, erhält man schlechte Laufzeiten. (Bis zu Ω(n2).)
Abhilfe: Clever Quicksort oder Randomisiertes Quicksort.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
46
Bemerkungen:
• Quicksort ist in der Praxis sehr schnell.
(Partition-Prozedur ist auch Cache-freundlich.)
• Vermeide rekursive Aufrufe für allzu kleine Teilarrays:
besser direkt mit StraightInsertionSort sortieren.
• Warnung 1: Wenn A[1 . . n] teilweise sortiert ist, und man das Pivotelement naiv wählt, erhält man schlechte Laufzeiten. (Bis zu Ω(n2).)
Abhilfe: Clever Quicksort oder Randomisiertes Quicksort.
• Warnung 2: Wenn A[1 . . n] (viele) identische Schlüssel enthält, ist das
beschriebene Verfahren nicht günstig.
Einfache Abhilfe: Ersetze Schlüssel A[i].key durch das Paar
(A[i].key,i), und sortiere lexikographisch mit randomisiertem
Quicksort.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
46
Bemerkungen:
• Quicksort ist nicht stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
47
Bemerkungen:
• Quicksort ist nicht stabil.
• Platz (für den Rekursionsstack) kann im schlechtesten Fall bis zu O(n)
groß werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
47
Bemerkungen:
• Quicksort ist nicht stabil.
• Platz (für den Rekursionsstack) kann im schlechtesten Fall bis zu O(n)
groß werden.
Ausweg: Formuliere r qsort um, so dass Rekursion nur für das kleinere
der beiden Teilarray angewendet wird.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
47
Bemerkungen:
• Quicksort ist nicht stabil.
• Platz (für den Rekursionsstack) kann im schlechtesten Fall bis zu O(n)
groß werden.
Ausweg: Formuliere r qsort um, so dass Rekursion nur für das kleinere
der beiden Teilarray angewendet wird.
Das größere wird in einer Iteration weiterbehandelt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
47
Bemerkungen:
• Quicksort ist nicht stabil.
• Platz (für den Rekursionsstack) kann im schlechtesten Fall bis zu O(n)
groß werden.
Ausweg: Formuliere r qsort um, so dass Rekursion nur für das kleinere
der beiden Teilarray angewendet wird.
Das größere wird in einer Iteration weiterbehandelt.
Effekt: Deutlich weniger Prozeduraufrufe.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
47
Bemerkungen:
• Quicksort ist nicht stabil.
• Platz (für den Rekursionsstack) kann im schlechtesten Fall bis zu O(n)
groß werden.
Ausweg: Formuliere r qsort um, so dass Rekursion nur für das kleinere
der beiden Teilarray angewendet wird.
Das größere wird in einer Iteration weiterbehandelt.
Effekt: Deutlich weniger Prozeduraufrufe.
Rekursionsstack hat höchstens Tiefe log n – fast in situ“.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
47
Prozedur hr qsort(a, b)
FG KTuEA, TU Ilmenau
// Halb-rekursive Variante
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
48
Prozedur hr qsort(a, b) // Halb-rekursive Variante
(1)
a ← a; b ← b;
(2)
while a < b do
(3)
s ← ein (z.B. zufälliges) Element von {a, . . . , b};
(4)
vertausche A[a] und A[s];
(5)
partition(a, b, p);
(6)
if p − a < b − p then
(7)
if a < p − 1 then hr qsort(a, p − 1);
(8)
a ← p + 1;
// while-Schleife bearbeitet rechtes Teilarray weiter
(9)
else // p − a ≥ b − p
(10)
if p + 1 < b then hr qsort(p + 1, b);
(11)
b ← p − 1;
// while-Schleife bearbeitet linkes Teilarray weiter
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
48
6.4 Heapsort
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
49
6.4 Heapsort
Heap-Ordnung in Binärbäumen:
Beispiel:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
49
6.4 Heapsort
Heap-Ordnung in Binärbäumen:
Beispiel:
3
min:
10
4
5
12
FG KTuEA, TU Ilmenau
10
3
5
12
12
12
12
3
12
17
max:
17
3
4
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
49
6.4 Heapsort
Heap-Ordnung in Binärbäumen:
Beispiel:
3
min:
10
4
5
12
10
3
5
12
12
12
12
3
12
17
max:
17
3
4
Hier nur interne Knoten relevant.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
49
6.4 Heapsort
Heap-Ordnung in Binärbäumen:
Beispiel:
3
min:
10
4
5
12
10
3
5
12
12
12
12
3
12
17
max:
17
3
4
Hier nur interne Knoten relevant.
Blätter: Knoten ohne (interne) Kinder.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
49
Definition 6.4.1
Ein Binärbaum T mit Knotenbeschriftungen m(v) aus (U, <)
heißt min-heapgeordnet (kurz oft: heapgeordnet),
wenn für alle Knoten v und w gilt:
v Vorgänger von w ⇒ m(v) ≤ m(w).
B
E
F
G
N
FG KTuEA, TU Ilmenau
E
P
H
F
N
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
50
B
E
F
G
N
E
P
H
F
N
Beachte: T heapgeordnet ⇒ in Knoten v steht der minimale
Eintrag des Teilbaums Tv mit Wurzel v.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
51
B
E
F
G
N
E
P
H
F
N
Beachte: T heapgeordnet ⇒ in Knoten v steht der minimale
Eintrag des Teilbaums Tv mit Wurzel v.
(T heißt max-heapgeordnet, wenn für jeden Knoten v gilt:
v Vorgänger von w ⇒ m(v) ≥ m(w).)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
51
Ein linksvollständiger“ Binärbaum:
”
Alle Levels j = 0, 1, . . . voll (jeweils 2j Knoten) bis auf das
tiefste.
Das tiefste Level l hat von links her gesehen eine ununterbrochene Folge von Knoten.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
52
Nummerierung von Knoten in unendlichem, vollständigen
Binärbaum
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
53
Nummerierung von Knoten in unendlichem, vollständigen
Binärbaum gemäß Leveldurchlauf-Anordnung:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
53
Nummerierung von Knoten in unendlichem, vollständigen
Binärbaum gemäß Leveldurchlauf-Anordnung:
1
1
0
2
0
1
1
0
1
1
0
0
11
10
9
7
6
0
1
1
0
5
8
0
3
4
0
1
0
1
12
0
1
14
13
1
0
1
0
1
0
15
0
1
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0
32
FG KTuEA, TU Ilmenau
1
1
46 47
63
0
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
53
Nummerierung von Knoten in unendlichem, vollständigen
Binärbaum gemäß Breitendurchlauf-Anordnung:
Beispiel:
(101110)2 = 46
1
1
0
2
0
1
1
0
1
1
0
0
11
10
9
7
6
0
1
1
0
5
8
0
3
4
0
1
0
1
12
0
1
14
13
1
0
1
0
1
0
15
0
1
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0
32
FG KTuEA, TU Ilmenau
1
1
46 47
63
0
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
53
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten 1 ist die Wurzel;
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten 1 ist die Wurzel;
Knoten 2i ist linkes Kind von i;
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten 1 ist die Wurzel;
Knoten 2i ist linkes Kind von i;
Knoten 2i + 1 ist rechtes Kind von i;
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten
Knoten
Knoten
Knoten
1 ist die Wurzel;
2i ist linkes Kind von i;
2i + 1 ist rechtes Kind von i;
i ≥ 2 hat Vorgänger bi/2c.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten
Knoten
Knoten
Knoten
1 ist die Wurzel;
2i ist linkes Kind von i;
2i + 1 ist rechtes Kind von i;
i ≥ 2 hat Vorgänger bi/2c.
Damit: Array-Darstellung für linksvollständige Binärbaume:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten
Knoten
Knoten
Knoten
1 ist die Wurzel;
2i ist linkes Kind von i;
2i + 1 ist rechtes Kind von i;
i ≥ 2 hat Vorgänger bi/2c.
Damit: Array-Darstellung für linksvollständige Binärbaume:
Speichere Einträge in Knoten i ∈ {1, . . . , n} in Arrayposition
A[i].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Ist s1 · · · sl ∈ {0, 1}l die Markierung auf dem Weg von der
Wurzel zu Knoten i auf Level l, so ist 1s1 · · · sl die Binärdarstellung von i.
Knoten
Knoten
Knoten
Knoten
1 ist die Wurzel;
2i ist linkes Kind von i;
2i + 1 ist rechtes Kind von i;
i ≥ 2 hat Vorgänger bi/2c.
Damit: Array-Darstellung für linksvollständige Binärbaume:
Speichere Einträge in Knoten i ∈ {1, . . . , n} in Arrayposition
A[i].
Spart den Platz für die Zeiger!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
54
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap),
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap), wenn der entsprechende
linksvollständige Binärbaum mit k Knoten
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap), wenn der entsprechende
linksvollständige Binärbaum mit k Knoten
(Knoten i mit A[i].key ∈ U und A[i].data ∈ D beschriftet)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap), wenn der entsprechende
linksvollständige Binärbaum mit k Knoten
(Knoten i mit A[i].key ∈ U und A[i].data ∈ D beschriftet)
bezüglich der key-Komponenten (min-)heapgeordnet ist,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap), wenn der entsprechende
linksvollständige Binärbaum mit k Knoten
(Knoten i mit A[i].key ∈ U und A[i].data ∈ D beschriftet)
bezüglich der key-Komponenten (min-)heapgeordnet ist,
d. h., wenn für 1 < i ≤ k gilt: A[bi/2c].key ≤ A[i].key.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap), wenn der entsprechende
linksvollständige Binärbaum mit k Knoten
(Knoten i mit A[i].key ∈ U und A[i].data ∈ D beschriftet)
bezüglich der key-Komponenten (min-)heapgeordnet ist,
d. h., wenn für 1 < i ≤ k gilt: A[bi/2c].key ≤ A[i].key.
Die zweite Definition erwähnt den (gedachten) Binärbaum nicht mehr
explizit.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Kombiniere Heapbedingung, Array-Darstellung, Daten:
Definition 6.4.2 Sei (U, <) Totalordnung.
Ein (Teil-)Array A[1 . . k] mit Einträgen aus U × D
heißt ein Min-Heap (oder Heap), wenn der entsprechende
linksvollständige Binärbaum mit k Knoten
(Knoten i mit A[i].key ∈ U und A[i].data ∈ D beschriftet)
bezüglich der key-Komponenten (min-)heapgeordnet ist,
d. h., wenn für 1 < i ≤ k gilt: A[bi/2c].key ≤ A[i].key.
Die zweite Definition erwähnt den (gedachten) Binärbaum nicht mehr
explizit.
(Analog: Max-Heap (benutze Maxheap-Ordnung).)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
55
Beispiel: U = {A, B, C, . . . , Z} mit der Standardordnung.
Daten weggelassen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
56
Beispiel: U = {A, B, C, . . . , Z} mit der Standardordnung.
Daten weggelassen.
Ein Min-Heap und der zugeordnete Baum (k = 10):
1
2
3
4
5
6
7
8
9
10
B
E
F
G
E
H
F
H
I
G
11
12
* *
1
B
2
3
E
F
4
5
E
G
8
6
7
H
F
9 10
H
FG KTuEA, TU Ilmenau
I
G
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
56
Aufgabe: Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
F
5
4
E
G
8
6
7
H
F
9
H
I
Beobachte: Wenn man den Wurzelschlüssel G z. B. durch C
ersetzt, entsteht ein Heap.
Definition: Höchstens A[j] ist zu groß :⇔
es gibt einen Schlüssel x ≤ A[j].key, so dass ein Heap
entsteht, wenn man A[j].key durch x ersetzt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
56
Aufgabe: Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
C
E
F
G
E
H
F
H
I
* * *
1
C
2
3
F
E
4
5
E
G
8
6
7
H
F
9
H
I
Beobachte: Wenn man den Wurzelschlüssel G z. B. durch C
ersetzt, entsteht ein Heap.
Definition: Höchstens A[j] ist zu groß :⇔
es gibt einen Schlüssel x ≤ A[j].key, so dass ein Heap
entsteht, wenn man A[j].key durch x ersetzt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
56
Aufgabe: Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
F
5
4
E
G
8
6
7
H
F
9
H
I
Beobachte: Wenn man den Wurzelschlüssel G z. B. durch C
ersetzt, entsteht ein Heap.
Definition: Höchstens A[j] ist zu groß :⇔
es gibt einen Schlüssel x ≤ A[j].key, so dass ein Heap
entsteht, wenn man A[j].key durch x ersetzt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
57
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
5
4
E
G
8
F
?
6
7
H
F
9
H
I
Höchstens A[1] ist zu groß: 1 ist aktueller Knoten“.
”
Vergleich der beiden Kinder des aktuellen Knotens.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
5
4
E
G
8
F
<
6
7
H
F
9
H
I
Höchstens A[1] ist zu groß: 1 ist aktueller Knoten“.
”
Vergleich der beiden Kinder des aktuellen Knotens.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
?
2
3
E
5
4
E
G
8
F
<
6
7
H
F
9
H
I
Vergleich des kleineren“ Kinds mit dem aktuellen Knoten.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
<
2
3
E
5
4
E
G
8
F
<
6
7
H
F
9
H
I
Vergleich des kleineren“ Kinds mit dem aktuellen Knoten.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
G
F
G
E
H
F
H
I
* * *
1
E
2
3
F
G
4
5
E
G
8
6
7
H
F
9
H
I
Falls kleiner:
Vertauschen des kleineren“ Kinds mit dem aktuellen Knoten.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
G
F
G
E
H
F
H
I
* * *
1
E
2
3
F
G
4
5
E
G
8
6
7
H
F
9
H
I
Falls kleiner:
Vertauschen des kleineren“ Kinds mit dem aktuellen Knoten.
”
Nun: Höchstens A[2] ist zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
G
F
G
E
H
F
H
I
* * *
1
E
2
3
F
G
4
5
E
G
8
6
7
H
F
9
H
I
Falls kleiner:
Vertauschen des kleineren“ Kinds mit dem aktuellen Knoten.
”
Nun: Höchstens A[2] ist zu groß. (Ersetze G durch E!)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
G
F
G
E
H
F
H
I
* * *
1
E
2
3
G
F
>
4
5
G
>
8
E
6
7
H
F
9
H
I
Vergleich des kleineren“ Kinds mit dem aktuellen Knoten.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
G
H
F
H
I
* * *
1
E
2
3
F
E
5
4
G
G
8
6
7
H
F
9
H
I
Vertauschen des kleineren“ Kinds mit dem aktuellen Knoten.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
G
H
F
H
I
* * *
1
E
2
3
F
E
5
4
G
G
8
6
7
H
F
9
H
I
Vertauschen des kleineren“ Kinds mit dem aktuellen Knoten.
”
Höchstens A[5] ist zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
G
H
F
H
I
* * *
1
E
2
3
F
E
5
4
G
G
8
6
7
H
F
9
H
I
Vertauschen des kleineren“ Kinds mit dem aktuellen Knoten.
”
Höchstens A[5] ist zu groß.
Aber Knoten 5 hat keine Kinder.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
G
H
F
H
I
* * *
1
E
2
3
F
E
5
4
G
G
8
6
7
H
F
9
H
I
Kein Fehler mehr: Reparatur beendet.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
Heaps reparieren
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
G
H
F
H
I
* * *
1
E
2
3
F
E
5
4
G
G
8
6
7
H
F
9
H
I
Kein Fehler mehr: Reparatur beendet.
Andere Möglichkeit für Ende: Eintrag im aktuellen Knoten ist
nicht größer als der im kleineren Kind“.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
58
bubbleDown(1, k) // Heap-Reparatur in A[1 . . k]
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
59
bubbleDown(1, k) // Heap-Reparatur in A[1 . . k]
// Vorbedingung: Höchstens A[1] ist zu groß
(1)
j ← 1; done ← (2 ∗ j > k);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
59
bubbleDown(1, k) // Heap-Reparatur in A[1 . . k]
// Vorbedingung: Höchstens A[1] ist zu groß
(1)
j ← 1; done ← (2 ∗ j > k);
(2)
while not done do
// (∗) höchstens A[j] ist zu groß, A[j] hat Kind A[2 ∗ j] im Baum
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
59
bubbleDown(1, k) // Heap-Reparatur in A[1 . . k]
// Vorbedingung: Höchstens A[1] ist zu groß
(1)
j ← 1; done ← (2 ∗ j > k);
(2)
while not done do
// (∗) höchstens A[j] ist zu groß, A[j] hat Kind A[2 ∗ j] im Baum
(3)
m ← 2 ∗ j;
(4)
if m + 1 ≤ k and A[m+1].key < A[m].key
(5)
then m ← m + 1; // A[m] ist einziges oder kleineres“ Kind
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
59
bubbleDown(1, k) // Heap-Reparatur in A[1 . . k]
// Vorbedingung: Höchstens A[1] ist zu groß
(1)
j ← 1; done ← (2 ∗ j > k);
(2)
while not done do
// (∗) höchstens A[j] ist zu groß, A[j] hat Kind A[2 ∗ j] im Baum
(3)
m ← 2 ∗ j;
(4)
if m + 1 ≤ k and A[m+1].key < A[m].key
(5)
then m ← m + 1; // A[m] ist einziges oder kleineres“ Kind
”
(6)
if A[m].key < A[j].key
(7)
then vertausche A[j] mit A[m]; j ← m; done ← (2 ∗ j > k);
(8)
// wenn done = false, dann gilt wieder (∗)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
59
bubbleDown(1, k) // Heap-Reparatur in A[1 . . k]
// Vorbedingung: Höchstens A[1] ist zu groß
(1)
j ← 1; done ← (2 ∗ j > k);
(2)
while not done do
// (∗) höchstens A[j] ist zu groß, A[j] hat Kind A[2 ∗ j] im Baum
(3)
m ← 2 ∗ j;
(4)
if m + 1 ≤ k and A[m+1].key < A[m].key
(5)
then m ← m + 1; // A[m] ist einziges oder kleineres“ Kind
”
(6)
if A[m].key < A[j].key
(7)
then vertausche A[j] mit A[m]; j ← m; done ← (2 ∗ j > k);
(8)
// wenn done = false, dann gilt wieder (∗)
(9)
else done ← true. // fertig, kein Fehler mehr.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
59
Korrektheit:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
60
Korrektheit:
Wir behaupten: Wenn höchstens A[1] zu groß ist und bubbleDown(1, k)
durchgeführt wird, dann entsteht ein Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
60
Korrektheit:
Wir behaupten: Wenn höchstens A[1] zu groß ist und bubbleDown(1, k)
durchgeführt wird, dann entsteht ein Heap.
Dazu zeigen wir folgende Behauptung durch Induktion über die
Schleifendurchläufe:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
60
Korrektheit:
Wir behaupten: Wenn höchstens A[1] zu groß ist und bubbleDown(1, k)
durchgeführt wird, dann entsteht ein Heap.
Dazu zeigen wir folgende Behauptung durch Induktion über die
Schleifendurchläufe:
(IBj )
Zu Beginn des Durchlaufs, in dem j die Zahl j enthält, ist
höchstens A[j] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
60
Korrektheit:
Wir behaupten: Wenn höchstens A[1] zu groß ist und bubbleDown(1, k)
durchgeführt wird, dann entsteht ein Heap.
Dazu zeigen wir folgende Behauptung durch Induktion über die
Schleifendurchläufe:
(IBj )
Zu Beginn des Durchlaufs, in dem j die Zahl j enthält, ist
höchstens A[j] zu groß.
Wir formulieren den Beweis in der Baum-Sprechweise.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
60
Korrektheit:
Wir behaupten: Wenn höchstens A[1] zu groß ist und bubbleDown(1, k)
durchgeführt wird, dann entsteht ein Heap.
Dazu zeigen wir folgende Behauptung durch Induktion über die
Schleifendurchläufe:
(IBj )
Zu Beginn des Durchlaufs, in dem j die Zahl j enthält, ist
höchstens A[j] zu groß.
Wir formulieren den Beweis in der Baum-Sprechweise.
Der Ind.-Anfang (j = 1) gilt nach Voraussetzung.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
60
Betrachte Schleifendurchlauf für Knoten j.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
61
Betrachte Schleifendurchlauf für Knoten j.
1. Fall: In Zeile (7) wird A[j] mit A[2j] vertauscht.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
61
Betrachte Schleifendurchlauf für Knoten j.
1. Fall: In Zeile (7) wird A[j] mit A[2j] vertauscht.
Es seien u, v, w die Schlüssel in A[j], A[2j] bzw. A[2j + 1] vor der
Vertauschung. Nach (IBj ) können wir ein x ≤ u wählen, so dass
(∗)
FG KTuEA, TU Ilmenau
ein Heap entsteht, wenn man u durch x ersetzt.
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
61
Betrachte Schleifendurchlauf für Knoten j.
1. Fall: In Zeile (7) wird A[j] mit A[2j] vertauscht.
Es seien u, v, w die Schlüssel in A[j], A[2j] bzw. A[2j + 1] vor der
Vertauschung. Nach (IBj ) können wir ein x ≤ u wählen, so dass
(∗)
ein Heap entsteht, wenn man u durch x ersetzt.
Wissen nach Algorithmus: v ≤ w und v < u.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
61
Betrachte Schleifendurchlauf für Knoten j.
1. Fall: In Zeile (7) wird A[j] mit A[2j] vertauscht.
Es seien u, v, w die Schlüssel in A[j], A[2j] bzw. A[2j + 1] vor der
Vertauschung. Nach (IBj ) können wir ein x ≤ u wählen, so dass
(∗)
ein Heap entsteht, wenn man u durch x ersetzt.
Wissen nach Algorithmus: v ≤ w und v < u.
Nach der Vertauschung steht u in A[2j] und v in A[j].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
61
Betrachte Schleifendurchlauf für Knoten j.
1. Fall: In Zeile (7) wird A[j] mit A[2j] vertauscht.
Es seien u, v, w die Schlüssel in A[j], A[2j] bzw. A[2j + 1] vor der
Vertauschung. Nach (IBj ) können wir ein x ≤ u wählen, so dass
(∗)
ein Heap entsteht, wenn man u durch x ersetzt.
Wissen nach Algorithmus: v ≤ w und v < u.
Nach der Vertauschung steht u in A[2j] und v in A[j]. Wir behaupten,
dass ein Heap entsteht, wenn wir A[2j].key durch v ersetzen.
(Weil v < u, liefert das (IB2j ).)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
61
z
x u
2j
FG KTuEA, TU Ilmenau
v
j
w
2j+1
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
62
z
z
x u
2j
FG KTuEA, TU Ilmenau
v
j
j/2
v
w
2j+1
2j
u v
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
j
w
2j+1
62
z
z
x u
2j
v
j
j/2
v
w
2j+1
2j
u v
j
w
2j+1
Dazu müssen wir wegen (∗) nur die Beziehung der Schlüssel in Knoten
j und 2j untereinander und zu Kindern und Vorgängern betrachten (rote
Kanten).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
62
z
z
x u
2j
v
j
j/2
v
w
2j+1
2j
u v
j
w
2j+1
Dazu müssen wir wegen (∗) nur die Beziehung der Schlüssel in Knoten
j und 2j untereinander und zu Kindern und Vorgängern betrachten (rote
Kanten). Knoten j und 2j haben den gleichen Eintrag v.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
62
z
z
x u
2j
v
j
j/2
v
w
2j+1
2j
u v
j
w
2j+1
Dazu müssen wir wegen (∗) nur die Beziehung der Schlüssel in Knoten
j und 2j untereinander und zu Kindern und Vorgängern betrachten (rote
Kanten). Knoten j und 2j haben den gleichen Eintrag v.
(1) Falls j > 1, gilt für den Schlüssel z im Vaterknoten bj/2c von j:
z ≤ x ≤ v (nach (∗)).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
62
z
z
x u
2j
v
j
j/2
v
w
2j+1
2j
u v
j
w
2j+1
Dazu müssen wir wegen (∗) nur die Beziehung der Schlüssel in Knoten
j und 2j untereinander und zu Kindern und Vorgängern betrachten (rote
Kanten). Knoten j und 2j haben den gleichen Eintrag v.
(1) Falls j > 1, gilt für den Schlüssel z im Vaterknoten bj/2c von j:
z ≤ x ≤ v (nach (∗)).
(2) v ≤ Schlüssel in Kindknoten von 2j (nach (∗));
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
62
z
z
x u
2j
v
j
j/2
v
w
2j+1
2j
u v
j
w
2j+1
Dazu müssen wir wegen (∗) nur die Beziehung der Schlüssel in Knoten
j und 2j untereinander und zu Kindern und Vorgängern betrachten (rote
Kanten). Knoten j und 2j haben den gleichen Eintrag v.
(1) Falls j > 1, gilt für den Schlüssel z im Vaterknoten bj/2c von j:
z ≤ x ≤ v (nach (∗)).
(2) v ≤ Schlüssel in Kindknoten von 2j (nach (∗));
(3) v ≤ w (wurde verglichen).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
62
2. Fall: In Zeile (7) wird A[j] mit A[2j + 1] vertauscht: analog.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
63
2. Fall: In Zeile (7) wird A[j] mit A[2j + 1] vertauscht: analog.
Nach einer Reihe von Schleifendurchläufen endet die Schleife mit j in
j, weil Knoten j keine Kinder hat oder die Schlüssel in den Kindern
≥ u = A[j].key sind.
Nach der Behauptung von eben gilt (IBj ).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
63
2. Fall: In Zeile (7) wird A[j] mit A[2j + 1] vertauscht: analog.
Nach einer Reihe von Schleifendurchläufen endet die Schleife mit j in
j, weil Knoten j keine Kinder hat oder die Schlüssel in den Kindern
≥ u = A[j].key sind.
Nach der Behauptung von eben gilt (IBj ).
Sei x ≤ u so gewählt, dass ein Heap entsteht, wenn man u durch x
ersetzt. Dann ist aber auch A[1 . . k] ohne diese Ersetzung ein Heap, weil
die Schlüssel in den Kindern von Knoten j nicht kleiner als u sind und im
Fall j > 1 der Schlüssel im Vaterknoten bj/2c nicht größer als x, also erst
recht nicht größer als u ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
63
Kosten: Der Inhalt j der Variablen j ist anfangs 1 und verdoppelt sich
in jeder Runde (mindestens); ein Schleifendurchlauf findet nur statt, wenn
2j ≤ k ist.
Daher: Wenn es s Durchläufe durch die while-Schleife gibt, muss 2s ≤ n
sein, d. h. s ≤ log k.
Kosten: O(log k), bei nicht mehr als 2 log k Vergleichen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
64
Kosten: Der Inhalt j der Variablen j ist anfangs 1 und verdoppelt sich
in jeder Runde (mindestens); ein Schleifendurchlauf findet nur statt, wenn
2j ≤ k ist.
Daher: Wenn es s Durchläufe durch die while-Schleife gibt, muss 2s ≤ n
sein, d. h. s ≤ log k.
Kosten: O(log k), bei nicht mehr als 2 log k Vergleichen.
Wir haben damit gezeigt:
Lemma 6.4.3
Wenn anfangs höchstens A[1] zu groß ist, stellt bubbleDown(1, k) die Heapeigenschaft her. Die Prozedur führt
maximal 2 log k Vergleiche durch und hat Laufzeit O(log k).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
64
Die Idee von Heapsort für ein Array A[1..n] ist nun folgende:
1. (Heapaufbau) Arrangiere A[1..n] so um, dass ein Heap
entsteht.
2. (Auswahlphase) Für k von n abwärts bis 2:
Entnimm kleinsten Eintrag A[1] aus dem Heap A[1..k].
Stelle mit den in A[2..k] verbliebenen Einträgen in A[1..k −1]
wieder einen Heap her.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
65
Die Idee von Heapsort für ein Array A[1..n] ist nun folgende:
1. (Heapaufbau) Arrangiere A[1..n] so um, dass ein Heap
entsteht.
2. (Auswahlphase) Für k von n abwärts bis 2:
Entnimm kleinsten Eintrag A[1] aus dem Heap A[1..k].
Stelle mit den in A[2..k] verbliebenen Einträgen in A[1..k −1]
wieder einen Heap her.
(In A[k] ist dann Platz für den entnommenen Eintrag.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
65
Die Idee von Heapsort für ein Array A[1..n] ist nun folgende:
1. (Heapaufbau) Arrangiere A[1..n] so um, dass ein Heap
entsteht.
2. (Auswahlphase) Für k von n abwärts bis 2:
Entnimm kleinsten Eintrag A[1] aus dem Heap A[1..k].
Stelle mit den in A[2..k] verbliebenen Einträgen in A[1..k −1]
wieder einen Heap her.
(In A[k] ist dann Platz für den entnommenen Eintrag.)
Dadurch werden die Arrayeinträge in steigender Reihenfolge
entnommen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
65
Die Idee von Heapsort für ein Array A[1..n] ist nun folgende:
1. (Heapaufbau) Arrangiere A[1..n] so um, dass ein Heap
entsteht.
2. (Auswahlphase) Für k von n abwärts bis 2:
Entnimm kleinsten Eintrag A[1] aus dem Heap A[1..k].
Stelle mit den in A[2..k] verbliebenen Einträgen in A[1..k −1]
wieder einen Heap her.
(In A[k] ist dann Platz für den entnommenen Eintrag.)
Dadurch werden die Arrayeinträge in steigender Reihenfolge
entnommen.
Wenn wir den in Runde k entnommenen Eintrag in A[k]
speichern, ist am Ende das Array A[1..n] fallend sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
65
Auswahlphase als Programm:
Prozedur HeapSelect(1, n)
(1) for k from n downto 3 do
// in A[1] steht das Minimum von A[1..k]
(2)
vertausche A[1] mit A[k];
// in A[1..k − 1] ist höchstens A[1] zu groß
(3)
bubbleDown(1, k − 1); // Heapreparatur
// A[1..2] ist Heap, also A[1] ≤ A[2]
(4) vertausche A[1] mit A[2].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
C
E
F
G
E
H
F
H
I
* * *
1
C
2
3
F
E
4
5
E
G
8
6
7
H
F
9
H
I
Ein Heap: A[1..9].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
I
E
F
G
E
H
F
H
C
* * *
1
I
2
3
F
E
5
4
G
E
6
7
H
F
8
H
Minimum nach A[9], altes A[9] in die Wurzel.
In A[1..8] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
I
H
F
H
C
* * *
1
I
2
3
F
E
5
4
G
E
6
7
H
F
8
H
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
I
H
F
H
C
* * *
1
E
2
3
F
E
4
5
G
I
6
7
H
F
8
H
Nach bubbleDown.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
E
E
F
G
I
H
F
H
C
* * *
1
E
2
3
F
E
4
5
G
I
6
7
H
F
8
H
A[1..8] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
E
F
G
I
H
F
E
C
* * *
1
H
2
3
F
E
5
4
G
I
6
7
H
F
Minimum nach A[8], altes A[8] in die Wurzel.
In A[1..7] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
E
F
G
I
H
F
E
C
* * *
1
H
2
3
F
E
5
4
G
I
6
7
H
F
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
E
G
F
H
I
H
F
E
C
* * *
1
E
2
3
F
G
5
4
H
I
6
7
H
F
Nach bubbleDown.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
E
G
F
H
I
H
F
E
C
* * *
1
E
2
3
F
G
5
4
H
I
6
7
H
F
A[1..7] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
F
G
F
H
I
H
E
E
C
* * *
1
F
2
3
G
F
4
5
H
I
6
H
Minimum nach A[7], altes A[7] in die Wurzel.
In A[1..6] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
F
G
F
H
I
H
E
E
C
* * *
1
F
2
3
G
F
4
5
H
I
6
H
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
F
G
F
H
I
H
E
E
C
* * *
1
F
2
3
G
F
4
5
H
I
6
H
A[1..6] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
G
F
H
I
F
E
E
C
* * *
1
H
2
3
G
F
4
5
H
I
Minimum nach A[6], altes A[6] in die Wurzel.
In A[1..5] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
G
F
H
I
F
E
E
C
* * *
1
H
2
3
F
G
4
5
H
I
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
F
G
H
H
I
F
E
E
C
* * *
1
F
2
3
H
G
4
5
H
I
Nach bubbleDown.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
F
G
H
H
I
F
E
E
C
* * *
1
F
2
3
G
H
4
5
H
I
A[1..5] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
I
G
H
H
F
F
E
E
C
* * *
1
I
2
3
G
H
4
H
Minimum nach A[5], altes A[5] in die Wurzel.
In A[1..4] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
I
G
H
H
F
F
E
E
C
* * *
1
I
2
3
G
H
4
H
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
G
H
H
I
F
F
E
E
C
* * *
1
G
2
3
H
H
4
I
Nach bubbleDown.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
G
H
H
I
F
F
E
E
C
* * *
1
G
2
3
H
H
4
I
A[1..4] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
I
H
H
G
F
F
E
E
C
* * *
1
I
2
3
H
H
Minimum nach A[4], altes A[4] in die Wurzel.
In A[1..3] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
I
H
H
G
F
F
E
E
C
* * *
1
I
2
3
H
H
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
I
H
G
F
F
E
E
C
* * *
1
H
2
3
I
H
Nach bubbleDown.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
I
H
G
F
F
E
E
C
* * *
1
H
2
3
I
H
A[1..3] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
I
H
G
F
F
E
E
C
* * *
1
H
2
I
Minimum nach A[3], altes A[3] in die Wurzel.
In A[1..2] höchstens A[1] zu groß.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
I
H
G
F
F
E
E
C
* * *
1
H
2
I
Von bubbleDown verfolgter Weg.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
H
I
H
G
F
F
E
E
C
* * *
1
H
2
I
A[1..2] ist Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Auswahlphase
11
12
1
2
3
4
5
6
7
8
9
10
I
H
H
G
F
F
E
E
C
* * *
Vertauschen von A[1] und A[2] vollendet fallende Sortierung.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
66
Satz 6.4.4
Die Prozedur HeapSelect(1, n) führt höchstens 2n log n Vergleiche durch und hat Rechenzeit O(n log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
67
Satz 6.4.4
Die Prozedur HeapSelect(1, n) führt höchstens 2n log n Vergleiche durch und hat Rechenzeit O(n log n).
Beweis:
Anzahl Vergleiche: höchstens
FG KTuEA, TU Ilmenau
P
2≤k≤n 2 log k
< 2n log n.
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
67
Satz 6.4.4
Die Prozedur HeapSelect(1, n) führt höchstens 2n log n Vergleiche durch und hat Rechenzeit O(n log n).
Beweis:
P
Anzahl Vergleiche: höchstens 2≤k≤n 2 log k < 2n log n.
P
Kosten:
2≤k≤n (O(1) + O(log k))
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
67
Satz 6.4.4
Die Prozedur HeapSelect(1, n) führt höchstens 2n log n Vergleiche durch und hat Rechenzeit O(n log n).
Beweis:
P
Anzahl Vergleiche: höchstens 2≤k≤n 2 log k < 2n log n.
P
Kosten:
2≤k≤n (O(1) + O(log k)) = O(n) + O(n log n) = O(n log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
67
. . . und wie verwandelt man A[1 . . n] in einen Heap?
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
68
. . . und wie verwandelt man A[1 . . n] in einen Heap?
Beispiel: Teil eines linksvollständigen Binärbaums, der einem
Teilheap“ A[3 . . 10] entspricht:
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
68
. . . und wie verwandelt man A[1 . . n] in einen Heap?
Beispiel: Teil eines linksvollständigen Binärbaums, der einem
Teilheap“ A[3 . . 10] entspricht:
”
Teilheap
D P A B R MN K L T E F G
D
A
P
R
B
K
FG KTuEA, TU Ilmenau
L
T
N
M
E
F
G
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
68
Definition 6.4.5
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
69
Definition 6.4.5
Das Teilarray A[` . . k] von A[1 . . n]
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
69
Definition 6.4.5
Das Teilarray A[` . . k] von A[1 . . n] (1 ≤ ` ≤ k ≤ n)
heißt ein Teilheap, falls innerhalb“ des Teilarrays die
”
Heapeigenschaft gilt, d. h.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
69
Definition 6.4.5
Das Teilarray A[` . . k] von A[1 . . n] (1 ≤ ` ≤ k ≤ n)
heißt ein Teilheap, falls innerhalb“ des Teilarrays die
”
Heapeigenschaft gilt, d. h. wenn für alle i mit 2` ≤ i ≤ k
gilt:
HE(bi/2c, i) :⇔ A[bi/2c] ≤ A[i].
Klar: Ein Teilheap ist die disjunkte Vereinigung von
heapgeordneten Bäumen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
69
Idee: Wenn A[` + 1 . . k] ein Teilheap ist, dann ist in dem
Teilbaum T`,k mit Wurzel ` und Knoten in {`, . . . , k} die
Heapbedingung höchstens in ` verletzt, d. h. höchstens der
Schlüssel in Knoten ` ist zu groß.
Wir können mit einer Variante von bubbleDown in diesem
Teilbaum die Heapbedingung herstellen.
Prozedur bubbleDown(`, k) // Heapreparatur in T`,k
(1)
j ← `; done ← (2 ∗ j > k);
(2)
while not done do
(3) . . .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
70
Lemma 6.4.6
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
71
Lemma 6.4.6
Wenn A[` + 1..k] Teilheap ist, dann ist nach Ausführung
von bubbleDown(`, k) das Teilarray A[`..k] Teilheap. Die
Anzahl der Vergleiche ist nicht größer als 2 log(k/`), die
Laufzeit O(log(k/`)).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
71
Lemma 6.4.6
Wenn A[` + 1..k] Teilheap ist, dann ist nach Ausführung
von bubbleDown(`, k) das Teilarray A[`..k] Teilheap. Die
Anzahl der Vergleiche ist nicht größer als 2 log(k/`), die
Laufzeit O(log(k/`)).
Beweis: Korrektheit wie bei Lemma 6.4.3.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
71
Lemma 6.4.6
Wenn A[` + 1..k] Teilheap ist, dann ist nach Ausführung
von bubbleDown(`, k) das Teilarray A[`..k] Teilheap. Die
Anzahl der Vergleiche ist nicht größer als 2 log(k/`), die
Laufzeit O(log(k/`)).
Beweis: Korrektheit wie bei Lemma 6.4.3.
Anzahl Schlüsselvergleiche ähnlich wie bei Lemma 6.4.3:
Wenn es in bubbleDown(`, k) s Schleifendurchläufe gibt,
muss 2s · ` ≤ k sein, d. h. s ≤ log(k/`). Also gibt es maximal
2 log(k/`) Vergleiche bei einem Zeitaufwand von O(log(k/`)).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
71
Prozedur makeHeap(1, n)
// Transformiert Array A[1 . . n] in einen Heap
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
72
Prozedur makeHeap(1, n)
// Transformiert Array A[1 . . n] in einen Heap
(1) for l from bn/2c downto 1 do
(2)
// stelle in A[l..n] Heapbedingung her!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
72
Prozedur makeHeap(1, n)
// Transformiert Array A[1 . . n] in einen Heap
(1) for l from bn/2c downto 1 do
(2)
// stelle in A[l..n] Heapbedingung her!
(3)
bubbleDown(l, n);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
72
Prozedur makeHeap(1, n)
// Transformiert Array A[1 . . n] in einen Heap
(1) for l from bn/2c downto 1 do
(2)
// stelle in A[l..n] Heapbedingung her!
(3)
bubbleDown(l, n);
Lemma 6.4.7
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
72
Prozedur makeHeap(1, n)
// Transformiert Array A[1 . . n] in einen Heap
(1) for l from bn/2c downto 1 do
(2)
// stelle in A[l..n] Heapbedingung her!
(3)
bubbleDown(l, n);
Lemma 6.4.7
Ein Aufruf makeHeap(1, n) wandelt A[1..n] in einen Heap
um. Die Anzahl der Vergleiche ist nicht größer als 2n; die
Rechenzeit ist O(n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
72
Prozedur makeHeap(1, n)
// Transformiert Array A[1 . . n] in einen Heap
(1) for l from bn/2c downto 1 do
(2)
// stelle in A[l..n] Heapbedingung her!
(3)
bubbleDown(l, n);
Lemma 6.4.7
Ein Aufruf makeHeap(1, n) wandelt A[1..n] in einen Heap
um. Die Anzahl der Vergleiche ist nicht größer als 2n; die
Rechenzeit ist O(n).
Beweis der Korrektheit:
Mit Induktion über ` = bn/2c, bn/2c − 1, . . . , 2, 1 zeige:
Nach Durchlauf mit ` in l ist A[` . . n] Teilheap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
72
Kosten: Anzahl der Vergleiche:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
1≤`≤n/2
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
1≤j≤log n
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
X
1
1≤j≤log n 1≤`≤n/2j
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
X
1
1≤j≤log n 1≤`≤n/2j
≤ 2·
X
1≤j≤log n
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
X
1
1≤j≤log n 1≤`≤n/2j
≤ 2·
X
1≤j≤log n
FG KTuEA, TU Ilmenau
n
2j
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
X
1
1≤j≤log n 1≤`≤n/2j
≤ 2·
X
1≤j≤log n
FG KTuEA, TU Ilmenau
n
< 2n ·
j
2
X
1≤j≤log n
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
X
1
1≤j≤log n 1≤`≤n/2j
≤ 2·
X
1≤j≤log n
FG KTuEA, TU Ilmenau
n
< 2n ·
j
2
X
1≤j≤log n
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
1
2j
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
= 2·
X
X
1
1≤`≤n/2 j : `·2j ≤n
= 2·
X
X
1
1≤j≤log n 1≤`≤n/2j
≤ 2·
X
1≤j≤log n
n
< 2n ·
j
2
(Geometrische Reihe:
FG KTuEA, TU Ilmenau
X
1≤j≤log n
1
2j
−j
2
= 1.)
j≥1
P
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Kosten: Anzahl der Vergleiche:
X
2·
blog(n/`)c
1≤`≤n/2
X
= 2·
X
1
1≤`≤n/2 j : `·2j ≤n
X
= 2·
X
1
1≤j≤log n 1≤`≤n/2j
X
≤ 2·
1≤j≤log n
n
< 2n ·
j
2
(Geometrische Reihe:
X
1≤j≤log n
1
2j
−j
2
= 1.)
j≥1
P
< 2n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
73
Algorithmus HeapSort(A[1 . . n])
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n. HeapSort arbeitet in situ (ist aber nicht stabil).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n. HeapSort arbeitet in situ (ist aber nicht stabil).
Beweis: Korrektheit
Teilprozeduren.
FG KTuEA, TU Ilmenau
und
Zeitbedarf
folgt
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
aus
der
Analyse
der
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n. HeapSort arbeitet in situ (ist aber nicht stabil).
Beweis: Korrektheit und Zeitbedarf folgt aus der Analyse der
Teilprozeduren. Die Gesamtzahl der Vergleiche ist nach der Analyse von
HeapSelect und Lemma 6.4.7 höchstens:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n. HeapSort arbeitet in situ (ist aber nicht stabil).
Beweis: Korrektheit und Zeitbedarf folgt aus der Analyse der
Teilprozeduren. Die Gesamtzahl der Vergleiche ist nach der Analyse von
HeapSelect und Lemma 6.4.7 höchstens:
P
P
2n + 2≤k≤n 2 log k ≤ 2n + 2 · 2≤k≤n log k
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n. HeapSort arbeitet in situ (ist aber nicht stabil).
Beweis: Korrektheit und Zeitbedarf folgt aus der Analyse der
Teilprozeduren. Die Gesamtzahl der Vergleiche ist nach der Analyse von
HeapSelect und Lemma 6.4.7 höchstens:
P
P
2n + 2≤k≤n 2 log k ≤ 2n + 2 · 2≤k≤n log k ≤ 2n + 2n log n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Algorithmus HeapSort(A[1 . . n])
(1) makeHeap(1, n);
(2) HeapSelect(1, n);
Satz 6.4.8
Algorithmus HeapSort sortiert das Array A[1 . . n] in fallende
Reihenfolge. Die gesamte Laufzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1), für genügend
große n. HeapSort arbeitet in situ (ist aber nicht stabil).
Beweis: Korrektheit und Zeitbedarf folgt aus der Analyse der
Teilprozeduren. Die Gesamtzahl der Vergleiche ist nach der Analyse von
HeapSelect und Lemma 6.4.7 höchstens:
P
P
2n + 2≤k≤n 2 log k ≤ 2n + 2 · 2≤k≤n log k ≤ 2n + 2n log n.
Bemerkung: Man kann sogar zeigen: < 2n log n Vergleiche.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
74
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
Die in A[1 . . n] entstehende Struktur heißt ein Max-Heap
– in der Wurzel des Binärbaumes steht immer das Maximum.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
Die in A[1 . . n] entstehende Struktur heißt ein Max-Heap
– in der Wurzel des Binärbaumes steht immer das Maximum.
Bemerkung 2: Die mittlere Anzahl von Vergleichen,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
Die in A[1 . . n] entstehende Struktur heißt ein Max-Heap
– in der Wurzel des Binärbaumes steht immer das Maximum.
Bemerkung 2: Die mittlere Anzahl von Vergleichen, unter
der Annahme, dass jede Anordnung der Eingabeobjekte in
A[1 . . n] dieselbe Wahrscheinlichkeit 1/n! hat,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
Die in A[1 . . n] entstehende Struktur heißt ein Max-Heap
– in der Wurzel des Binärbaumes steht immer das Maximum.
Bemerkung 2: Die mittlere Anzahl von Vergleichen, unter
der Annahme, dass jede Anordnung der Eingabeobjekte in
A[1 . . n] dieselbe Wahrscheinlichkeit 1/n! hat,
ist 2n log n − O(n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
Die in A[1 . . n] entstehende Struktur heißt ein Max-Heap
– in der Wurzel des Binärbaumes steht immer das Maximum.
Bemerkung 2: Die mittlere Anzahl von Vergleichen, unter
der Annahme, dass jede Anordnung der Eingabeobjekte in
A[1 . . n] dieselbe Wahrscheinlichkeit 1/n! hat,
ist 2n log n − O(n).
Bemerkung 3: Variante Bottom-Up-Heapsort“ hat n log n + O(n)
”
Vergleiche im mittleren Fall.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 1: Wenn Sortierung in aufsteigende Reihenfolge
gewünscht wird, ersetze in allen Prozeduren und Programmen
Schlüsselvergleiche A[i] ≤ A[j]“ durch A[i] ≥ A[j]“ und
”
”
umgekehrt.
Die in A[1 . . n] entstehende Struktur heißt ein Max-Heap
– in der Wurzel des Binärbaumes steht immer das Maximum.
Bemerkung 2: Die mittlere Anzahl von Vergleichen, unter
der Annahme, dass jede Anordnung der Eingabeobjekte in
A[1 . . n] dieselbe Wahrscheinlichkeit 1/n! hat,
ist 2n log n − O(n).
Bemerkung 3: Variante Bottom-Up-Heapsort“ hat n log n + O(n)
”
Vergleiche im mittleren Fall. – Idee: Bei bubbleDown laufe gesamten
Weg der kleineren Kinder“ bis zum Blatt, ziehe die kleineren Kinder“
”
”
um eine Ebene nach oben und füge dann das kritische Element aus der
Wurzel von unten nach oben an die richtige Stelle ein.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
75
Bemerkung 4: Bei Variante 4-Way-Heapsort“ hat jeder Kno”
ten i ≥ 1 vier Kinder, nämlich 4i − 2, 4i − 1, 4i, 4i + 1
(soweit ≤ n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
76
Bemerkung 4: Bei Variante 4-Way-Heapsort“ hat jeder Kno”
ten i ≥ 1 vier Kinder, nämlich 4i − 2, 4i − 1, 4i, 4i + 1
(soweit ≤ n).
Die Heapbedingung wird verallgemeinert:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
76
Bemerkung 4: Bei Variante 4-Way-Heapsort“ hat jeder Kno”
ten i ≥ 1 vier Kinder, nämlich 4i − 2, 4i − 1, 4i, 4i + 1
(soweit ≤ n).
Die Heapbedingung wird verallgemeinert:
A[i] ≤ A[4i − 2], A[4i − 1], A[4i], A[4i + 1],
für i ≥ 1, soweit die Indizes ≤ n sind.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
76
Bemerkung 4: Bei Variante 4-Way-Heapsort“ hat jeder Kno”
ten i ≥ 1 vier Kinder, nämlich 4i − 2, 4i − 1, 4i, 4i + 1
(soweit ≤ n).
Die Heapbedingung wird verallgemeinert:
A[i] ≤ A[4i − 2], A[4i − 1], A[4i], A[4i + 1],
für i ≥ 1, soweit die Indizes ≤ n sind.
Bei bubbleDown:
Vertauschen mit dem kleinsten Kind-Eintrag, wenn nötig.
(Insgesamt 4 Vergleiche pro Ebene.).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
76
Bemerkung 4: Bei Variante 4-Way-Heapsort“ hat jeder Kno”
ten i ≥ 1 vier Kinder, nämlich 4i − 2, 4i − 1, 4i, 4i + 1
(soweit ≤ n).
Die Heapbedingung wird verallgemeinert:
A[i] ≤ A[4i − 2], A[4i − 1], A[4i], A[4i + 1],
für i ≥ 1, soweit die Indizes ≤ n sind.
Bei bubbleDown:
Vertauschen mit dem kleinsten Kind-Eintrag, wenn nötig.
(Insgesamt 4 Vergleiche pro Ebene.).
Vorteil: Baum hat nur Tiefe log4 n = 12 log n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
76
Bemerkung 4: Bei Variante 4-Way-Heapsort“ hat jeder Kno”
ten i ≥ 1 vier Kinder, nämlich 4i − 2, 4i − 1, 4i, 4i + 1
(soweit ≤ n).
Die Heapbedingung wird verallgemeinert:
A[i] ≤ A[4i − 2], A[4i − 1], A[4i], A[4i + 1],
für i ≥ 1, soweit die Indizes ≤ n sind.
Bei bubbleDown:
Vertauschen mit dem kleinsten Kind-Eintrag, wenn nötig.
(Insgesamt 4 Vergleiche pro Ebene.).
Vorteil: Baum hat nur Tiefe log4 n = 12 log n.
Bei Bubble-Down Zugriff nur auf 12 log n Bereiche im Array:
halb so viele Cache-Fehler, daher schneller.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
76
6.5 Datenstruktur: Prioritätswarteschlange
oder
Vorrangwarteschlangen
Idee: (Daten mit) Schlüssel aus sortiertem Universum (U, <)
werden eingefügt und entnommen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
77
6.5 Datenstruktur: Prioritätswarteschlange
oder
Vorrangwarteschlangen
Idee: (Daten mit) Schlüssel aus sortiertem Universum (U, <)
werden eingefügt und entnommen.
Beim Entnehmen wird immer ein Eintrag mit minimalem
Schlüssel gewählt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
77
6.5 Datenstruktur: Prioritätswarteschlange
oder
Vorrangwarteschlangen
Idee: (Daten mit) Schlüssel aus sortiertem Universum (U, <)
werden eingefügt und entnommen.
Beim Entnehmen wird immer ein Eintrag mit minimalem
Schlüssel gewählt.
Schlüssel =
b Prioritäten“
”
– je kleiner der Schlüssel, desto höher die Priorität –
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
77
6.5 Datenstruktur: Prioritätswarteschlange
oder
Vorrangwarteschlangen
Idee: (Daten mit) Schlüssel aus sortiertem Universum (U, <)
werden eingefügt und entnommen.
Beim Entnehmen wird immer ein Eintrag mit minimalem
Schlüssel gewählt.
Schlüssel =
b Prioritäten“
”
– je kleiner der Schlüssel, desto höher die Priorität –
Wähle stets einen Eintrag mit höchster Priorität.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
77
6.5 Datenstruktur: Prioritätswarteschlange
oder
Vorrangwarteschlangen
Idee: (Daten mit) Schlüssel aus sortiertem Universum (U, <)
werden eingefügt und entnommen.
Beim Entnehmen wird immer ein Eintrag mit minimalem
Schlüssel gewählt.
Schlüssel =
b Prioritäten“
”
– je kleiner der Schlüssel, desto höher die Priorität –
Wähle stets einen Eintrag mit höchster Priorität.
Mit Heaps effizient zu realisieren!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
77
Anwendungen:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
78
Anwendungen:
1) Prozessverwaltung in Multitask-System
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
78
Anwendungen:
1) Prozessverwaltung in Multitask-System
Jeder Prozess hat einen Namen (eine ID“) und eine Priorität
”
(Zahl in N).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
78
Anwendungen:
1) Prozessverwaltung in Multitask-System
Jeder Prozess hat einen Namen (eine ID“) und eine Priorität
”
(Zahl in N).
(Üblich: kleinere Zahlen bedeuten höhere Prioritäten.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
78
Anwendungen:
1) Prozessverwaltung in Multitask-System
Jeder Prozess hat einen Namen (eine ID“) und eine Priorität
”
(Zahl in N).
(Üblich: kleinere Zahlen bedeuten höhere Prioritäten.)
Aktuell rechenbereite Prozesse befinden sich in der Prozesswarteschlange. Bei Freiwerden eines Prozessors (z. B. durch
Unterbrechen eines Prozesses) wird einer der Prozesse mit
höchster Priorität aus der Warteschlange entnommen und
weiter ausgeführt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
78
Anwendungen:
2) Discrete Event Simulation“
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
79
Anwendungen:
2) Discrete Event Simulation“
”
System von Aktionen soll auf dem Rechner simuliert werden.
Jeder ausführbaren Aktion A ist ein Zeitpunkt tA ∈ [0, ∞)
zugeordnet.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
79
Anwendungen:
2) Discrete Event Simulation“
”
System von Aktionen soll auf dem Rechner simuliert werden.
Jeder ausführbaren Aktion A ist ein Zeitpunkt tA ∈ [0, ∞)
zugeordnet.
Die Ausführung einer Aktion A kann neue Aktionen A0 erzeugen oder ausführbar machen, mit neuen Zeitpunkten tA0 > tA.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
79
Anwendungen:
2) Discrete Event Simulation“
”
System von Aktionen soll auf dem Rechner simuliert werden.
Jeder ausführbaren Aktion A ist ein Zeitpunkt tA ∈ [0, ∞)
zugeordnet.
Die Ausführung einer Aktion A kann neue Aktionen A0 erzeugen oder ausführbar machen, mit neuen Zeitpunkten tA0 > tA.
Ein Schritt: Wähle diejenige noch nicht ausgeführte Aktion
mit dem frühesten Ausführungszeitpunkt und führe sie aus.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
79
Anwendungen:
2) Discrete Event Simulation“
”
System von Aktionen soll auf dem Rechner simuliert werden.
Jeder ausführbaren Aktion A ist ein Zeitpunkt tA ∈ [0, ∞)
zugeordnet.
Die Ausführung einer Aktion A kann neue Aktionen A0 erzeugen oder ausführbar machen, mit neuen Zeitpunkten tA0 > tA.
Ein Schritt: Wähle diejenige noch nicht ausgeführte Aktion
mit dem frühesten Ausführungszeitpunkt und führe sie aus.
3) (Noch etwas erweitert:) Innerhalb von Algorithmen
(Huffman-Codes, Dijkstra, Jarnı́k/Prim: später).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
79
Bei Prioritätswarteschlangen zu berücksichtigen:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
80
Bei Prioritätswarteschlangen zu berücksichtigen:
Einträge sind nicht blanke“ Schlüssel, sondern
”
mit Prioritäten versehene Datensätze.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
80
Bei Prioritätswarteschlangen zu berücksichtigen:
Einträge sind nicht blanke“ Schlüssel, sondern
”
mit Prioritäten versehene Datensätze.
Mehrere Objekte mit derselben Priorität sind möglich.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
80
Bei Prioritätswarteschlangen zu berücksichtigen:
Einträge sind nicht blanke“ Schlüssel, sondern
”
mit Prioritäten versehene Datensätze.
Mehrere Objekte mit derselben Priorität sind möglich.
Sogar: Mehrere identische Objekte sind möglich,
die man nicht identifizieren darf.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
80
Bei Prioritätswarteschlangen zu berücksichtigen:
Einträge sind nicht blanke“ Schlüssel, sondern
”
mit Prioritäten versehene Datensätze.
Mehrere Objekte mit derselben Priorität sind möglich.
Sogar: Mehrere identische Objekte sind möglich,
die man nicht identifizieren darf.
Beim Entnehmen: Alle Exemplare des kleinsten Schlüssels
gleichberechtigt, einer gewinnt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
80
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
FG KTuEA, TU Ilmenau
innerer Zustand
∅
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
{(1, D), (3, D), (4, E), (5, G)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
(2, B)
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
extractMin
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
{(1, D), (3, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
(2, B)
(3, D)
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
extractMin
extractMin
insert(4, E)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
{(1, D), (3, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G), (4, E)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
(2, B)
(3, D)
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
extractMin
extractMin
insert(4, E)
insert(2, D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
{(1, D), (3, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G), (4, E)}
{(1, D), (4, E), (5, G), (4, E), (2, D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
(2, B)
(3, D)
–
–
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
extractMin
extractMin
insert(4, E)
insert(2, D)
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
{(1, D), (3, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G), (4, E)}
{(1, D), (4, E), (5, G), (4, E), (2, D)}
{(1, D), (4, E), (5, G), (4, E)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
(2, B)
(3, D)
–
–
(2, D)
81
Beispiel: Datensatz: (n, L), n ∈ N,
L ∈ {A, . . . , Z}, Schlüssel ist der Buchstabe L.
Operation
empty
isempty
insert(1, D)
insert(2, B)
insert(3, D)
insert(4, E)
insert(5, G)
extractMin
extractMin
insert(4, E)
insert(2, D)
extractMin
isempty
FG KTuEA, TU Ilmenau
innerer Zustand
∅
∅
{(1, D)}
{(1, D), (2, B)}
{(1, D), (2, B), (3, D)}
{(1, D), (2, B), (3, D), (4, E)}
{(1, D), (2, B), (3, D), (4, E), (5, G)}
{(1, D), (3, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G)}
{(1, D), (4, E), (5, G), (4, E)}
{(1, D), (4, E), (5, G), (4, E), (2, D)}
{(1, D), (4, E), (5, G), (4, E)}
{(1, D), (4, E), (5, G), (4, E)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
true
–
–
–
–
–
(2, B)
(3, D)
–
–
(2, D)
false
81
Datentyp: SimplePriorityQueue
(Einfache Prioritätswarteschlange)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
82
Datentyp: SimplePriorityQueue
(Einfache Prioritätswarteschlange)
Signatur:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
82
Datentyp: SimplePriorityQueue
(Einfache Prioritätswarteschlange)
Signatur:
Sorten:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
82
Datentyp: SimplePriorityQueue
(Einfache Prioritätswarteschlange)
Signatur:
Sorten:
Keys
Data
PrioQ // Priority Queues“
”
Boolean
Operatoren:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
82
Datentyp: SimplePriorityQueue
(Einfache Prioritätswarteschlange)
Signatur:
Sorten:
Keys
Data
PrioQ // Priority Queues“
”
Boolean
Operatoren:
empty : → PrioQ
isempty : PrioQ → Boolean
insert : Keys × Data × PrioQ → PrioQ
extractMin: PrioQ → Keys × Data × PrioQ
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
82
Mathematisches Modell:
Sorten:
Keys
: (U, <) // totalgeordnetes Universum“
”
∗
Multimenge: Elemente dürfen mehrfach vorkommen, wie z. B. in
{1, 1, 4, 5, 5, 5, 9}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
83
Mathematisches Modell:
Sorten:
Keys
Data
: (U, <) // totalgeordnetes Universum“
”
: D // Menge von Datensätzen“
”
∗
Multimenge: Elemente dürfen mehrfach vorkommen, wie z. B. in
{1, 1, 4, 5, 5, 5, 9}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
83
Mathematisches Modell:
Sorten:
Keys
: (U, <) // totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
Boolean : {false, true}
∗
Multimenge: Elemente dürfen mehrfach vorkommen, wie z. B. in
{1, 1, 4, 5, 5, 5, 9}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
83
Mathematisches Modell:
Sorten:
Keys
Data
Boolean
PrioQ
:
:
:
:
(U, <) // totalgeordnetes Universum“
”
D // Menge von Datensätzen“
”
{false, true}
die Menge aller endlichen Multimengen∗ P ⊆ U × D
∗
Multimenge: Elemente dürfen mehrfach vorkommen, wie z. B. in
{1, 1, 4, 5, 5, 5, 9}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
83
Mathematisches Modell:
Sorten:
Keys
:
Data
:
Boolean :
PrioQ
:
Operationen:
empty ( ) = ∅
(U, <) // totalgeordnetes Universum“
”
D // Menge von Datensätzen“
”
{false, true}
die Menge aller endlichen Multimengen∗ P ⊆ U × D
// die leere Multimenge
∗
Multimenge: Elemente dürfen mehrfach vorkommen, wie z. B. in
{1, 1, 4, 5, 5, 5, 9}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
83
Mathematisches Modell:
Sorten:
Keys
:
Data
:
Boolean :
PrioQ
:
Operationen:
empty ( ) = ∅
isempty (P ) =
(U, <) // totalgeordnetes Universum“
”
D // Menge von Datensätzen“
”
{false, true}
die Menge aller endlichen Multimengen∗ P ⊆ U × D
// die leere Multimenge
(
true,
für P = ∅
false, für P 6= ∅
∗
Multimenge: Elemente dürfen mehrfach vorkommen, wie z. B. in
{1, 1, 4, 5, 5, 5, 9}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
83
Mathematisches Modell (Forts.):
insert(x, d, P ) = P ∪ {(x, d)} (als Multimenge),
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
84
Mathematisches Modell (Forts.):
insert(x, d, P ) = P ∪ {(x, d)} (als Multimenge),
extractMin(P ) =
FG KTuEA, TU Ilmenau
(
undefiniert,
für P = ∅
(x0, d0, P 0), für P 6= ∅,
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
84
Mathematisches Modell (Forts.):
insert(x, d, P ) = P ∪ {(x, d)} (als Multimenge),
extractMin(P ) =
(
undefiniert,
für P = ∅
(x0, d0, P 0), für P 6= ∅,
für ein Element (x0, d0) in P mit
minimalem Schlüssel x0,
und P 0 = P − {(x0, d0)}
(als Multimenge).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
84
Mathematisches Modell (Forts.):
insert(x, d, P ) = P ∪ {(x, d)} (als Multimenge),
extractMin(P ) =
(
undefiniert,
für P = ∅
(x0, d0, P 0), für P 6= ∅,
für ein Element (x0, d0) in P mit
minimalem Schlüssel x0,
und P 0 = P − {(x0, d0)}
(als Multimenge).
Standardimplementierung: (Binäre) Heaps
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
84
Implementierung: Neben Array A[1 . . m]:
Pegel k: Aktuelle Zahl k von Einträgen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
85
Implementierung: Neben Array A[1 . . m]:
Pegel k: Aktuelle Zahl k von Einträgen.
Überlaufprobleme werden ausgeklammert.
(Verdoppelungsstrategie, falls nötig.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
85
Implementierung: Neben Array A[1 . . m]:
Pegel k: Aktuelle Zahl k von Einträgen.
Überlaufprobleme werden ausgeklammert.
(Verdoppelungsstrategie, falls nötig.)
empty(m):
FG KTuEA, TU Ilmenau
// Zeitaufwand: O(1) oder O(m)
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
85
Implementierung: Neben Array A[1 . . m]:
Pegel k: Aktuelle Zahl k von Einträgen.
Überlaufprobleme werden ausgeklammert.
(Verdoppelungsstrategie, falls nötig.)
empty(m):
// Zeitaufwand: O(1) oder O(m)
Lege Array A[1 . . m] an;
Jeder Eintrag ist ein Paar (key, data).
k ← 0.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
85
Implementierung: Neben Array A[1 . . m]:
Pegel k: Aktuelle Zahl k von Einträgen.
Überlaufprobleme werden ausgeklammert.
(Verdoppelungsstrategie, falls nötig.)
empty(m):
// Zeitaufwand: O(1) oder O(m)
Lege Array A[1 . . m] an;
Jeder Eintrag ist ein Paar (key, data).
k ← 0.
isempty():
FG KTuEA, TU Ilmenau
// Zeitaufwand: O(1)
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
85
Implementierung: Neben Array A[1 . . m]:
Pegel k: Aktuelle Zahl k von Einträgen.
Überlaufprobleme werden ausgeklammert.
(Verdoppelungsstrategie, falls nötig.)
empty(m):
// Zeitaufwand: O(1) oder O(m)
Lege Array A[1 . . m] an;
Jeder Eintrag ist ein Paar (key, data).
k ← 0.
isempty():
return(k = 0);
FG KTuEA, TU Ilmenau
// Zeitaufwand: O(1)
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
85
extractMin: Implementierung von extractMin(P ):
Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h.
in Arrayposition 1.
Entnehme A[1] (hier B“) und gib es aus.
”
Loch“ im Binärbaum.– Stopfen“ mit dem letzten Eintrag.
”
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
86
extractMin: Implementierung von extractMin(P ):
Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h.
in Arrayposition 1.
Entnehme A[1] (hier B“) und gib es aus.
”
1
2
3
4
5
6
7
8
9
10
B
E
F
G
E
H
F
H
I
G
11
12
* *
1
B
2
3
E
F
4
5
E
G
8
6
7
H
F
9 10
H
I
G
Loch“ im Binärbaum.– Stopfen“ mit dem letzten Eintrag.
”
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
86
extractMin: Implementierung von extractMin(P ):
Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h.
in Arrayposition 1.
Entnehme A[1] (hier B“) und gib es aus.
”
1
2
3
4
5
6
7
8
9
10
?
E
F
G
E
H
F
H
I
G
11
12
* *
1
?
B
2
3
E
F
4
5
E
G
8
6
7
H
F
9 10
H
I
G
– Stopfen“ mit dem letzten Eintrag.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
86
extractMin: Implementierung von extractMin(P ):
Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h.
in Arrayposition 1.
Entnehme A[1] (hier B“) und gib es aus.
”
1
2
3
4
5
6
7
8
9
10
?
E
F
G
E
H
F
H
I
G
11
12
* *
1
?
B
2
3
E
F
4
5
E
G
8
6
7
H
F
9 10
H
I
G
Loch“ im Binärbaum.– Stopfen“ mit dem letzten Eintrag.
”
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
86
extractMin: Implementierung von extractMin(P ):
Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h.
in Arrayposition 1.
Entnehme A[1] (hier B“) und gib es aus.
”
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
F
4
5
E
G
8
6
7
H
F
9 10
H
I
*
Loch“ im Binärbaum. – Stopfen“ mit dem letzten Eintrag.
”
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
86
Bleibt Aufgabe: Heap reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
F
5
4
E
G
8
6
7
H
F
9
H
FG KTuEA, TU Ilmenau
I
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
87
Bleibt Aufgabe: Heap reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
F
5
4
E
G
8
6
7
H
F
9
H
I
Höchstens A[1] ist zu groß, also:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
87
Bleibt Aufgabe: Heap reparieren
11
12
1
2
3
4
5
6
7
8
9
10
G
E
F
G
E
H
F
H
I
* * *
1
G
2
3
E
F
5
4
E
G
8
6
7
H
F
9
H
I
Höchstens A[1] ist zu groß, also:
bubbleDown hilft hier!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
87
Prozedur extractMin
// Entnehmen eines minimalen Eintrags aus Priority-Queue
// Ausgangspunkt: Pegelstand k, A[1 . . k] ist Heap, k ≥ 1
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
88
Prozedur extractMin
// Entnehmen eines minimalen Eintrags aus Priority-Queue
// Ausgangspunkt: Pegelstand k, A[1 . . k] ist Heap, k ≥ 1
(0) if k = 0 then Fehlerbehandlung“;
”
(1) x ← A[1].key; d ← A[1].data;
(2) A[1] ← A[k];
(3) k--;
(4) if k > 1 then bubbleDown(1, k);
(5) return (x, d);
Korrektheit: klar wegen Korrektheit von bubbleDown(1, k).
Zeitaufwand: O(log(k)), wobei k (in k) die aktuelle Größe
des Heaps ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
88
Implementierung von insert(x, d):
Voraussetzung: A[1..k] ist Heap; 1 ≤ k < m;
k enthält k.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
89
Implementierung von insert(x, d):
Voraussetzung: A[1..k] ist Heap; 1 ≤ k < m;
k enthält k.
k++;
A[k] ← (x, d).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
89
Implementierung von insert(x, d):
Voraussetzung: A[1..k] ist Heap; 1 ≤ k < m;
k enthält k.
k++;
A[k] ← (x, d).
An der Stelle k 0 = k + 1 ist nun eventuell die Heapeigenschaft
gestört, weil x zu klein ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
89
Implementierung von insert(x, d):
Voraussetzung: A[1..k] ist Heap; 1 ≤ k < m;
k enthält k.
k++;
A[k] ← (x, d).
An der Stelle k 0 = k + 1 ist nun eventuell die Heapeigenschaft
gestört, weil x zu klein ist.
Definition
Höchstens A[j] ist zu klein :⇔
es entsteht ein Heap, wenn man u = A[j].key durch einen
geeigneten Schlüssel x ≥ u ersetzt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
89
Heap:
1
2
3
4
5
6
7
8
9
10
C
E
F
G
J
K
F
H
L
Q
11
12
* *
1
C
2
3
E
F
4
5
G
J
8
6
7
K
F
9 10
H
FG KTuEA, TU Ilmenau
L
Q
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Einfügen von D“ an Stelle k = 11.
”
1
2
3
4
5
6
7
8
9
10
C
E
F
G
J
K
F
H
L
Q
11
D
12
*
1
C
2
3
E
F
4
5
G
J
8
9 10
H
FG KTuEA, TU Ilmenau
6
L
7
K
F
11
Q
D
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Reparatur, wenn höchstens ein Schlüssel zu klein: bubbleUp.
1
2
3
4
5
6
7
8
9
10
C
E
F
G
J
K
F
H
L
Q
11
D
12
*
1
C
2
3
E
F
4
5
G
J
8
9 10
H
FG KTuEA, TU Ilmenau
6
L
7
K
F
11
Q
D
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Reparatur, wenn höchstens ein Schlüssel zu klein: bubbleUp.
1
2
3
4
5
6
7
8
9
C
E
F
G
D
K
F
H
L
10
11
Q
J
12
*
1
C
2
3
E
F
4
5
G
6
K
D
8
9 10
H
FG KTuEA, TU Ilmenau
L
7
F
11
Q
J
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Reparatur, wenn höchstens ein Schlüssel zu klein: bubbleUp.
1
2
3
4
5
6
7
8
9
C
E
F
G
D
K
F
H
L
10
11
Q
J
12
*
1
C
2
3
E
F
4
5
G
6
K
D
8
9 10
H
FG KTuEA, TU Ilmenau
L
7
F
11
Q
J
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Reparatur, wenn höchstens ein Schlüssel zu klein: bubbleUp.
1
2
3
4
5
6
7
8
9
C
D
F
G
E
K
F
H
L
10
11
Q
J
12
*
1
C
2
3
D
F
4
5
G
6
K
E
8
9 10
H
FG KTuEA, TU Ilmenau
L
7
F
11
Q
J
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Reparatur, wenn höchstens ein Schlüssel zu klein: bubbleUp.
1
2
3
4
5
6
7
8
9
C
D
F
G
E
K
F
H
L
10
11
Q
J
12
*
1
C
2
3
D
F
4
5
G
6
K
E
8
9 10
H
FG KTuEA, TU Ilmenau
L
7
F
11
Q
J
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Reparatur, wenn höchstens ein Schlüssel zu klein: bubbleUp.
1
2
3
4
5
6
7
8
9
C
D
F
G
E
K
F
H
L
10
11
Q
J
12
*
1
C
2
3
D
F
4
5
G
6
K
E
8
9 10
H
FG KTuEA, TU Ilmenau
L
7
F
11
Q
J
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
90
Prozedur bubbleUp(i) // Heapreparatur ab A[i] nach oben
(1) j ← i;
(2) h ← bj/2c;
(3) while h ≥ 1 and A[h].key > A[j].key do
(4)
vertausche A[j] mit A[h];
(5)
j ← h;
(6)
h ← bj/2c.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
91
1
2
3
4
5
6
7
8
9
10
C
E
F
G
J
K
F
H
L
Q
11
D
12
*
1
C
2
3
E
F
4
5
G
J
8
9 10
H
6
L
7
K
F
11
Q
D
Anschaulich: Auf dem Weg von A[i] zur Wurzel werden alle
Elemente, deren Schlüssel größer als der (alte) Eintrag in A[i])
ist, um eine Position (auf dem Weg) nach unten gezogen.
Eintrag A[i] landet in der freigewordenen Position.
Man kann dies auch effizienter (wie in StraightInsertionSort) programmieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
92
1
2
3
4
5
6
7
8
9
C
D
F
G
E
K
F
H
L
10
11
Q
J
12
*
1
C
2
3
D
F
4
5
G
6
K
E
8
9 10
H
L
7
F
11
Q
J
Anschaulich: Auf dem Weg von A[i] zur Wurzel werden alle
Elemente, deren Schlüssel größer als der (alte) Eintrag in A[i])
ist, um eine Position (auf dem Weg) nach unten gezogen.
Eintrag A[i] landet in der freigewordenen Position.
Man kann dies auch effizienter (wie in StraightInsertionSort) programmieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
92
Behauptung 6.5.1
Wenn in A[1..k] höchstens A[i] zu klein ist
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
93
Behauptung 6.5.1
Wenn in A[1..k] höchstens A[i] zu klein ist
dann ist nach Ausführung von bubbleUp(i) das Array
A[1..k] ein Heap.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
93
Behauptung 6.5.1
Wenn in A[1..k] höchstens A[i] zu klein ist
dann ist nach Ausführung von bubbleUp(i) das Array
A[1..k] ein Heap.
Der Zeitaufwand ist O(log i), die Anzahl der Schlüsselvergleiche ist höchstens das Level von i im Baum, also die Anzahl
der Bits in der Binärdarstellung bin(i), d. h. dlog(i + 1)e.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
93
Behauptung 6.5.1
Wenn in A[1..k] höchstens A[i] zu klein ist
dann ist nach Ausführung von bubbleUp(i) das Array
A[1..k] ein Heap.
Der Zeitaufwand ist O(log i), die Anzahl der Schlüsselvergleiche ist höchstens das Level von i im Baum, also die Anzahl
der Bits in der Binärdarstellung bin(i), d. h. dlog(i + 1)e.
Beweis: Ähnlich wie bei bubbleDown.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
93
Prozedur insert(x, d)
// Einfügen eines neuen Eintrags in Priority-Queue
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
94
Prozedur insert(x, d)
// Einfügen eines neuen Eintrags in Priority-Queue
// Ausgangspunkt: Pegel k, A[1 . . k] ist Heap, k < m
(1) if k = m then Überlauf-Fehler“;
”
(2) k++;
(3) A[k] ← (x, d);
(4) bubbleUp(k).
Korrektheit: klar wegen Korrektheit von bubbleUp(k).
Zeitaufwand: O(log(k)).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
94
Wir können bubbleUp(i) sogar für eine etwas allgemeinere
Operation verwenden (Korrektheitsbeweis gilt weiter):
Wir ersetzen einen beliebigen Schlüssel im Heap (Position i)
durch einen kleineren.
Mit bubbleUp(i) kann die Heapeigenschaft wieder hergestellt
werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
95
Wir können bubbleUp(i) sogar für eine etwas allgemeinere
Operation verwenden (Korrektheitsbeweis gilt weiter):
Wir ersetzen einen beliebigen Schlüssel im Heap (Position i)
durch einen kleineren.
Mit bubbleUp(i) kann die Heapeigenschaft wieder hergestellt
werden.
Prozedur decreaseKey(x, i)
// (Erniedrigen des Schlüssels an Arrayposition i auf x)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
95
Wir können bubbleUp(i) sogar für eine etwas allgemeinere
Operation verwenden (Korrektheitsbeweis gilt weiter):
Wir ersetzen einen beliebigen Schlüssel im Heap (Position i)
durch einen kleineren.
Mit bubbleUp(i) kann die Heapeigenschaft wieder hergestellt
werden.
Prozedur decreaseKey(x, i)
// (Erniedrigen des Schlüssels an Arrayposition i auf x)
(1) if A[i].key < x then Fehlerbehandlung;
(2) A[i].key ← x;
(3) bubbleUp(i).
// Zeitaufwand: O(log(i))
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
95
SimplePriorityQueue plus decreaseKey“:
”
Prioritätswarteschlange.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
96
SimplePriorityQueue plus decreaseKey“:
”
Prioritätswarteschlange.
Satz 6.5.2
Der Datentyp “Prioritätswarteschlange” kann mit Hilfe eines
Heaps implementiert werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
96
SimplePriorityQueue plus decreaseKey“:
”
Prioritätswarteschlange.
Satz 6.5.2
Der Datentyp “Prioritätswarteschlange” kann mit Hilfe eines
Heaps implementiert werden.
Dabei erfordern empty und isempty (und das Ermitteln des
kleinsten Eintrags) konstante Zeit
und insert, extractMin und decreaseKey benötigen jeweils Zeit
O(log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
96
SimplePriorityQueue plus decreaseKey“:
”
Prioritätswarteschlange.
Satz 6.5.2
Der Datentyp “Prioritätswarteschlange” kann mit Hilfe eines
Heaps implementiert werden.
Dabei erfordern empty und isempty (und das Ermitteln des
kleinsten Eintrags) konstante Zeit
und insert, extractMin und decreaseKey benötigen jeweils Zeit
O(log n).
Dabei ist n jeweils der aktuelle Pegelstand, also die Anzahl
der Einträge in der Prioritätswarteschlange.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
96
Technisches Problem:
Wie soll man der Datenstruktur mitteilen“, welches Objekt
”
gemeint ist, wenn decreaseKey auf einen Eintrag angewendet
werden soll?
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
97
Technisches Problem:
Wie soll man der Datenstruktur mitteilen“, welches Objekt
”
gemeint ist, wenn decreaseKey auf einen Eintrag angewendet
werden soll?
Bei (binärem) Heap: Positionen der Einträge im Array ändern
sich die ganze Zeit, durch die durch insert und extractMin
verursachten Verschiebungen im Array.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
97
Technisches Problem:
Wie soll man der Datenstruktur mitteilen“, welches Objekt
”
gemeint ist, wenn decreaseKey auf einen Eintrag angewendet
werden soll?
Bei (binärem) Heap: Positionen der Einträge im Array ändern
sich die ganze Zeit, durch die durch insert und extractMin
verursachten Verschiebungen im Array.
Technisch unsauber (widerspricht dem Prinzip der Kapselung
einer Datenstruktur):
dem Benutzer stets mitteilen, an welcher Stelle im Array ein
Eintrag sitzt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
97
Besser: Erweiterung der Datenstruktur:
Objekt (x, d) erhält bei Ausführung von insert(x, d) eine
eindeutige Identität“ p zugeteilt, die sich nie ändert, und
”
über die dieses Objekt angesprochen werden kann.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
98
Besser: Erweiterung der Datenstruktur:
Objekt (x, d) erhält bei Ausführung von insert(x, d) eine
eindeutige Identität“ p zugeteilt, die sich nie ändert, und
”
über die dieses Objekt angesprochen werden kann.
Damit können auch verschiedene Kopien eines Datensatzes
unterschieden werden!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
98
Besser: Erweiterung der Datenstruktur:
Objekt (x, d) erhält bei Ausführung von insert(x, d) eine
eindeutige Identität“ p zugeteilt, die sich nie ändert, und
”
über die dieses Objekt angesprochen werden kann.
Damit können auch verschiedene Kopien eines Datensatzes
unterschieden werden!
p wird dem Benutzer als Reaktion auf die Einfügung mitgeteilt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
98
Besser: Erweiterung der Datenstruktur:
Objekt (x, d) erhält bei Ausführung von insert(x, d) eine
eindeutige Identität“ p zugeteilt, die sich nie ändert, und
”
über die dieses Objekt angesprochen werden kann.
Damit können auch verschiedene Kopien eines Datensatzes
unterschieden werden!
p wird dem Benutzer als Reaktion auf die Einfügung mitgeteilt.
Der Benutzer kann dann irgendwann den Schlüssel eines Eintrags mit Identität p ändern.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
98
Technische Realisierung:
Im Heap gespeicherte Objekte ((Daten, Schlüssel)-Paare) stehen an fester Stelle. Zugriff über Zeiger/Referenz. Im Heaparray werden nur Zeiger/Referenzen auf diese Objekte gehalten, so dass diese selber nie verschoben werden müssen.
Version 1: Identität p ist der Zeiger auf das Objekt im Heap.
Das Objekt enthält seine jeweilige Position im Heap-Array als Komponente.
(Nachteil: Kapselung der Datenstruktur ist durchbrochen – der Benutzer
kann über den Zeiger direkt auf die Objekte zugreifen.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
99
Technische Realisierung:
Im Heap gespeicherte Objekte ((Daten, Schlüssel)-Paare) stehen an fester Stelle. Zugriff über Zeiger/Referenz. Im Heaparray werden nur Zeiger/Referenzen auf diese Objekte gehalten, so dass diese selber nie verschoben werden müssen.
Version 1: Identität p ist der Zeiger auf das Objekt im Heap.
Das Objekt enthält seine jeweilige Position im Heap-Array als Komponente.
(Nachteil: Kapselung der Datenstruktur ist durchbrochen – der Benutzer
kann über den Zeiger direkt auf die Objekte zugreifen.)
Version 2: Eine beliebige (laufende) Nummer wird vergeben (z. B. durch
Durchzählen der Einfügungen). Diese Nummer ist die Identität p. Die
Datenstruktur hält intern in einem Hilfsarray für jede dieser Nummern
die Adresse des entsprechenden Objekts. Das Objekt enthält Daten und
Schlüssel und seine jeweilige Position im Heap-Array als Komponenten.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
99
Technische Realisierung:
Im Heap gespeicherte Objekte ((Daten, Schlüssel)-Paare) stehen an fester Stelle. Zugriff über Zeiger/Referenz. Im Heaparray werden nur Zeiger/Referenzen auf diese Objekte gehalten, so dass diese selber nie verschoben werden müssen.
Version 1: Identität p ist der Zeiger auf das Objekt im Heap.
Das Objekt enthält seine jeweilige Position im Heap-Array als Komponente.
(Nachteil: Kapselung der Datenstruktur ist durchbrochen – der Benutzer
kann über den Zeiger direkt auf die Objekte zugreifen.)
Version 2: Eine beliebige (laufende) Nummer wird vergeben (z. B. durch
Durchzählen der Einfügungen). Diese Nummer ist die Identität p. Die
Datenstruktur hält intern in einem Hilfsarray für jede dieser Nummern
die Adresse des entsprechenden Objekts. Das Objekt enthält Daten und
Schlüssel und seine jeweilige Position im Heap-Array als Komponenten.
(Nachteil: Platzbedarf des Hilfsarrays entspricht der Anzahl der Einfügungen, nicht der maximalen Größe der Prioritätswarteschlange.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
99
Technische Realisierung:
Im Heap gespeicherte Objekte ((Daten, Schlüssel)-Paare) stehen an fester Stelle. Zugriff über Zeiger/Referenz. Im Heaparray werden nur Zeiger/Referenzen auf diese Objekte gehalten, so dass diese selber nie verschoben werden müssen.
Version 1: Identität p ist der Zeiger auf das Objekt im Heap.
Das Objekt enthält seine jeweilige Position im Heap-Array als Komponente.
(Nachteil: Kapselung der Datenstruktur ist durchbrochen – der Benutzer
kann über den Zeiger direkt auf die Objekte zugreifen.)
Version 2: Eine beliebige (laufende) Nummer wird vergeben (z. B. durch
Durchzählen der Einfügungen). Diese Nummer ist die Identität p. Die
Datenstruktur hält intern in einem Hilfsarray für jede dieser Nummern
die Adresse des entsprechenden Objekts. Das Objekt enthält Daten und
Schlüssel und seine jeweilige Position im Heap-Array als Komponenten.
(Nachteil: Platzbedarf des Hilfsarrays entspricht der Anzahl der Einfügungen, nicht der maximalen Größe der Prioritätswarteschlange.)
Version 3: Wie Version 2, aber die Identität p eines durch ExtractMin
aus dem Heap gelöschten Eintrags kann wieder vergeben werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
99
Beispiel:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
Operation
empty
FG KTuEA, TU Ilmenau
innerer Zustand
∅
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
Operation
empty
insert(D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
Operation
empty
insert(D)
insert(B)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
Operation
empty
insert(D)
insert(B)
insert(D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
5
Operation
empty
insert(D)
insert(B)
insert(D)
insert(E)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
{(1,D), (2,B), (3,D), (4,E)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
4
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
5
6
Operation
empty
insert(D)
insert(B)
insert(D)
insert(E)
insert(G)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
{(1,D), (2,B), (3,D), (4,E)}
{(1,D), (2,B),
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
4
5
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
5
6
Operation
empty
insert(D)
insert(B)
insert(D)
insert(E)
insert(G)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
{(1,D), (2,B), (3,D), (4,E)}
{(1,D), (2,B),
(3,D), (4,E), (5,G)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
4
5
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
5
6
7
Operation
empty
insert(D)
insert(B)
insert(D)
insert(E)
insert(G)
decreaseKey (5,D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
{(1,D), (2,B), (3,D), (4,E)}
{(1,D), (2,B),
(3,D), (4,E), (5,G)}
{(1,D), (2,B),
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
4
5
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
5
6
7
Operation
empty
insert(D)
insert(B)
insert(D)
insert(E)
insert(G)
decreaseKey (5,D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
{(1,D), (2,B), (3,D), (4,E)}
{(1,D), (2,B),
(3,D), (4,E), (5,G)}
{(1,D), (2,B),
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
4
5
–
100
Beispiel: Datensatz = Schlüssel = Eintrag aus {A, . . . , Z}.
Wir vergeben Nummern als Identitäten.
Der Benutzer der Datenstruktur muss sicherstellen, dass Identitäten nicht mehr benutzt werden, nachdem das entsprechende Objekt (durch ein extractMin) wieder aus der Datenstruktur verschwunden ist.
Runde
1
2
3
4
5
6
7
Operation
empty
insert(D)
insert(B)
insert(D)
insert(E)
insert(G)
decreaseKey (5,D)
FG KTuEA, TU Ilmenau
innerer Zustand
∅
{(1,D)}
{(1,D), (2,B)}
{(1,D), (2,B), (3,D)}
{(1,D), (2,B), (3,D), (4,E)}
{(1,D), (2,B),
(3,D), (4,E), (5,G)}
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
–
1
2
3
4
5
–
100
Runde
Operation
FG KTuEA, TU Ilmenau
innerer Zustand
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
101
Runde
...
Operation
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
101
Runde
...
Operation
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
101
Runde
...
Operation
8
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
101
Runde
...
Operation
8
9
extractMin
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
101
Runde
...
8
9
10
Operation
extractMin
extractMin
decreaseKey (4,B)
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
101
Runde
...
8
9
10
Operation
extractMin
extractMin
decreaseKey (4,B)
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
101
Runde
...
8
9
10
11
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
101
Runde
...
8
9
10
11
12
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
101
Runde
...
8
9
10
11
12
13
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
101
Runde
...
8
9
10
11
12
13
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
–
101
Runde
...
8
9
10
11
12
13
14
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
{(1,D), (5,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
–
(6,C)
101
Runde
...
8
9
10
11
12
13
14
15
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
extractMin
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
{(1,D), (5,D)}
{(1,D)}
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
–
(6,C)
(5,D)
101
Runde
...
8
9
10
11
12
13
14
15
16
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
extractMin
extractMin
extractMin
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
{(1,D), (5,D)}
{(1,D)}
∅
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
–
(6,C)
(5,D)
(1,D)
101
Runde
...
8
9
10
11
12
13
14
15
16
17
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
extractMin
extractMin
extractMin
isempty
FG KTuEA, TU Ilmenau
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
{(1,D), (5,D)}
{(1,D)}
∅
∅
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
–
(6,C)
(5,D)
(1,D)
true.
101
Runde
...
8
9
10
11
12
13
14
15
16
17
Operation
extractMin
extractMin
decreaseKey (4,B)
extractMin
insert(F)
decreaseKey (6,C)
extractMin
extractMin
extractMin
isempty
innerer Zustand
{(1,D), (2,B),
(3,D), (4,E), (5,D)}
{(1,D), (3,D), (4,E), (5,D)}
{(1,D), (4,E), (5,D)}
{(1,D), (4,B), (5,D)}
{(1,D), (5,D)}
{(1,D), (5,D), (6,F)}
{(1,D), (5,D), (6,C)}
{(1,D), (5,D)}
{(1,D)}
∅
∅
Ausgabe
(2,B)
(3,D)
–
(4,B)
6
–
(6,C)
(5,D)
(1,D)
true.
In Runde 13 wäre zum Beispiel die Operation
decreaseKey (3,A) nicht legal, da das (eindeutig bestimmte)
Objekt mit Identität 3 in Runde 9 aus der Datenstruktur
verschwunden ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
101
Datentyp: PriorityQueue (Prioritätswarteschlange)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
102
Datentyp: PriorityQueue (Prioritätswarteschlange)
Signatur:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
102
Datentyp: PriorityQueue (Prioritätswarteschlange)
Signatur:
Sorten:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
102
Datentyp: PriorityQueue (Prioritätswarteschlange)
Signatur:
Sorten:
Keys
Data
Id // Identitäten“
”
PrioQ
Boolean
Operatoren:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
102
Datentyp: PriorityQueue (Prioritätswarteschlange)
Signatur:
Sorten:
Keys
Data
Id // Identitäten“
”
PrioQ
Boolean
Operatoren:
empty : → PrioQ
isempty : PrioQ → Boolean
insert : Keys × Data × PrioQ → PrioQ × Id
extractMin: PrioQ → Id × Keys × Data × PrioQ
decreaseKey : Id × Keys × PrioQ → PrioQ
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
102
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
Id
: N = {0, 1, 2, . . .}
// unendliche Menge möglicher Identitäten“
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
Id
: N = {0, 1, 2, . . .}
// unendliche Menge möglicher Identitäten“
”
Boolean : {false, true}
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
Id
: N = {0, 1, 2, . . .}
// unendliche Menge möglicher Identitäten“
”
Boolean : {false, true}
PrioQ
: die Menge aller Funktionen f : X → U × D,
wobei X = Def (f ) ⊆ N endlich ist
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
Id
: N = {0, 1, 2, . . .}
// unendliche Menge möglicher Identitäten“
”
Boolean : {false, true}
PrioQ
: die Menge aller Funktionen f : X → U × D,
wobei X = Def (f ) ⊆ N endlich ist
empty (()) = ∅
FG KTuEA, TU Ilmenau
// die leere Funktion
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
Mathematisches Modell:
Keys
: (U, <)
// totalgeordnetes Universum“
”
Data
: D // Menge von Datensätzen“
”
Id
: N = {0, 1, 2, . . .}
// unendliche Menge möglicher Identitäten“
”
Boolean : {false, true}
PrioQ
: die Menge aller Funktionen f : X → U × D,
wobei X = Def (f ) ⊆ N endlich ist
empty (()) = ∅
// die leere Funktion
(
true, für f = ∅
isempty (f ) =
false, für f =
6 ∅
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
103
insert(x, d, f ) = (f ∪ {(p, (x, d))}, p),
für ein p ∈ N − Def (f )
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
104
insert(x, d, f ) = (f ∪ {(p, (x, d))}, p),
für ein p ∈ N − Def (f )
(
undefiniert,
für f = ∅
extractMin(f ) =
(p0, x0, d0, f 0), für f 6= ∅,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
104
insert(x, d, f ) = (f ∪ {(p, (x, d))}, p),
für ein p ∈ N − Def (f )
(
undefiniert,
für f = ∅
extractMin(f ) =
(p0, x0, d0, f 0), für f 6= ∅,
wobei im zweiten Fall
p0 ein Element in Def (f ) ist
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
104
insert(x, d, f ) = (f ∪ {(p, (x, d))}, p),
für ein p ∈ N − Def (f )
(
undefiniert,
für f = ∅
extractMin(f ) =
(p0, x0, d0, f 0), für f 6= ∅,
wobei im zweiten Fall
p0 ein Element in Def (f ) ist mit
(x0, d0) = f (p0)
mit x0 = min{x | ∃p ∃d : (p, (x, d)) ∈ f },
und f 0 := f − {(p0, (x0, d0))}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
104
insert(x, d, f ) = (f ∪ {(p, (x, d))}, p),
für ein p ∈ N − Def (f )
(
undefiniert,
für f = ∅
extractMin(f ) =
(p0, x0, d0, f 0), für f 6= ∅,
wobei im zweiten Fall
p0 ein Element in Def (f ) ist mit
(x0, d0) = f (p0)
mit x0 = min{x | ∃p ∃d : (p, (x, d)) ∈ f },
und f 0 := f − {(p0, (x0, d0))}.
decreaseKey (p, x) = (f − {(p, (y, d))}) ∪ {(p, (x, d))},
falls f (p) = (y, d) mit x ≤ y (sonst Fehlerbeh.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
104
insert(x, d, f ) = (f ∪ {(p, (x, d))}, p),
für ein p ∈ N − Def (f )
(
undefiniert,
für f = ∅
extractMin(f ) =
(p0, x0, d0, f 0), für f 6= ∅,
wobei im zweiten Fall
p0 ein Element in Def (f ) ist mit
(x0, d0) = f (p0)
mit x0 = min{x | ∃p ∃d : (p, (x, d)) ∈ f },
und f 0 := f − {(p0, (x0, d0))}.
decreaseKey (p, x) = (f − {(p, (y, d))}) ∪ {(p, (x, d))},
falls f (p) = (y, d) mit x ≤ y (sonst Fehlerbeh.)
Implementierung: Größere Übungsaufgabe.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
104
6.6 Untere Schranke für Sortieren
Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren,
wenn
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
105
6.6 Untere Schranke für Sortieren
Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren,
wenn
in A auf Schlüssel x, y aus U nur Operationen
x<y ?
x≤y ?
x=y ?
sowie Verschieben und Kopieren angewendet werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
105
6.6 Untere Schranke für Sortieren
Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren,
wenn
in A auf Schlüssel x, y aus U nur Operationen
x<y ?
x≤y ?
x=y ?
sowie Verschieben und Kopieren angewendet werden.
Schlüssel sind atomare Objekte“.
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
105
6.6 Untere Schranke für Sortieren
Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren,
wenn
in A auf Schlüssel x, y aus U nur Operationen
x<y ?
x≤y ?
x=y ?
sowie Verschieben und Kopieren angewendet werden.
Schlüssel sind atomare Objekte“.
”
Mergesort, Quicksort, Heapsort, StraightInsertionSort
sind Schlüsselvergleichsverfahren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
105
6.6 Untere Schranke für Sortieren
Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren,
wenn
in A auf Schlüssel x, y aus U nur Operationen
x<y ?
x≤y ?
x=y ?
sowie Verschieben und Kopieren angewendet werden.
Schlüssel sind atomare Objekte“.
”
Mergesort, Quicksort, Heapsort, StraightInsertionSort
sind Schlüsselvergleichsverfahren.
Jeweils: O(n log n) oder O(n2) Vergleiche.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
105
6.6 Untere Schranke für Sortieren
Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren,
wenn
in A auf Schlüssel x, y aus U nur Operationen
x<y ?
x≤y ?
x=y ?
sowie Verschieben und Kopieren angewendet werden.
Schlüssel sind atomare Objekte“.
”
Mergesort, Quicksort, Heapsort, StraightInsertionSort
sind Schlüsselvergleichsverfahren.
Jeweils: O(n log n) oder O(n2) Vergleiche.
Ziel: Es geht nicht besser als Ω(n log n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
105
Sei nun A ein Schlüsselvergleichsverfahren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
106
Sei nun A ein Schlüsselvergleichsverfahren.
Wir wenden A auf die n! verschiedenen Eingaben
(a1, 1), . . . , (an, n)
an, wobei σ = (a1, . . . , an) eine Permutation von {1, . . . , n} ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
106
Sei nun A ein Schlüsselvergleichsverfahren.
Wir wenden A auf die n! verschiedenen Eingaben
(a1, 1), . . . , (an, n)
an, wobei σ = (a1, . . . , an) eine Permutation von {1, . . . , n} ist.
Sortierschlüssel: erste Komponente.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
106
Sei nun A ein Schlüsselvergleichsverfahren.
Wir wenden A auf die n! verschiedenen Eingaben
(a1, 1), . . . , (an, n)
an, wobei σ = (a1, . . . , an) eine Permutation von {1, . . . , n} ist.
Sortierschlüssel: erste Komponente.
Beispiel: Aus (2, 1), (4, 2), (1, 3), (3, 4) wird (1, 3), (2, 1), (3, 4), (4, 2).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
106
Sei nun A ein Schlüsselvergleichsverfahren.
Wir wenden A auf die n! verschiedenen Eingaben
(a1, 1), . . . , (an, n)
an, wobei σ = (a1, . . . , an) eine Permutation von {1, . . . , n} ist.
Sortierschlüssel: erste Komponente.
Beispiel: Aus (2, 1), (4, 2), (1, 3), (3, 4) wird (1, 3), (2, 1), (3, 4), (4, 2).
Effekt: In den zweiten Komponenten steht die Permutation
π = σ −1 (im Beispiel π = (3, 1, 4, 2)),
die die Eingabe (a1, . . . , an) sortiert: aπ(1) < · · · < aπ(n).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
106
Sei nun A ein Schlüsselvergleichsverfahren.
Wir wenden A auf die n! verschiedenen Eingaben
(a1, 1), . . . , (an, n)
an, wobei σ = (a1, . . . , an) eine Permutation von {1, . . . , n} ist.
Sortierschlüssel: erste Komponente.
Beispiel: Aus (2, 1), (4, 2), (1, 3), (3, 4) wird (1, 3), (2, 1), (3, 4), (4, 2).
Effekt: In den zweiten Komponenten steht die Permutation
π = σ −1 (im Beispiel π = (3, 1, 4, 2)),
die die Eingabe (a1, . . . , an) sortiert: aπ(1) < · · · < aπ(n).
Also: n! verschiedene Ausgaben, eine für jede Anordnung der
Eingabeobjekte.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
106
Beispiel: Mergesort mit 3 Elementen
a1
a 1< a 2
nein
ja
a 1< a 3
a 2< a 3
nein
ja
nein
231
ja
nein
a 1< a 3
321
a3
a2
a 2< a 3
312
ja
213
nein
132
ja
123
In Blättern: die zweiten Komponenten
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
107
Allgemein: Vergleichsbaum TA,n mit n! Blättern.
Start
0
a i1< a j1
1
a i2< a j2
0
1
a i4< a j4
0
a i3< a j3
0
a i6< a j6
a i5< a j5
1
0
1
1
0
a i7< a j7
1
0
π’’
1
π’’’
a i20< a j20
0
π
FG KTuEA, TU Ilmenau
1
π’
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
108
Allgemein: Jeder vergleichsbasierte Sortieralgorithmus A erzeugt einen Vergleichsbaum TA,n mit genau n! Blättern.
Die Wege im Baum entsprechen den Berechnungen von A auf
den n! genannten Eingaben.
Details: Druckfolien, nicht prüfungsrelevant.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
109
Allgemein: Jeder vergleichsbasierte Sortieralgorithmus A erzeugt einen Vergleichsbaum TA,n mit genau n! Blättern.
Die Wege im Baum entsprechen den Berechnungen von A auf
den n! genannten Eingaben.
Details: Druckfolien, nicht prüfungsrelevant.
Satz 6.6.1
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
109
Allgemein: Jeder vergleichsbasierte Sortieralgorithmus A erzeugt einen Vergleichsbaum TA,n mit genau n! Blättern.
Die Wege im Baum entsprechen den Berechnungen von A auf
den n! genannten Eingaben.
Details: Druckfolien, nicht prüfungsrelevant.
Satz 6.6.1
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst,
dann gibt es eine Eingabe (a1, . . . , an), auf der A mindestens
dlog(n!)e Vergleiche ausführt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
109
Allgemein: Jeder vergleichsbasierte Sortieralgorithmus A erzeugt einen Vergleichsbaum TA,n mit genau n! Blättern.
Die Wege im Baum entsprechen den Berechnungen von A auf
den n! genannten Eingaben.
Details: Druckfolien, nicht prüfungsrelevant.
Satz 6.6.1
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst,
dann gibt es eine Eingabe (a1, . . . , an), auf der A mindestens
dlog(n!)e Vergleiche ausführt.
Beweis: Der Vergleichsbaum, den A erzeugt, hat n! (externe)
Blätter, also hat er Tiefe ≥ dlog(n!)e (s. Prop. 3.3.2).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
109
Bemerkung:
n! ≥ (n/e)n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
110
Bemerkung:
n! ≥ (n/e)n.
FG KTuEA, TU Ilmenau
Beweis: nn/n!
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
110
Bemerkung:
n
n! ≥ (n/e) .
FG KTuEA, TU Ilmenau
n
Beweis: n /n! <
ni
i≥0 i!
P
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
110
Bemerkung:
n
n! ≥ (n/e) .
FG KTuEA, TU Ilmenau
n
Beweis: n /n! <
ni
i≥0 i!
P
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
= en .
110
Bemerkung:
n
n! ≥ (n/e) .
n
Beweis: n /n! <
ni
i≥0 i!
P
= en .
Also: log(n!) ≥ log((n/e)n) = n log n − n log e
= n log n − 1,44269 . . . n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
110
Bemerkung:
n
n! ≥ (n/e) .
n
Beweis: n /n! <
ni
i≥0 i!
P
= en .
Also: log(n!) ≥ log((n/e)n) = n log n − n log e
= n log n − 1,44269 . . . n.
Mitteilung:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
110
Bemerkung:
n
n! ≥ (n/e) .
n
Beweis: n /n! <
ni
i≥0 i!
P
= en .
Also: log(n!) ≥ log((n/e)n) = n log n − n log e
= n log n − 1,44269 . . . n.
Mitteilung:
Für n ≥ 1 gilt (Stirlingsche Formel):
√
FG KTuEA, TU Ilmenau
2πn
n n
e
≤ n! ≤
√
2πn
n n
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
e
e
1
12n
110
Satz 6.6.2
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
111
Satz 6.6.2
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst, dann gilt für die mittlere Vergleichsanzahl V n
(gemittelt über die n! verschiedenen Eingabeanordnungen):
V n ≥ log(n!).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
111
Satz 6.6.2
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst, dann gilt für die mittlere Vergleichsanzahl V n
(gemittelt über die n! verschiedenen Eingabeanordnungen):
V n ≥ log(n!).
Beweis: Der Vergleichsbaum TA,n, den A erzeugt, hat N =
n! (externe) Blätter.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
111
Satz 6.6.2
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst, dann gilt für die mittlere Vergleichsanzahl V n
(gemittelt über die n! verschiedenen Eingabeanordnungen):
V n ≥ log(n!).
Beweis: Der Vergleichsbaum TA,n, den A erzeugt, hat N =
n! (externe) Blätter. – Proposition 3.3.5 (zu totaler äußerer
Weglänge) besagt:
TA,n hat N externe Knoten ⇒ TEPL(TA,n) ≥ N log N .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
111
Satz 6.6.2
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst, dann gilt für die mittlere Vergleichsanzahl V n
(gemittelt über die n! verschiedenen Eingabeanordnungen):
V n ≥ log(n!).
Beweis: Der Vergleichsbaum TA,n, den A erzeugt, hat N =
n! (externe) Blätter. – Proposition 3.3.5 (zu totaler äußerer
Weglänge) besagt:
TA,n hat N externe Knoten ⇒ TEPL(TA,n) ≥ N log N .
Erwartete, mittlere äußere Weglänge E( N1 TEPL(TA,n)) ist
≥ log(N ).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
111
Satz 6.6.2
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst, dann gilt für die mittlere Vergleichsanzahl V n
(gemittelt über die n! verschiedenen Eingabeanordnungen):
V n ≥ log(n!).
Beweis: Der Vergleichsbaum TA,n, den A erzeugt, hat N =
n! (externe) Blätter. – Proposition 3.3.5 (zu totaler äußerer
Weglänge) besagt:
TA,n hat N externe Knoten ⇒ TEPL(TA,n) ≥ N log N .
Erwartete, mittlere äußere Weglänge E( N1 TEPL(TA,n)) ist
≥ log(N ).
Daraus: Die mittlere Anzahl von Vergleichen ist ≥ log(n!). FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
111
Satz 6.6.3
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst und dabei Randomisierung benutzt
(d. h. Zufallsexperimente ausführt, z. B. Randomisiertes Quicksort)
dann gibt es eine Eingabe a = (a1, . . . , an) aus verschiedenen Elementen von U ,
so dass die erwartete Vergleichsanzahl von A auf a
(gemittelt über die Zufallsexperimente von A)
≥ log(n!) ist.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
112
Satz 6.6.3
Wenn A ein Schlüsselvergleichsverfahren ist, das das Sortierproblem löst und dabei Randomisierung benutzt
(d. h. Zufallsexperimente ausführt, z. B. Randomisiertes Quicksort)
dann gibt es eine Eingabe a = (a1, . . . , an) aus verschiedenen Elementen von U ,
so dass die erwartete Vergleichsanzahl von A auf a
(gemittelt über die Zufallsexperimente von A)
≥ log(n!) ist.
Beweis (für Interessierte): Druckfolien.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
112
6.7. Sortieren in Linearzeit
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
113
6.7. Sortieren in Linearzeit
Schlüssel nicht als atomares Objekt, sondern als Index
benutzen
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
113
6.7. Sortieren in Linearzeit
Schlüssel nicht als atomares Objekt, sondern als Index
benutzen
→ untere Schranke gilt nicht.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
113
6.7. Sortieren in Linearzeit
Schlüssel nicht als atomares Objekt, sondern als Index
benutzen
→ untere Schranke gilt nicht.
U = {0, 1, . . . , m − 1} = [m].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
113
6.7. Sortieren in Linearzeit
Schlüssel nicht als atomares Objekt, sondern als Index
benutzen
→ untere Schranke gilt nicht.
U = {0, 1, . . . , m − 1} = [m].
Gegeben: n Objekte mit Schlüsseln a1, . . . , an aus U . Sortiere!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
113
6.7. Sortieren in Linearzeit
Schlüssel nicht als atomares Objekt, sondern als Index
benutzen
→ untere Schranke gilt nicht.
U = {0, 1, . . . , m − 1} = [m].
Gegeben: n Objekte mit Schlüsseln a1, . . . , an aus U . Sortiere!
Präziser: Gegeben sind in A[1..n] n Datenobjekte
(a1, d1), . . . , (an, dn)
mit Schlüsseln a1, . . . , an aus U . Sortiere (stabil)!
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
113
(A) Countingsort – Sortieren durch Zählen
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
114
(A) Countingsort – Sortieren durch Zählen
Idee, drei Phasen:
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
114
(A) Countingsort – Sortieren durch Zählen
Idee, drei Phasen:
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
2. Benutze dies (wieder in C[i]), um zu berechnen, wie viele
Einträge in A einen Schlüssel ≤ i haben.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
114
(A) Countingsort – Sortieren durch Zählen
Idee, drei Phasen:
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
2. Benutze dies (wieder in C[i]), um zu berechnen, wie viele
Einträge in A einen Schlüssel ≤ i haben.
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
114
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
115
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
for i from 0 to m − 1 do
(2)
C[i] ← 0; // Zeitaufwand: Θ(m)
(3) for j from 1 to n do C[A[j].key]++;
// Zeitaufwand: Θ(n)
(1)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
115
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
for i from 0 to m − 1 do
(2)
C[i] ← 0; // Zeitaufwand: Θ(m)
(3) for j from 1 to n do C[A[j].key]++;
// Zeitaufwand: Θ(n)
(1)
2. Benutze dies (wieder in C[i]), um zu berechnen, wie viele
Einträge in A einen Schlüssel ≤ i haben.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
115
1. Zähle in Komponente C[i] eines Arrays C[0..m − 1], wie
oft der Schlüssel i vorkommt.
for i from 0 to m − 1 do
(2)
C[i] ← 0; // Zeitaufwand: Θ(m)
(3) for j from 1 to n do C[A[j].key]++;
// Zeitaufwand: Θ(n)
(1)
2. Benutze dies (wieder in C[i]), um zu berechnen, wie viele
Einträge in A einen Schlüssel ≤ i haben.
for i from 1 to m − 1 do
(5)
C[i] ← C[i−1] + C[i]; // Zeitaufwand: Θ(m)
(4)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
115
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
Geschickt: In A[1..n] einmal von hinten nach vorne laufen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
Geschickt: In A[1..n] einmal von hinten nach vorne laufen.
Zum Verständnis beobachte: Wenn Eintrag mit Schlüssel i,
der in A am weitesten rechts steht, an Stelle A[j] steht, muss
dieser an die Stelle B[C[i]].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
Geschickt: In A[1..n] einmal von hinten nach vorne laufen.
Zum Verständnis beobachte: Wenn Eintrag mit Schlüssel i,
der in A am weitesten rechts steht, an Stelle A[j] steht, muss
dieser an die Stelle B[C[i]]. Der nächste Eintrag mit diesem
Schlüssel muss in das Fach unmittelbar links daneben
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
Geschickt: In A[1..n] einmal von hinten nach vorne laufen.
Zum Verständnis beobachte: Wenn Eintrag mit Schlüssel i,
der in A am weitesten rechts steht, an Stelle A[j] steht, muss
dieser an die Stelle B[C[i]]. Der nächste Eintrag mit diesem
Schlüssel muss in das Fach unmittelbar links daneben – daher:
übertragen, dann C[i] herunterzählen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
3. Übertrage die Einträge mit Schlüssel i aus A in die Positionen
C[i − 1] + 1, . . . ,C[i] in Array B, stabil.
Geschickt: In A[1..n] einmal von hinten nach vorne laufen.
Zum Verständnis beobachte: Wenn Eintrag mit Schlüssel i,
der in A am weitesten rechts steht, an Stelle A[j] steht, muss
dieser an die Stelle B[C[i]]. Der nächste Eintrag mit diesem
Schlüssel muss in das Fach unmittelbar links daneben – daher:
übertragen, dann C[i] herunterzählen.
for j from n downto 1 do
(7)
i ← A[j].key;
(8)
B[C[i]] ← A[j]; // aktueller Platz für Schlüssel i
(9)
C[i]--; // auf linken Nachbarn umsetzen
// Zeitaufwand: Θ(n)
(6)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
1
2
3
4
5
6
7
C:
8
9
B:
Eingabe, Datenstruktur.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
0
1
3
0
2
2
1
2
3
4
5
6
7
8
9
B:
Nach (1)–(3): Einträge gezählt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
2
5
5
7
9
1
2
3
4
5
6
7
8
9
B:
Nach (4)–(5): Endpunkte der Segmente gleicher Schlüssel
ermittelt.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
2
5
5
7
9
1
2
3
4
5
6
7
8
9
33
B:
Zeile (8): Eintrag kopieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
2
4
5
7
9
1
2
3
4
5
6
7
8
9
33
B:
Zeile (9): Index heruntersetzen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
2
4
5
7
9
1
2
3
4
5
6
7
B:
FG KTuEA, TU Ilmenau
8
9
33
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
2
4
5
7
9
1
2
3
4
5
6
7
B:
21
8
9
33
Zeile (8): Eintrag kopieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
1
4
5
7
9
1
2
3
4
5
6
7
B:
21
8
9
33
Zeile (9): Index heruntersetzen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
1
4
5
7
9
1
2
3
4
5
6
7
B:
FG KTuEA, TU Ilmenau
21
8
9
33
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
1
4
5
7
9
1
2
3
4
5
6
7
B:
21
8
9
3 2 33
Zeile (8): Eintrag kopieren.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
1
3
5
7
9
1
2
3
4
5
6
7
B:
21
8
9
3 2 33
Zeile (9): Index heruntersetzen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 1
1
1
3
5
7
9
1
2
3
4
5
6
7
B:
FG KTuEA, TU Ilmenau
21
8
9
3 2 33
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
1
2
3
4
5
6
7
8
9
A: 5 1 0 1 6 1 3 1 5 2 6 2 3 2 2 1 3 3
0
1
2
3
4
5
6
C: 0
1
1
2
5
5
7
1
2
3
4
5
6
7
8
9
B: 0 1 2 1 3 1 3 2 3 3 5 1 5 2 6 1 6 2
Resultat nach Beendigung der Schleife (6)–(9).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
116
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
n Objekte mit Schlüsseln aus [m] (gegeben in Array) können
in Zeit Θ(n + m)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
n Objekte mit Schlüsseln aus [m] (gegeben in Array) können
in Zeit Θ(n + m) und mit Zusatzplatz Θ(n + m)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
n Objekte mit Schlüsseln aus [m] (gegeben in Array) können
in Zeit Θ(n + m) und mit Zusatzplatz Θ(n + m) sortiert
werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
n Objekte mit Schlüsseln aus [m] (gegeben in Array) können
in Zeit Θ(n + m) und mit Zusatzplatz Θ(n + m) sortiert
werden.
Das Sortierverfahren ist stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
n Objekte mit Schlüsseln aus [m] (gegeben in Array) können
in Zeit Θ(n + m) und mit Zusatzplatz Θ(n + m) sortiert
werden.
Das Sortierverfahren ist stabil.
Linearzeit und linearer Platz, falls m ≤ cn, c konstant.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
Satz 6.7.1 (Countingsort – Sortieren durch Zählen)
n Objekte mit Schlüsseln aus [m] (gegeben in Array) können
in Zeit Θ(n + m) und mit Zusatzplatz Θ(n + m) sortiert
werden.
Das Sortierverfahren ist stabil.
Linearzeit und linearer Platz, falls m ≤ cn, c konstant.
Countingsort ist auch in der praktischen Anwendung sehr
schnell (wenn auch nicht Cache-freundlich).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
117
(B) Bucketsort – Fachsortieren
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
118
(B) Bucketsort – Fachsortieren
Nun seien die zu sortierenden Objekte mit Schlüsseln aus [m]
als (einfach verkettete) lineare Liste gegeben.
A:
FG KTuEA, TU Ilmenau
5 a
2 a
5 b
3 a
1 b
6 a
5 c
2 b
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
1 a
118
(B) Bucketsort – Fachsortieren
Nun seien die zu sortierenden Objekte mit Schlüsseln aus [m]
als (einfach verkettete) lineare Liste gegeben.
A:
5 a
2 a
5 b
3 a
1 b
6 a
5 c
2 b
1 a
Datenstruktur: Array B[0..m − 1] von Listen L0 . . . , Lm−1.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
118
(B) Bucketsort – Fachsortieren
Nun seien die zu sortierenden Objekte mit Schlüsseln aus [m]
als (einfach verkettete) lineare Liste gegeben.
A:
5 a
2 a
5 b
3 a
1 b
6 a
5 c
2 b
1 a
Datenstruktur: Array B[0..m − 1] von Listen L0 . . . , Lm−1.
Initialisierung mit NULL-Zeigern: Zeit Θ(m).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
118
Durchlaufe Eingabeliste, übertrage Einträge mit Schlüssel i an
den Anfang der Liste Li (angehängt in B[i]): Zeit Θ(n).
Nach Transport in das Listenarray:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
119
Durchlaufe Eingabeliste, übertrage Einträge mit Schlüssel i an
den Anfang der Liste Li (angehängt in B[i]): Zeit Θ(n).
Nach Transport in das Listenarray:
B:
0:
1:
1 b
1 a
2:
2 b
2 a
3:
3 a
4:
FG KTuEA, TU Ilmenau
5:
5 c
6:
6 a
5 b
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
5 a
119
Durchlaufe Eingabeliste, übertrage Einträge mit Schlüssel i an
den Anfang der Liste Li (angehängt in B[i]): Zeit Θ(n).
Nach Transport in das Listenarray:
B:
0:
1:
1 b
1 a
2:
2 b
2 a
3:
3 a
4:
5:
5 c
6:
6 a
5 b
5 a
Bemerke: Identische Schlüssel in umgekehrter Reihenfolge.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
119
Durchlaufe Array B[0..m − 1] von hinten nach vorn, baue
neue sortierte Liste A (anfangs leer).
Für i: lies Elemente der Liste Li aus, hänge sie vorne in die
Liste A ein.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
120
Durchlaufe Array B[0..m − 1] von hinten nach vorn, baue
neue sortierte Liste A (anfangs leer).
Für i: lies Elemente der Liste Li aus, hänge sie vorne in die
Liste A ein.
Nach Auslesen:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
120
Durchlaufe Array B[0..m − 1] von hinten nach vorn, baue
neue sortierte Liste A (anfangs leer).
Für i: lies Elemente der Liste Li aus, hänge sie vorne in die
Liste A ein.
Nach Auslesen:
A:
1 a
FG KTuEA, TU Ilmenau
1 b
2 a
2 b
5 b
5 c
6 a
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
3 a
5 a
120
Algorithmus Bucketsort (Fachsortieren)
(1) Bearbeite Elemente der Liste A nacheinander.
Füge Listenelement
i
data
vorn in Liste B[i] ein.
NB: Reihenfolge von Elementen mit demselben Schlüssel wird umgedreht.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
121
Algorithmus Bucketsort (Fachsortieren)
(1) Bearbeite Elemente der Liste A nacheinander.
Füge Listenelement
i
data
vorn in Liste B[i] ein.
NB: Reihenfolge von Elementen mit demselben Schlüssel wird umgedreht.
(2) Für i = m − 1, . . . , 1, 0: lies B[i] von vorn nach hinten.
Füge Element i data
vorn in Ausgabeliste ein.
NB: Reihenfolge wird erneut umgedreht → Stabilität.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
121
Algorithmus Bucketsort (Fachsortieren)
(1) Bearbeite Elemente der Liste A nacheinander.
Füge Listenelement
i
data
vorn in Liste B[i] ein.
NB: Reihenfolge von Elementen mit demselben Schlüssel wird umgedreht.
(2) Für i = m − 1, . . . , 1, 0: lies B[i] von vorn nach hinten.
Füge Element i data
vorn in Ausgabeliste ein.
NB: Reihenfolge wird erneut umgedreht → Stabilität.
Satz 6.7.2 (Bucketsort/Fachsortieren)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
121
Algorithmus Bucketsort (Fachsortieren)
(1) Bearbeite Elemente der Liste A nacheinander.
Füge Listenelement
i
data
vorn in Liste B[i] ein.
NB: Reihenfolge von Elementen mit demselben Schlüssel wird umgedreht.
(2) Für i = m − 1, . . . , 1, 0: lies B[i] von vorn nach hinten.
Füge Element i data
vorn in Ausgabeliste ein.
NB: Reihenfolge wird erneut umgedreht → Stabilität.
Satz 6.7.2 (Bucketsort/Fachsortieren)
n Objekte mit Schlüsseln aus [m] (gegeben als lineare Liste)
können in Zeit Θ(n + m)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
121
Algorithmus Bucketsort (Fachsortieren)
(1) Bearbeite Elemente der Liste A nacheinander.
Füge Listenelement
i
data
vorn in Liste B[i] ein.
NB: Reihenfolge von Elementen mit demselben Schlüssel wird umgedreht.
(2) Für i = m − 1, . . . , 1, 0: lies B[i] von vorn nach hinten.
Füge Element i data
vorn in Ausgabeliste ein.
NB: Reihenfolge wird erneut umgedreht → Stabilität.
Satz 6.7.2 (Bucketsort/Fachsortieren)
n Objekte mit Schlüsseln aus [m] (gegeben als lineare Liste)
können in Zeit Θ(n + m) und mit Zusatzplatz für m Zeiger
stabil sortiert werden.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
121
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
(C) Radixsort – Mehrphasen-Counting-/Bucketsort
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
(C) Radixsort – Mehrphasen-Counting-/Bucketsort
Anwendbar in verschiedenen Situationen:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
(C) Radixsort – Mehrphasen-Counting-/Bucketsort
Anwendbar in verschiedenen Situationen:
1. Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U k , U = [m], m ≤ n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
(C) Radixsort – Mehrphasen-Counting-/Bucketsort
Anwendbar in verschiedenen Situationen:
1. Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U k , U = [m], m ≤ n.
Anordnungskriterium: lexikographisch, d. h.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
(C) Radixsort – Mehrphasen-Counting-/Bucketsort
Anwendbar in verschiedenen Situationen:
1. Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U k , U = [m], m ≤ n.
Anordnungskriterium: lexikographisch, d. h.
(x1, . . . , xk ) < (y1, . . . , yk )
⇔ ∃j ∈ {1, . . . , k} : (x1, . . . , xj−1) = (y1, . . . , yj−1) ∧ xj < yj .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
Was tun, wenn die Anzahl m der möglichen Schlüssel begrenzt,
aber deutlich größer als n ist? (Beispiel: m ≤ n2.)
(C) Radixsort – Mehrphasen-Counting-/Bucketsort
Anwendbar in verschiedenen Situationen:
1. Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U k , U = [m], m ≤ n.
Anordnungskriterium: lexikographisch, d. h.
(x1, . . . , xk ) < (y1, . . . , yk )
⇔ ∃j ∈ {1, . . . , k} : (x1, . . . , xj−1) = (y1, . . . , yj−1) ∧ xj < yj .
2. Schlüssel sind Zahlen x in U ⊆ {0, 1, . . . , mk − 1}, m ≤ n.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
122
3. k (möglicherweise verschiedene) geordnete Mengen
(U1, <1), . . . , (Uk , <k )
Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U1 × · · · × Uk
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
123
3. k (möglicherweise verschiedene) geordnete Mengen
(U1, <1), . . . , (Uk , <k )
Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U1 × · · · × Uk ,
mit lexikographischer Ordnung.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
123
3. k (möglicherweise verschiedene) geordnete Mengen
(U1, <1), . . . , (Uk , <k )
Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U1 × · · · × Uk ,
mit lexikographischer Ordnung.
Beispiele:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
123
3. k (möglicherweise verschiedene) geordnete Mengen
(U1, <1), . . . , (Uk , <k )
Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U1 × · · · × Uk ,
mit lexikographischer Ordnung.
Beispiele:
Daten: {1, . . . , 31} × {1, . . . , 12} × {1801, . . . , 2090}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
123
3. k (möglicherweise verschiedene) geordnete Mengen
(U1, <1), . . . , (Uk , <k )
Schlüssel sind Folgen x = (x1, . . . , xk ) ∈ U1 × · · · × Uk ,
mit lexikographischer Ordnung.
Beispiele:
Daten: {1, . . . , 31} × {1, . . . , 12} × {1801, . . . , 2090}.
Spielkarten: {♦, ♥, ♠, ♣}×{2, . . . , 10, Bube, Dame, König, Ass}.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
123
4. Σ<∞. Dabei: Σ ist Alphabet“, d. h. nichtleere endliche
”
Menge (z. B. ASCII-Alphabet) mit Ordnung <.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
124
4. Σ<∞. Dabei: Σ ist Alphabet“, d. h. nichtleere endliche
”
Menge (z. B. ASCII-Alphabet) mit Ordnung <.
(4a) Lexikographische Ordnung auf Σ<∞ (wie im Lexikon):
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
124
4. Σ<∞. Dabei: Σ ist Alphabet“, d. h. nichtleere endliche
”
Menge (z. B. ASCII-Alphabet) mit Ordnung <.
(4a) Lexikographische Ordnung auf Σ<∞ (wie im Lexikon):
(x1, . . . , xk ) <lex (y1, . . . , y`)
⇔
k < ` ∧ (x1, . . . , xk ) = (y1, . . . , yk ) ∨
∃j ∈ {1, . . . , min{k, `}} : (x1, . . . , xj−1) = (y1, . . . , yj−1) ∧ xj < yj .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
124
4. Σ<∞. Dabei: Σ ist Alphabet“, d. h. nichtleere endliche
”
Menge (z. B. ASCII-Alphabet) mit Ordnung <.
(4a) Lexikographische Ordnung auf Σ<∞ (wie im Lexikon):
(x1, . . . , xk ) <lex (y1, . . . , y`)
⇔
k < ` ∧ (x1, . . . , xk ) = (y1, . . . , yk ) ∨
∃j ∈ {1, . . . , min{k, `}} : (x1, . . . , xj−1) = (y1, . . . , yj−1) ∧ xj < yj .
(4b) Kanonische Ordnung auf Σ<∞ (kürzere Strings zuerst):
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
124
4. Σ<∞. Dabei: Σ ist Alphabet“, d. h. nichtleere endliche
”
Menge (z. B. ASCII-Alphabet) mit Ordnung <.
(4a) Lexikographische Ordnung auf Σ<∞ (wie im Lexikon):
(x1, . . . , xk ) <lex (y1, . . . , y`)
⇔
k < ` ∧ (x1, . . . , xk ) = (y1, . . . , yk ) ∨
∃j ∈ {1, . . . , min{k, `}} : (x1, . . . , xj−1) = (y1, . . . , yj−1) ∧ xj < yj .
(4b) Kanonische Ordnung auf Σ<∞ (kürzere Strings zuerst):
(x1, . . . , xk ) <kan (y1, . . . , y`)
⇔ k<` ∨
k = ` ∧ ∃j ∈ {1, . . . , k} : (x1, . . . , xj−1) = (y1, . . . , yj−1) ∧ xj < yj .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
124
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1,
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
(die am wenigsten signifikante“ Komponente zuerst).
”
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
(die am wenigsten signifikante“ Komponente zuerst).
”
Eingabe:
Array/Liste A: Einträge mit Schlüsseln (x1, . . . , xk ) aus [m]k .
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
(die am wenigsten signifikante“ Komponente zuerst).
”
Eingabe:
Array/Liste A: Einträge mit Schlüsseln (x1, . . . , xk ) aus [m]k .
Methode:
für l = k, k − 1, . . . , 1 tue:
sortiere A mittels Counting- bzw. Bucketsort für U = [m]
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
(die am wenigsten signifikante“ Komponente zuerst).
”
Eingabe:
Array/Liste A: Einträge mit Schlüsseln (x1, . . . , xk ) aus [m]k .
Methode:
für l = k, k − 1, . . . , 1 tue:
sortiere A mittels Counting- bzw. Bucketsort für U = [m]
mit Komponente xl aus (x1, . . . , xk ) als Sortierschlüssel.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
(die am wenigsten signifikante“ Komponente zuerst).
”
Eingabe:
Array/Liste A: Einträge mit Schlüsseln (x1, . . . , xk ) aus [m]k .
Methode:
für l = k, k − 1, . . . , 1 tue:
sortiere A mittels Counting- bzw. Bucketsort für U = [m]
mit Komponente xl aus (x1, . . . , xk ) als Sortierschlüssel.
Zeit insgesamt: Θ(k · (n + m))
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Zunächst:
Situation 1, Schlüssel x = (x1, . . . , xk ) ∈ U k , U = [m].
Idee: sortiere k-mal mittels Counting-/Bucketsort
und zwar gemäß Komponente k, dann k − 1, . . . , dann 1
(die am wenigsten signifikante“ Komponente zuerst).
”
Eingabe:
Array/Liste A: Einträge mit Schlüsseln (x1, . . . , xk ) aus [m]k .
Methode:
für l = k, k − 1, . . . , 1 tue:
sortiere A mittels Counting- bzw. Bucketsort für U = [m]
mit Komponente xl aus (x1, . . . , xk ) als Sortierschlüssel.
Zeit insgesamt: Θ(k · (n + m))
Zusatzplatz: Θ(m + n) bzw. Θ(m).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
125
Beispiel:
U = {A,B,C,D}
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
126
Beispiel:
U = {A,B,C,D}
Eingabe A:
FG KTuEA, TU Ilmenau
BCC
ABC
BAC
CAD
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
ABA
126
Beispiel:
U = {A,B,C,D}
Eingabe A:
BCC
ABC
Nach Runde l = 3: ABA
FG KTuEA, TU Ilmenau
BCC
BAC
CAD
ABC
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
BAC
ABA
CAD
126
Beispiel:
U = {A,B,C,D}
Eingabe A:
BCC
ABC
BAC
CAD
ABA
Nach Runde l = 3: ABA
BCC
ABC
BAC
CAD
Nach Runde l = 2: BAC
CAD
ABA
ABC
BCC
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
126
Beispiel:
U = {A,B,C,D}
Eingabe A:
BCC
ABC
BAC
CAD
ABA
Nach Runde l = 3: ABA
BCC
ABC
BAC
CAD
Nach Runde l = 2: BAC
CAD
ABA
ABC
BCC
Nach Runde l = 1: ABA
ABC
BAC
BCC
CAD
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
126
Beispiel:
U = {A,B,C,D}
Eingabe A:
BCC
ABC
BAC
CAD
ABA
Nach Runde l = 3: ABA
BCC
ABC
BAC
CAD
Nach Runde l = 2: BAC
CAD
ABA
ABC
BCC
Nach Runde l = 1: ABA
ABC
BAC
BCC
CAD
Beobachte: Nach Runde für l sind die Objekte gemäß
xl, . . . , xk sortiert.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
126
Satz 6.7.3
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit
Schlüsseln aus [m]k in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
127
Satz 6.7.3
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit
Schlüsseln aus [m]k in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays). Das Verfahren ist stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
127
Satz 6.7.3
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit
Schlüsseln aus [m]k in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays). Das Verfahren ist stabil.
Das Verfahren für U1 × · · · × Uk (Situation 3) ist im wesentlichen dasselbe, nur benötigt man verschiedene B-Arrays (oder
Arrayabschnitte) in den einzelnen Durchgängen.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
127
Satz 6.7.3
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit
Schlüsseln aus [m]k in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays). Das Verfahren ist stabil.
Das Verfahren für U1 × · · · × Uk (Situation 3) ist im wesentlichen dasselbe, nur benötigt man verschiedene B-Arrays (oder
Arrayabschnitte) in den einzelnen Durchgängen.
Zeit: O(kn+|U1|+· · ·+|Uk |); Platz: O(n+max1≤i≤k |Ui|).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
127
Satz 6.7.3
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit
Schlüsseln aus [m]k in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays). Das Verfahren ist stabil.
Das Verfahren für U1 × · · · × Uk (Situation 3) ist im wesentlichen dasselbe, nur benötigt man verschiedene B-Arrays (oder
Arrayabschnitte) in den einzelnen Durchgängen.
Zeit: O(kn+|U1|+· · ·+|Uk |); Platz: O(n+max1≤i≤k |Ui|).
Situation 2: Schlüssel sind Zahlen in {0, 1, . . . , mk − 1}:
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
127
Satz 6.7.3
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit
Schlüsseln aus [m]k in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays). Das Verfahren ist stabil.
Das Verfahren für U1 × · · · × Uk (Situation 3) ist im wesentlichen dasselbe, nur benötigt man verschiedene B-Arrays (oder
Arrayabschnitte) in den einzelnen Durchgängen.
Zeit: O(kn+|U1|+· · ·+|Uk |); Platz: O(n+max1≤i≤k |Ui|).
Situation 2: Schlüssel sind Zahlen in {0, 1, . . . , mk − 1}:
Repräsentiere Zahlen in m-ärer Darstellung (mit k Ziffern);
wende Radixsort an.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
127
Beispiel:
"
m = 10
(Dezimaldarstellung)
531 729 617 312 425 436
!
"
#
!
#
l =3
531
312
425 436 617
729
l =2
312
617
425 729 531
436
l =1
312
FG KTuEA, TU Ilmenau
425
436 531
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
617
729
128
Beispiel:
"
m = 10
(Dezimaldarstellung)
531 729 617 312 425 436
!
"
#
!
#
l =3
531
312
425 436 617
729
l =2
312
617
425 729 531
436
l =1
312
425
436 531
617
729
So kleine m sind nicht typisch.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
128
Beispiel:
"
m = 10
(Dezimaldarstellung)
531 729 617 312 425 436
!
"
#
!
#
l =3
531
312
425 436 617
729
l =2
312
617
425 729 531
436
l =1
312
425
436 531
617
729
So kleine m sind nicht typisch.
Sinnvoll: m ≈ n, m Zweierpotenz, z. B. m = 28 oder 216.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
128
Beispiel:
"
m = 10
(Dezimaldarstellung)
531 729 617 312 425 436
!
"
#
!
#
l =3
531
312
425 436 617
729
l =2
312
617
425 729 531
436
l =1
312
425
436 531
617
729
So kleine m sind nicht typisch.
Sinnvoll: m ≈ n, m Zweierpotenz, z. B. m = 28 oder 216.
Satz 6.7.4 Radixsort für Zahlen sortiert n Objekte mit
Schlüsseln aus [mk ] in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays).
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
128
Beispiel:
"
m = 10
(Dezimaldarstellung)
531 729 617 312 425 436
!
"
#
!
#
l =3
531
312
425 436 617
729
l =2
312
617
425 729 531
436
l =1
312
425
436 531
617
729
So kleine m sind nicht typisch.
Sinnvoll: m ≈ n, m Zweierpotenz, z. B. m = 28 oder 216.
Satz 6.7.4 Radixsort für Zahlen sortiert n Objekte mit
Schlüsseln aus [mk ] in Zeit Θ(k(n + m)) und Platz Θ(m)
(bzw. Θ(n + m) für Arrays). Das Verfahren ist stabil.
FG KTuEA, TU Ilmenau
Algorithmen und Datenstrukturen – SS15 – Kapitel 6
128
Herunterladen