7 Sortieren in linearer Zeit

Werbung
Algorithmen und Datenstrukturen
7
159
Sortieren in linearer Zeit
Wie schnell ist Sortieren möglich ?
Bisher: verschiedene Algorithmen, welche n Zahlen in O(n log n) Zeit sortieren.
Gemeinsamkeit: Sortierung beruht auf paarweisen Vergleichen der Eingabeelemente. Man nennt Verfahren dieser Art vergleichende Sortierverfahren.
In Abschnitt 7.1 zeigen wir, dass vergleichende Sortierverfahren im ungünstigsten Fall Ω(n log n) Vergleiche ausführen müssen, um n Elemente zu sortieren. Damit sind Mergesort und Heapsort asymptotisch optimal.
In den folgenden Abschnitten werden drei Sortierverfahren vorgestellt, welche in linearer Zeit sortieren. Diese verwenden andere Operationen als Vergleiche.
7 Sortieren in linearer Zeit
TU Bergakademie Freiberg, WS 2005/06
160
Algorithmen und Datenstrukturen
7.1
Untere Schranken für Sortierverfahren
Vergleichendes Sortieren: Information über Eingabefeld ha1 , a2 , . . . , an i nur
durch paarweise Vergleiche
ai < aj ,
ai ≤ aj ,
ai = aj ,
ai ≥ aj ,
oder ai > aj ,
ohne bspw. den Wert der Elemente zu berücksichtigen.
Ohne Einschränkung: Eingabelemente paarweise verschieden, sodass Prüfung auf Gleichheit entfällt.
Damit sind alle weiteren Vergleiche äquivalent, betrachte also ausschließlich Vergleiche der Form ai ≤ aj .
7.1 Untere Schranken für Sortierverfahren
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
161
Entscheidungsbäume
Ein Entscheidungsbaum ist ein voller binärer Baum, der die von einem Sortierverfahren durchgeführten Vergleiche und Entscheidungen repräsentiert.
Alle anderen Aspekte des Sortieralgorithmus (Datenbewegung, Steuerung)
werden dabei wegabstrahiert.
• innere Knoten: Bezeichnung i : j (1 ≤ i, j ≤ n) steht für Vergleich ai ≤
aj ; linker Teilbaum entspricht Fortgang des Algorithmus falls ai ≤ aj ,
rechter Teilbaum dem von ai > aj .
• Blätter: jedem Blatt entspricht die zur Sortierung der Eingabefolge erforderliche Permutation hπ(1), π(2), . . . , π(n)i.
• Jede Ausführung des Algorithmus entspricht ein Weg von der Wurzel
zu einem Blatt. An jedem inneren Knoten verzweigt der Algorithmus in
Abhängigkeit von der bis zu dieser Stelle angesammelten Information.
7.1 Untere Schranken für Sortierverfahren
TU Bergakademie Freiberg, WS 2005/06
162
Algorithmen und Datenstrukturen
1:2
≤
>
2:3
≤
1:3
≤
>
h1, 2, 3i
h2, 1, 3i
1:3
≤
h1, 3, 2i
>
>
h3, 1, 2i
2:3
≤
h2, 3, 1i
>
h3, 2, 1i
Entscheidungsbaum für Insertion-Sort angewandt auf dreielementiges Eingabefeld.
Die Bezeichnung i : j in einem inneren Knoten steht für den Vergleich ai ≤ aj ,
ein Blatt mit der Permutation hπ(1), π(2), . . . , π(n)i steht für eine endgültige Sortierreihenfolge aπ(1) ≤ aπ(2) ≤ · · · ≤ aπ(n) . Der hervorgehobene Weg folgt den
Entscheidungen bei der Eingabe ha1 = 6, a2 = 8, a3 = 5i.
7.1 Untere Schranken für Sortierverfahren
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
163
Jedes vergleichende Sortierverfahren muss alle n! Permutationen eines nelementigen Eingabefeldes erzeugen können.
Deshalb:
• Der zugehörige Entscheidungsbaum muss zu jeder dieser Permutationen ein Blatt enthalten.
• Jedes dieser Blätter muss von der Wurzel durch eine mögliche Ausführung
des Algorithmus erreichbar sein.
Wir betrachten daher nur Entscheidungsbäume, in denen jede Permutation
als erreichbares Blatt auftritt.
7.1 Untere Schranken für Sortierverfahren
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
164
Eine untere Schranke für den ungünstigsten Fall
Die größtmögliche Anzahl erforderlicher Vergleiche eines vergleichenden
Sortierverfahrens ist die Länge des längsten Weges in dessen Entscheidungsbaum von der Wurzel zu einem Blatt.
Eine untere Schranke für die Ausführungszeit eines vergleichenden Sortierverfahrens ist daher gegeben durch eine untere Schranke für die Höhe aller Entscheidungsbäume, in denen jede Permutation als erreichbares Blatt
auftritt. (Z.B. Insertion-Sort Θ(n2 ), Merge-Sort Θ(n log n).
Satz 7.1 Ein vergleichendes Sortierverfahren benötigt im ungünstigsten Fall
Ω(n log n) Vergleiche.
Korollar 7.2 Heapsort und Merge-Sort sind asymptotisch optimale vergleichende Sortierverfahren.
7.1 Untere Schranken für Sortierverfahren
TU Bergakademie Freiberg, WS 2005/06
165
Algorithmen und Datenstrukturen
7.2
Counting-Sort
Wesentliche Zusatzannahme: Zu sortierende Zahlen liegen in {0, 1, . . . , k}
für festes, im Voraus bekanntes k.
Grundidee: Bestimme für jedes zu sortierende Element x die Anzahl Elemente, welche in der sortierten Reihenfolge vor x liegen, und platziere damit x an die korrekte Stelle.
Eingabe: Feld A[1 . . n] mit A[j] ∈ {0, . . . , k} für alle j = 1, . . . , n. A, k, n als
Parameter übergeben.
Ausgabe: Feld B[1 . . n] mit Inhalt von A in sortierter Reihenfolge.
Hilfsfeld: C[0 . . k].
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
166
C OUNTING -S ORT(A, B, k)
1
2
3
4
5
6
7
8
9
10
11
for i ← 0 to k
do C[i] ← 0
for j ← 1 to length[A]
do C[A[j]] ← C[A[j]] + 1
C[i] gibt nun an, wie oft i in A vorkommt
for i ← 1 to k
do C[i] ← C[i] + C[i − 1]
C[i] gibt nun die Anzahl Elemente ≤ i in A an
for j ← length[A] downto 1
do B[C[A[j]]] ← A[j]
C[A[j]] ← C[A[j]] − 1
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
1
2
3
4
5
6
7
8
C
B
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
0
2
3
0
1
1
2
3
4
5
6
7
8
B
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
0
2
2
4
3
7
0
7
18
1
2
3
4
5
6
7
8
B
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
0
2
2
4
36
7
0
7
18
1
2
3
4
5
6
7
8
3
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
1
0
2
2
4
36
7
0
7
18
1
2
3
4
5
6
7
8
0
3
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
1
0
2
2
4
35
6
7
0
7
18
1
2
3
4
5
6
7
8
3
3
0
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
1
0
2
3
2
4
35
6
7
0
7
18
1
2
3
4
5
6
7
8
3
3
0
2
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
0
2
1
0
2
3
2
4
35
6
7
0
7
18
1
2
3
4
5
6
7
8
0
0
3
3
2
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
0
2
1
0
2
3
2
4
35
6
7
4
0
7
18
1
2
3
4
5
6
7
8
0
0
2
3
3
3
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
0
2
1
0
2
3
2
4
35
6
7
4
0
7
8
17
1
2
3
4
5
6
7
8
0
0
2
3
3
3
5
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
167
Algorithmen und Datenstrukturen
A
C
B
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
0
2
1
0
2
3
4
2
35
6
7
4
0
7
8
17
1
2
3
4
5
6
7
8
0
0
2
2
3
3
3
5
Ausführung von Counting-Sort auf Eingabefeld A[1 . . 8] mit Elementen aus
{0, 1, . . . , 5} mit Hilfsfeld C und sortierter Ausgabe in Feld B.
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
168
Algorithmen und Datenstrukturen
Aufwand:
for -Schleife Zeilen 1–2:
Θ(k)
for -Schleife Zeilen 3–4:
Θ(n)
for -Schleife Zeilen 6–7:
Θ(k)
for -Schleife Zeilen 9–11:
Θ(n)
Insgesamt:
Θ(n + k)
• Geeignetes Verfahren falls k = O(n), in diesem Fall Laufzeit Θ(n).
• Kein vergleichendes Sortierverfahren (keine Vergleiche, sondern Zahlwerte werden ausgenutzt), daher O(n log n)-Schranke verbesserbar.
• Counting-Sort ist stabil: gleiche Zahlen erscheinen im Ausgabefeld in
derselben Reihenfolge. (Wichtig wenn Zahlen Schlüssel zu größeren
Datensätzen)
7.2 Counting-Sort
TU Bergakademie Freiberg, WS 2005/06
169
Algorithmen und Datenstrukturen
7.3
Radix-Sort
Algorithmus aus dem Lochkarten-Zeitalter (frühes 20. JH)
• Lochkarten mit 80 Spalten, in jeder Spalte kann an einer von 12 Positionen ein Loch eingestanzt werden.
• Lochkarten-Lesemaschinen können Kartenstapel hinsichtlich einer Spalte in Teilstapel mit derselben gestanzten Position aufteilen.
• Diese Teilstapel werden ihrerseits weitersortiert.
Beispiele:
1. Sortieren von Dezimalzahlen, nur 10 Positionen erforderlich. Nach jeder Ziffer wird separat sortiert; bei d Ziffern also d Sortierläufe nötig.
2. Sortieren von Datensätzen nach Tag, dann Monat, dann Jahr.
7.3 Radix-Sort
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
3
2
5
6
0
8
8
3
5
7
5
4
7
3
1
5
0
9
4
0
4
6
6
3
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
3
2
5
6
0
8
8
3
5
7
5
4
7
3
1
5
0
9
4
0
4
6
6
3
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
63
74
46
92
5
50
0
6
3
1
8
3
78
03
87
35
5
4
5
1
4
37
3
5
20
09
6
4
0
8
6
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
63
74
46
92
5
50
6
0
3
1
8
3
78
03
87
35
5
4
5
1
4
37
3
5
20
09
6
4
0
8
6
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
63
7
6
74
36
4
8
7
92
0
5
0
6
0
4
3
8
1
50
2
0
3
6
8
3
87
4
7
4
35
37
4
6
50
2
90
5
3
5
4
5
1
5
1
6
3
4
0
8
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
63
7
6
74
36
4
8
7
92
0
5
0
6
0
4
3
8
1
50
2
0
3
6
8
3
87
4
7
4
35
37
4
6
5
20
90
3
5
5
4
5
1
5
1
6
3
4
0
8
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
3
6
7
6
7
4
36
4
6
8
7
6
8
47
7
4
3
7
4
8
6
9
0
2
5
0
3
6
0
4
3
8
5
1
50
2
3
0
9
35
8
3
6
0
3
5
5
4
1
6
3
4
1
5
20
930
8
5
4
5
0
1
5
8
0
TU Bergakademie Freiberg, WS 2005/06
170
Algorithmen und Datenstrukturen
Wichtig: Sortieren nach niedrigstwertigen Ziffer zuerst (Sonst zuviele
Hilfsstapel“ erforderlich).
”
Rechts: Anwendung von Radix-Sort
auf Stapel von 8 Zahlen von je drei
Ziffern. Die eingefärbte Spalte ist
diejenige, nach der gerade sortiert
wird.
Wesentlich hier: Sortierverfahren für
Spalten muss stabil sein, da sonst
zurückliegende Feinsortierung wieder zunichtegemacht werden könnte.
7.3 Radix-Sort
6
3
7
6
7
4
36
4
8
6
7
8
6
47
7
4
3
7
4
6
8
9
0
2
5
0
3
6
0
4
3
8
5
1
50
2
3
0
9
35
8
3
6
0
3
5
5
4
1
6
3
4
1
5
20
930
8
5
4
5
0
1
5
8
0
TU Bergakademie Freiberg, WS 2005/06
171
Algorithmen und Datenstrukturen
Pseudocode. Radix-Sort angewandt auf n-elementiges Feld aus d-ziffrigen
Zahlen. Ziffer 1 ist die niedrigstwertige, d die höchstwertige Ziffer.
R ADIX -S ORT(A, d)
1 for i ← 1 to d
2
do Sortiere Feld A bezüglich Ziffer i mit stabilem Sortierverfahren
Laufzeit. Annahme: Sortierung der Ziffern jeweils mit Counting-Sort
• Θ(n + k) per Durchlauf (Ziffern im Bereich 0, . . . , k)
• d Durchläufe
• Insgesamt also Θ(d(n + k).
• Falls k = O(n) ergibt sich Laufzeit von O(dn).
7.3 Radix-Sort
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
172
Korrektheit: Induktion über Anzahl Ziffern
• Seien Ziffern 1, 2, . . . , i − 1 bereits sortiert
• Zeige: stabile Sortierung nach Ziffer i resultiert in Sortiertheit von Ziffern 1, 2, . . . , i.
◦ Unterscheiden sich zwei Zahlen in Ziffer i, so bringt Sortierung nach
Ziffer i diese in die korrekte Reihenfolge. Ziffern 1, . . . , i − 1 sind
dabei irrelevant.
◦ Stimmen zwei Zahlen hinsichtlich Ziffer i überein, so sind diese
bereits in sortierter Reihenfolge (Induktionshypothese) und stabile
Sortierung erhält diese Reihenfolge.
Hierbei wird die Rolle der Stabilität deutlich.
Wie teilt man einen Schlüssel in Ziffern ein ?
7.3 Radix-Sort
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
173
Lemma 7.3 Gegeben seien n Zahlen bestehend aus jeweils b Bits sowie
eine natürliche Zahl r ≤ b. Erstere werden durch R ADIX -S ORT in einer
Laufzeit von Θ (b/r)(n + 2r ) sortiert.
Beweis:
• Für r ≤ b betrachte jeden Schlüssel als aus d = db/re Ziffern von je r
Bits zusammengesetzt.
• Jede Ziffer liegt somit im Bereich 0, . . . , 2r − 1, d.h. für Counting-Sort
wäre k = 2r − 1.
• Besipiel: ein 32-Bit Wort wird aufgeteilt in vier Ziffern aus je 8 Bits, d.h.
b = 32, r = 8, k = 2r − 1 = 255, d = b/r = 4.
• Jeder Durchlauf erfordert Θ(n + k) = Θ(n + 2r ) Zeit, d Durchläufe ergeben somit eine Laufzeit von Θ(d(n + 2r )) = Θ (b/r)(n + 2r ) .
7.3 Radix-Sort
TU Bergakademie Freiberg, WS 2005/06
174
Algorithmen und Datenstrukturen
Wahl von r ? Ausgleich zwischen b/r und n + 2r .
• Wahl r ≈ log2 n führt auf Θ(b/ log2 n(n + n)) = Θ(bn/ log2 n)
• Für r < log2 n ist b/r > b/ log2 n und n + 2r wird nicht asymptotisch
kleiner.
• Für r > log2 n wird n + 2r groß.
Beispiel: r = 2 log2 n ⇒ 2r = 22 log2 n = (2log2 n )2 = n2 .
Unter der Annahme b < blog2 nc erhalten wir für diese Wahl von r also eine
Laufzeit von Θ(n).
Um 216 Zahlen von je 32 Bit Länge zu sortieren würden wir also r = log2 216 =
16 Bits verwenden, was auf db/re = 2 Durchläufe führt.
7.3 Radix-Sort
TU Bergakademie Freiberg, WS 2005/06
175
Algorithmen und Datenstrukturen
Vergleich Radix-Sort mit Merge-Sort und Quicksort:
• Seien eine Million (≈ 220 ) 32-Bit ganze Zahlen zu sortieren
• Radix-Sort benötigt d32/20e = 2 Durchläufe.
• Merge-/Quicksort: log2 n = 20 Durchläufe.
• Beachte: Ein Durchlauf von Radix-Sort entspricht eigentlich zwei Durchläufen der Daten: einmal zum Zählen und einmal um die Daten zu verteilen.
7.3 Radix-Sort
TU Bergakademie Freiberg, WS 2005/06
176
Algorithmen und Datenstrukturen
7.4
Bucket-Sort
Anstelle der Annahme bei Counting-Sort, dass die Elemente in einem vorher bekannten Zahlenbereich liegen, beruht die lineare Laufzeit von BucketSort auf der Annahme, dass die Eingabe durch ein Zufallsexperiment generiert wird, bei welchem die Elemente gleichmäßig über das Intervall [0, 1)
verteilt sind.
Idee:
• Zerlege [0, 1) in n Gefäße (Bucketsa ).
• Verteile die n Eingabeelemente auf die Gefäße.
• Sortiere jedes Gefäß.
• Sortierte Reihenfolge durch Aneinanderreihung der Gefäßinhalte.
a wörtlich:
7.4 Bucket-Sort
Eimer
TU Bergakademie Freiberg, WS 2005/06
177
Algorithmen und Datenstrukturen
Pseudocode
Eingabe besteht aus n-elementigem Feld A, für die Elemente gilt
0 ≤ A[i] < 1.
Zwischenspeicher: Hilfsfeld B[0 . . n − 1] verketteter Listen (Gefäße)a .
B UCKET-S ORT(A)
1
2
3
4
5
6
n ← length[A]
for i ← 1 to n
do Füge A[i] ein in Liste B[bnA[i]c]
for i ← 0 to n − 1
do Sortiere Liste B[i] mit Insertion-Sort
Füge die Listen B[0], B[1], . . . , B[n − 1] hintereinander an
a Genaueres
7.4 Bucket-Sort
zu verketteten Listen im nächsten Kapitel
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.17
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.17
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.17
.39
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
3
.39
2
4
.26
3
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.17
.39
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.72
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.72
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.21
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
3
.39
2
.26
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.21
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
3
.39
2
.26
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
3
.39
2
.26
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
3
.39
2
.26
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.23
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
3
.39
2
.26
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
8
.12
7
9
.23
8
10
.68
9
.78
.23
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
3
.39
2
.26
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
9
.23
8
10
.68
9
.23
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
3
.39
2
.26
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
9
.23
8
10
.68
9
.23
.72
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
7.4 Bucket-Sort
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68 .72 .78
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68 .72 .78 .94
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68 .72 .78 .94
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68 .72 .78 .94
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68 .72 .78 .94
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
178
Algorithmen und Datenstrukturen
A
B
1
.78
0
2
.17
1
.17
.12
.17
.12
3
.39
2
.26
.21
.23
.21
4
.26
3
.39
5
.72
4
6
.94
5
7
.21
6
.68
8
.12
7
.78
.72
9
.23
8
10
.68
9
.23
.26
.72
.78
.94
.12 .17 .21 .23 .26 .39 .68 .72 .78 .94
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
179
Korrektheit
• Betrachte zwei Eingabeelemente A[i] und A[j].
• oBdA sei A[i] ≤ A[j].
• Wegen bnA[i]c ≤ bnA[j]c kommt A[i] entweder in dasselbe Gefäß wie
A[j] oder in eines mit kleinerem Index.
• Im ersten Fall bringt die lokale Sortierung mit Insertion-Sort diese Elemente in sortierte Reihenfolge.
• Im zweiten Fall geschieht dies durch die Hintereinanderreihung der
Gefäße.
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
180
Algorithmen und Datenstrukturen
Aufwandsanalyse:
• Beruht darauf, dass in keinem Gefäß allzuviele Elemente landen
• Alle Zeilen des Algorithmus bis auf Zeile 5 (Insertion-Sort) erfordern
Laufzeit von Θ(n).
• Intuitiv: erhält jedes Gefäß O(1) Elemente, so erfordert das Sortieren
jedes Gefäßes O(1) Aufwand, also O(n) für alle Gefäße.
• Es ist zu erwarten, dass jedes Gefäß wenige Elemente bekommt, da
im Mittel nur eines dort landet.
• Aber genaue Analyse hier nötig.
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
181
Algorithmen und Datenstrukturen
Wir definieren die Zufallsvariablen
ni := # Elemente, die in Gefäß i landen
(i = 0, . . . , n − 1).
Da Insertion-Sort eine quadratische Laufzeit besitzt, ergibt sich für die Laufzeit T (n) von Bucket-Sort
T (n) = Θ(n) +
n−1
X
O(n2i ).
i=0
Mit der Linearität des Erwartungswertes erhalten wir
n−1
n−1
X
X
2
E[T (n)] = E Θ(n) +
O(ni ) = Θ(n) +
E[O(n2i )]
i=0
= Θ(n) +
n−1
X
O(E[n2i ]).
i=0
(7.1)
(E[aX] = aE[X])
i=0
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
182
Algorithmen und Datenstrukturen
Behauptung: E[n2i ] = 2 − 1/n.
Beweis: Definiere die Indikatorzufallsvariable
(
1 falls A[j] in Gefäß i landet
Xi,j :=
0 sonst.
Aufgrund der Gleichverteilungsannahme gilt
Pr({A[j] landet in Gefäß i}) =
1
.
n
Ferner gilt:
ni =
n
X
Xi,j .
j=1
Somit gilt . . .
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
183
Algorithmen und Datenstrukturen
E[n2i ] = E
"
n
X
2 #
Xi,j
"
=E
j=1
"
=E
n
X
2
Xi,j
=
j=1
#
Xi,j Xi,k
j=1 k=1
+
j=1
n
X
n X
n
X
2
E[Xi,j
]+
n
X
#
X
j=1 1≤k≤n
k6=j
n
X
X
Xi,j Xi,k
E[Xi,j Xi,k ].
j=1 1≤k≤n
k6=j
Xij hat den Wert 1 mit Wahrscheinlichkeit 1/n und 0 mit Wahrscheinlichkeit
1 − 1/n. Daher folgt
1
1
1
2
E[Xi,j ] = 1 · + 0 · 1 −
= .
n
n
n
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
184
Algorithmen und Datenstrukturen
Für k 6= j sind die Zufallsvariablen Xi,j und Xi,k unabhängig. Deshalb ist
E[Xi,j Xi,k ] = E[Xi,j ] · E[Xi,k ] =
1 1
1
· = 2.
n n
n
Einsetzen dieser Teilergebnisse liefert
n
n
X
X
X 1
1
1
1
2
E[ni ] =
+
= n · + n(n − 1) · 2
2
n
n
n
n
j=1
j=1
1≤k≤n
k6=j
1
n−1
=2− .
=1+
n
n
Einsetzen dieses Erwartungswertes in (7.1) liefert für Bucket-Sort eine mittlere Laufzeit von Θ(n) + n · O(2 − 1/n) = Θ(n).
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
Algorithmen und Datenstrukturen
185
Bemerkungen:
1. Wieder kein vergleichendes Sortierverfahren. Hier wurde ein Funktionswert des Schlüssels verwendet, um ein Feld zu adressieren.
2. Wir haben eine probabilistische Analyse vorgenommen, d.h. mit wahrscheinlichkeitstheoretischen Mitteln einen Algorithmus untersucht, dessen Laufzeit von der Verteilung der Eingabe abhängt.
3. Gegensatz zu randomisierten Algorithmen, wo wir durch Randomisieren eine Wahrscheinlichkeitsverteilung einbringen.
4. Ohne die Annahme von gleichverteilten Eingabelementen gilt nicht notwendig lineare Laufzeit.
7.4 Bucket-Sort
TU Bergakademie Freiberg, WS 2005/06
Herunterladen