Algorithmen und Datenstrukturen
Dr. Michael Brinkmeier
Technische Universitat IlmenauFakultat Informatik und Automatisierung
Fachgebiet Automaten und Formale Sprachen
4.7.2007
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 1 / 21
Sortieren in Linearzeit
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 2 / 21
Sortieren in Linearzeit
Die Schranke fur das vergleichsbasierte Sortieren kann umgangen werden!
Unter Umstanden konnen die Schlussel nicht als atomares Objektaufgefasst werden, sondern als Index.⇒ die untere Schranke gilt nicht.
Beispiel: Die Schlusselmenge ist [m] := {0, 1, . . . ,m − 1}.
Gegeben: n Schlussel a1, . . . , an aus [m].
Praziser: Gegeben sind n Datenobjekte
(a1, d1), . . . , (an, dn)
mit Schlusseln a1, . . . , an aus [m].
Ziel: Sortiere die Liste stabil!
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 3 / 21
Sortieren in Linearzeit
Idee
Lege m Stapel (Stacks) mit Nummern 0, . . . ,m − 1 an.
Durchmustere die Eingabeobjekte, j = 1, . . . , n.
Lege Objekt (aj , dj) auf Stapel Nummer aj .
Wenn alle Objekte auf die Stapel verteilt sind, lese die Objekte in der
”richtigen Reihenfolge“ aus den Stapeln aus.
Realisierung der Stapel: Array B[0 . .m − 1] von Zeigern auf Listen, diedie Stapel darstellen.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 4 / 21
Sortieren in Linearzeit
Annahme: Die Eingabeobjekte stehen in einer linearen Liste A
(Array wird in Liste”ubersetzt“).
• a1 Frank • a2 Tom • an Karin
Array B[0 . .m − 1] von m Listen:
0: • 0 Gerd
1: • 1 Louis • 1 Tom
...
i : • i Karin • i Frank • · · ·
...
m − 1: •
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 5 / 21
Eingabeliste:
a5 2 a 5 b 3 a 1 a
1 b 6 a 5 c
A:
b2
Nach Transport in das Listenarray:
5 c 5 b
1 b
b2
1 a
2 a
a5
a
1:
2:
3:
5:
6:
4:
3 a
0:B:
6
NB: Identische Schlussel in umgekehrter Reihenfolge.Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 6 / 21
Listenarray:
5 c 5 b
1 b
b2
1 a
2 a
a5
a
1:
2:
3:
5:
6:
4:
3 a
0:B:
6
Nach Auslesen:
A:
1 b 2 a b2 3 a
5 b 5 c
1 a a5
6 a
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 7 / 21
Bucketsort (Fachsortieren)
1 Bearbeite die Elemente der Liste A nacheinander.
Fuge das Listenelement vorn in Liste B[i ] ein.
NB: Die Reihenfolge von Elementen mit demselben Schlussel wirdumgedreht.
2 Bearbeite die Listen B[m − 1], B[m − 2], . . . B[1], B[0] in dieser(absteigenden) Reihenfolge.
Fur i : lies B[i ] von vorn nach hinten.Fuge das Element vorn in die Ausgabeliste ein.
NB: Die Reihenfolge wird erneut umgedreht ⇒ ZweimaligesUmdrehen ⇒ Stabilitat
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 8 / 21
Bucketsort (Fachsortieren)
Korrektheit: klar.
Laufzeit:
Anlegen von B: O(1)
Initialisieren mit nil-Zeigern: Θ(m).
Verteilen auf die Listen: Θ(n)
Zusammenfugen: Θ(m) + Θ(n)
(Jeden Listenanfang ansehen!)
Gesamt: Θ(m + n).
Linearzeit und linearer Platz, falls m ≤ cn, c konstant.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 9 / 21
Bucketsort (Fachsortieren)
Alternative
Bei B[i ]-Listen Endezeiger benutzen, hinten anfugen.
In (2): Teillisten konkatenieren.
Vorteil: in Phase (2) O(m) Zeigerbewegungen, Zeit O(m)
Nachteil: Zusatzlicher Speicherplatz O(m) fur Endezeiger.
Gunstig insbesondere wenn m ≪ n ist.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 10 / 21
Satz (Bucketsort)
n Objekte mit Schlusseln aus [m] konnen in Zeit Θ(n + m) und mitZusatzplatz Θ(n + m) sortiert werden.
Wenn die Eingabe als lineare Liste gegeben ist, genugt zusatzlicher Platzfur m Zeiger.
Das Sortierverfahren ist stabil.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 11 / 21
Erweiterungen
Frage
Was soll man tun, wenn die Anzahl der Schlussel deutlich großer als n ist?
Antwort: Radixsort (oder Mehrphasen-Bucketsort)
Das verfahren ist in verschiedenen Situationen anwendbar:
Die Schlussel haben die Form x = (x1, . . . , xk) ∈ Uk , U = [m], m ≤ n.
Lexikographische Sortierung, d.h.
(x1, . . . , xk) < (y1, . . . , yk)
⇐⇒ ∃j , 1 ≤ j ≤ k : x1 = y1 ∧ . . . ∧ xj−1 = yj−1 ∧ xj < yj
Schlussel x in U ⊆ {0, 1, . . . ,mk − 1}, m ≤ n(nach Ziffern in m-adischer Darstellung)
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 12 / 21
Erweiterungen
k (moglicherweise verschiedene) Universen (U1, <1), . . . , (Uk , <k)
Schlussel x = (x1, . . . , xk) ∈ U1 × · · · × Uk
Beispiele:Daten: {1, . . . , 31} × {1, . . . , 12} × {1801, . . . , 2090}Spielkarten: {♦,♥,♠,♣} × {2, . . . , 10,Bube,Dame,Konig,As}
Lexikographische Ordnung.
Σ<∞ mit lexikographischer Ordnung (verschiedene Schlussellangen).Dabei: Sigma ist Alphabet (z.B. ASCII-Alphabet).
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 13 / 21
Radixsort
Wir betrachten Schlussel der Form x = (x1, . . . , xk) ∈ Uk , U = [m].
Idee
Sortiere k-mal mittels Bucketsort
und zwar gemaß der Komponenten in Reihenfolge k, k − 1, . . . , 1(d.h. die
”am wenigsten signifikante“ Komponente zuerst)
Eingabe: Liste A: Eintrage mit Schlusseln (x1, . . . , xk) aus [m]k .
Methode: Fur l = k, k − 1, . . . , 1 tue:sortiere A mittels Bucketsort fur U = [m]benutze aus Schlussel (x1, . . . , xk) den Wert xl als Sortierschlussel
Zeit insgesamt: Θ(k · (n + m))Zusatzplatz: Array mit m Zeigern.(Falls Eingabe in Arrayform: Zusatzplatz Θ(m + n).)
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 14 / 21
Radixsort - Ein Beispiel
U = {A,B,C,D}
Eingabe A:
Nach Runde l = 3:
Nach Runde l = 2:
Nach Runde l = 1:
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 15 / 21
Radixsort
Satz (Radixsort)
Der skizzierte Algorithmus Radixsort sortiert n Objekte mit Schlusseln aus[m]k in Zeit Θ(k(n + m)) und Platz Θ(m) (bzw. Θ(n + m) fur Arrays).
Das Verfahren ist stabil.
Beweis (Skizze)
Wir beweisen nur die Korrektheit.
Man zeigt durch Induktion uber l = k, k − 1, . . . , 1 die folgendeSchleifeninvariante:
Nach Schleifendurchlauf fur l ist die Liste A gemaß den Teilschlusseln(xl , xl+1, . . . , xk) ∈ [m]k−l+1 lexikographisch sortiert.
Fur den Induktionsschritt l + 1 → l benutzt man, dass (das einfache)Bucketsort stabil ist, und daher die schon hergestellte Ordnung bezuglichder weniger signifikanten Komponenten nicht zerstort wird.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 16 / 21
Die anderen Situationen
Das Verfahren fur U1 × · · · × Uk (Situation 3) ist im wesentlichendasselbe, nur benotigt man verschiedene B-Arrays (oder Arrayabschnitte)in den einzelnen Bucketsort-Durchgangen.
Zeit: O(kn + |U1| + · · · + |Uk |)
Platz: O(n + max1≤i≤k |Ui |).
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 17 / 21
Sortierung mittels m-adischer Darstellung
Zur zweiten Situation Die Schlussel sind Zahlen in {0, 1, . . . ,mk − 1}:
Idee: Reprasentiere Zahlen in m-adischer Darstellung (mit k Ziffern) undwende Radixsort ziffernweise an.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 18 / 21
Sortierung mittels m-adischer Darstellung - Ein Beispiel
Sei m = 10 (d.h. Dezimaldarstellung)
�� �� �� �� �� ��
����
����
����
����
����
����
����
����
����
����
����
����
436 617 729
l
=3l
531 729 617 312 425 436
=1l
=2
531 312 425 436 617 729
312 617 425 729 531 436
312 425 531
So kleine m sind nicht typisch.
Sinnvoll: m ≈ n, m Zweierpotenz.
Dann ist eine”Ziffer“ xl ein Segment der Binardarstellung von x , die leicht
aus x zu extrahieren ist.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 19 / 21
Radixsort
Satz (Radixsort)
Radixsort sortiert n Objekte mit Schlusseln aus [mk ] in Zeit Θ(k(n + m))und Platz Θ(m) (bzw. Θ(n + m) fur Arrays).
Das Verfahren ist stabil.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 20 / 21
Sortierung von Strings
n Strings a1, . . . , an mit Buchstaben aus Σ konnen in
Zeit O(L + |Σ| · lmax) und (Zusatz-)Platz O(n + |Σ| + lmax)
sortiert werden, wobei L = |a1| + · · · + |an| die Summe der Langen allerStrings und lmax = max{|a1|, . . . , |an|} die Lange des langsten
Eingabestrings ist.
Beweis: Modifikation von Bucketsort, siehe Literatur.
Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen 4.7.2007 21 / 21
Top Related