Algo rithm en und D atenstruk turen
9. V o rlesung
Martin D ie tz fe lb in ge r
6. J u n i 2005
F G K T u E A , T U Ilm e n a u A u D – 06.06.2005
Lineares SondierenT :
(4)Januar
(5)Februar
(8)Maerz
April (8)
(12)Mai
(4)Juni
(2)Juli
(10)August
(6)September
(10)Oktober
(12)November
Dezember (3)
10:
0:1:2:3:4:5:6:7:8:9:
11:12:
FG KTuEA, TU Ilmenau AuD – 06.06.2005 1
Prop osition
Bei linearem S ond ieren in einer Tabelle d er Groß e m mit
S c h lusselmenge S = {x1, . . . ,xn} gilt, mit α = n/m:
Die erw artete (nac h (UF∗)) Anzah l von S c h lusselvergleic h en
bei erfolgloser Suche nach y /∈ S ist
≈1
2
(
1 +1
(1 − α)2
)
.
Die erw artete (nac h (UF∗)) mittlere (uber x1, . . . ,xn) Anzah l
von S c h lusselvergleic h en bei erfolgreicher Suche nach y ∈ S
ist
≈1
2
(
1 +1
1 − α
)
.
N ur von α, nicht von n, m abhangig!
FG KTuEA, TU Ilmenau AuD – 06.06.2005 2
erfolgloserfolgreich
Lineares SondierenAnzahl Vergleiche
0
4080
120160200
0.4 0.5 0.6 0.7 0.8 0.9 1α
FG KTuEA, TU Ilmenau AuD – 06.06.2005 3
Verdoppelungsstrategie bei linearem Sondieren:
V erdop p le die Tabelle, sobald der Auslastungsfaktor α = n /m
einen W ert von α0 ubersteigt — z.B. α0 = 0,75 oder α0 = 0,8.
E mpfehlung: Kombiniere lineares Sondieren mit einer guten
universellen H ashklasse.
Nicht auf die Z ufalligkeit von S vertrauen!
!!!
L ineares Sondieren p asst p erfekt zu C ache-Architekturen und
ist in der Praxis sehr schnell.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 4
Verallgemeinerung:”open addressing“
”G eschlossenes H ashing“ (man bleibt in T)
Fur jeden Schlussel x ∈ U gibt es eine
Sondierungsfolge h(x, 0), h(x, 1), h(x, 2), . . .
in [m].
Beim Einfugen von x und Suchen nach x w erden die Zellen
von T in dieser Reihenfolge untersucht . . .
. . . bis eine leere Zelle oder der Eintrag x gefunden w ird.
(Analog empty(m), in sert(x) und looku p(x) bei linearem
Sondieren.)
FG KTuEA, TU Ilmenau AuD – 06.06.2005 5
Gunstig:
(∗) h(x, 0), h(x, 1), h(x, 2), . . . , h(x, m−1) erreicht jede Zelle,
d.h.: (h(x, 0), h(x, 1), h(x, 2), . . . , h(x, m − 1))
ist eine Permutation von [m].
Wenn (∗) gilt und mindestens eine Zelle in T leer ist, dann
endet jede erfolglose Suche in einer leeren Zelle.
Bei linearem Sondieren: h(x, k) = (h(x) + k) m o d m.
Andere Folgen sind moglich, zum Beispiel . . .
FG KTuEA, TU Ilmenau AuD – 06.06.2005 6
Quadratisches Sondieren
h : U → [m] gewohnliche Hashfunktion.
h(x, 0) = h(x)
h(x, 1) = (h(x) + 1) mod m
h(x, 2) = (h(x) − 1) mod m
h(x, 3) = (h(x) + 4) mod m
h(x, 4) = (h(x) − 4) mod m
h(x, 5) = (h(x) + 9) mod m
h(x, 6) = (h(x) − 9) mod m...
h(x, k) =(
h(x) +
⌈
k
2
⌉2
· (−1)k+1
)
mod m.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 7
Ubung: Berechne die Folgenglieder inkrementell ohne
Multiplikationen.
. . . ja sogar ohne Divisionen (”. . . mod m“ ).
Idee 1:
n2 = 1 + 3 + 5 + 7 + . . . + (2n − 1).
Man erreicht die Quadratzahlen, indem man Inkremente
1, 3, 5, . . . addiert.
Man erreicht die negativen Quadratzahlen modulo m, indem
man (modulo m) Inkremente m− 1, m− 3, m− 5, . . . addiert.
Idee 2: Wenn 0 ≤ a < m,0 ≤ b ≤ m, dann ist a + b mod m
einer der beiden Werte a + b und (a + b) − m.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 8
Losung:
(∗ Bei”pause“ wird die Abarbeitung der Prozedur unterbro-
chen, der Zustand aufbewahrt; beim nachsten Aufruf wird die
Verarbeitung an der Unterbrechungsstelle fortgefuhrt. ∗)
Quadratic Probe Sequence(x)
(1) h ← h(x); output h; pause;
(2) incr ← 1; n incr ← m− 1;
(3) f ← h; g ← h;
(4) for j from 1 to (m− 1)/2 do
(7) f ← (f + incr); ff← f−m; if ff ≥ 0 then f← ff;
(6) output f; pause;
(7) g ← (g + n incr); gg← g−m; if gg ≥ 0 then g← gg;
(8) output g; pause;
(9) incr ← (incr + 2); n incr ← (n incr− 2);
FG KTuEA, TU Ilmenau AuD – 06.06.2005 9
Fakt
Ist m Primzahl, m = 4j + 3 fur ein j ∈ N,
dann ist {h(x, k) | 0 ≤ k < m} = [m], d.h. (∗) gilt.
(Beweis: Elementare Zahlentheorie)
Beispiel : m = 19, h(x) = 0, liefert Sondierungsfolge
0, 1, 18, 4, 15, 9, 10, 16, 3, 6, 13, 17, 2, 11, 8, 7, 12, 5, 14.
M itteilung:
Quadratisches Sondieren verhalt sich der Erfahrung nach
sehr gut. (h gut verteilend, Auslastungsfaktor ≤ 0,9.)
FG KTuEA, TU Ilmenau AuD – 06.06.2005 10
Doppel-Hashing
Benutze zwei (unabhangig berechnete) Hashfunktionen
h1 : U → [m]
h2 : U → [m− 1]
und setze, fur k = 0, 1, 2, . . .:
h(x, k) := (h1(x) + k · (1 + h2(x))) mod m.
Ubung: Berechne die Folgenglieder inkrementell ohne Multi-
plikationen und Divisionen (”. . . mod m“).
FG KTuEA, TU Ilmenau AuD – 06.06.2005 11
Losung:
(∗ Bei”pause“ wird die Abarbeitung der Prozedur unter-
brochen, Zustand aufbewahrt, bis zum nachsten Aufruf; die
Verarbeitung wird an der Unterbrechungsstelle fortgefuhrt. ∗)
Double Hashing Sequence(x)
(1) h ← h1(x); output h; pause;
(2) incr ← 1 + h2(x);
(3) for j from 1 to m− 1 do
(4) h← h + incr; hh← h−m; if hh ≥ 0 then h← hh;
(5) output h; pause;
FG KTuEA, TU Ilmenau AuD – 06.06.2005 12
Proposition
Wenn m Primzahl ist, dann gilt fur Doppel-Hashing:
(∗) {h(x, k) | 0 ≤ k < m} = [m].
Beweis: Sei z = 1 + h2(x). Dann: 1 ≤ z ≤ m− 1.
Wenn h(x, k) = h(x, l), dann ist
(h1(x) + k · z) mod m = (h1(x) + l · z) mod m,
also (l − k) · z ≡ 0 (mod m), d.h. m teilt (l − k) · z.
Da m Primzahl ist und 1 ≤ z < m, teilt m die Zahl l − k,
also ist k = l, weil 0 ≤ k, l < m. �
FG KTuEA, TU Ilmenau AuD – 06.06.2005 13
Kann beweisen: Wenn h1(x), h2(x), x ∈ S, rein zufallig sind,
verhalt sich Doppel-Hashing sehr gut, namlich im wesentli-
chen wie”Uniformes Sondieren“.
”Uniformes Sondieren“/
”Ideales Hashing“
Dies ist keine Methode,
sondern eine W ahrscheinlichkeitsannahme:
(h(x, 0), h(x, 1), . . . , h(x, m− 1)) ist
eine rein zufallige Permutation von [m].
(Erinnerung: Es gibt m! verschiedene Permutationen von [m].)
FG KTuEA, TU Ilmenau AuD – 06.06.2005 14
Effekt: x1, . . . , xn seien gespeichert; y kommt neu hinzu.
Ganz egal was die Hashwerte von x1, . . . , xn und was
h(y, 0), . . . , h(y, k − 1) sind:
h(y, k) nimmt jeden Wert
i ∈ {0, . . . , m− 1} − {h(y, 0), . . . , h(y, k − 1)}
mit derselben Wahrscheinlichkeit 1/(m− k) an.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 15
n: Anzahl der Schlussel in T[0 . . m− 1]; α = nm.
T ′
n,m := Zahl der Schlusselvergleiche bei erfolgloser Suche.
C ′
n,m := E(T ′
n,m).
Tn,m := Zahl der Schlusselvergleiche bei erfolgreicher Suche,
gemittelt uber x1, . . . , xn.
Cn,m := E(Tn,m).
Satz
Unter der Annahme”Uniformes Hashing“ gilt:
(i) C ′
n,m = m+1
m+1−n = 1
1− nm+1
.
Dies ist < 1
1−n/ m = 1
1−α.
Wenn α fest und m→∞, dann gilt C ′
n,m→1
1−α.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 16
Beweis: Bei der erfolglosen Suche gibt es 2 Falle:
1. F a ll : T[h(y, 0)] ist leer.
Wahrscheinlichkeit: m−nm Kosten: 1.
2. F a ll : T[h(y, 0)] ist nicht leer.
Wahrscheinlichkeit: nm Kosten: 1 + C′
m−1,n−1.
(Suche in m− 1 Platzen, von denen n− 1 besetzt sind.)
R ekursionsformel, fur 0 ≤ n < m:
C ′
m,n =
{
1 , falls n = 0m−n
m + nm · (1 + C ′
m−1,n−1) , falls n ≥ 1.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 17
C ′
m,0 = 1 ;
C ′
m,1 =m− 1
m+
1
m· (1 + 1) =
m + 1
m;
C ′
m,2 =m− 2
m+
2
m· (1 +
m
m− 1) = 1 +
2
m− 1=
m + 1
m− 1;
C ′
m,3 =m− 3
m+
3
m· (1 +
m
m− 2) = 1 +
3
m− 2=
m + 1
m− 2;
und so weiter. Ergibt:
C′
m,n=
m + 1
m + 1 − n.
Formaler Beweis d u rc h vollstan d ige In d u ktion . �
FG K T u E A , T U Ilmen au A u D – 06.06.2005 18
Satz
Unter der Annahme”Uniformes H ashing“ gilt b ei α = n/m:
(i) C ′
n,m = m+1
m+1−n = 1
1− nm+1
.
Dies ist < 1
1−n/ m = 1
1−α.
W enn α fest und m → ∞, dann gilt C ′
n,m →1
1−α.
(ii) Fur
Tn,m = m ittlere (ub er S) Anzahl getesteter Tab ellenp latze
b ei erfolgreicher Suche:
Cn,m = E(Tn,m) < 1
α · ln ( 1
1−α).
FG KTuEA, TU Ilmenau AuD – 06.06.2005 19
Beweis: Suchaufwand fur xi = Einfugeaufwand fur xi.
Mittelung uber C ′m,0,C
′m,1, . . . ,C
′m,n−1:
Cn,m =1
n·
∑
1≤i≤n
m + 1
m + 1 − (i − 1)
=m + 1
n·
(
1
m + 1+
1
m+ · · · +
1
m + 1 − (n − 1)
)
=m + 1
n· (Hm+1 − Hm+1−n)
mit Hk = 1 + 1
2+ · · ·+ 1
k. — L eicht zu sehen (Untersumme!):
Hm+1 − Hm+1−n ≤∫ m+1
m+1−nd tt =
ln(m + 1) − ln(m + 1 − n) = ln(
m+1
m+1−n
)
.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 20
Also:
Cn,m ≤m + 1
n· ln
(
1
1 −n
m+1
)
<m
n· ln
(
1
1 −nm
)
.
Fur α = n/m, α fest, n → ∞, ist Cn,m ≈1
α ln( 1
1−α).
�
FG KTuEA, TU Ilmenau AuD – 06.06.2005 21
erfolgloserfolgreich
Uniformes HashingAnzahl Vergleiche
0
48
121620
0.4 0.5 0.6 0.7 0.8 0.9 1α
FG KTuEA, TU Ilmenau AuD – 06.06.2005 22
Loschungen? Problem: Z.B. Quadratisches Sondieren
Suchfolge”Dezember“ mit h(Dezember) = 7: 7, 8, 6, 11.
T : 0:1:2:3:4:5:6:7:8:9:
10:11:12:
Januar (8)Februar (9)
Maerz (12)
April (12)
Mai (3)
Juni (8)Juli (6)
August (1)
September (10)
Oktober (1)
November (3)
Dezember (7)
Losche”J uli“!
FG KTuEA, TU Ilmenau AuD – 06.06.2005 23
Loschungen? Problem: Z.B. Quadratisches Sondieren
Suchfolge”Dezember“ mit h(Dezember) = 7: 7, 8, 6, 11.
T :
!!!
0:1:2:3:4:5:6:7:8:9:
10:11:12:
Januar (8)Februar (9)
Maerz (12)
April (12)
Mai (3)
Juni (8)
August (1)
September (10)
(1)
November (3)
Dezember (7)
Oktober
Losche”Juli“!
”Dezember“ wird nicht mehr gefunden.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 24
Ausw eg: Zelle hat Statusvariable status (voll, leer, gelosc h t).
Loschen: Zelle nicht auf leer, sondern auf gelosc h t setzen.
Suchen: Immer bis zur ersten leeren Zelle gehen.
Zellen, die gelosc h t sind, durfen mit einem neuen Schlussel
uberschrieben werden.
Ub erlauf tritt spatestens ein, wenn die letzte leere Zelle
beschrieben werden wurde.
Sinnvoller: Uberlauf tritt ein, wenn die Anzahl der vollen
und gelosc h ten Zellen zusammen eine feste Schranke bound
uberschreitet.
Z.B. m− 1 oder α0m, α0 passend zum Sondierungsverfahren.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 25
empty(m):
Lege leeres Array T[0 . . m − 1] an.
(∗ Mogliche Eintrage:
(x, r, voll) oder (−,−, leer) oder (?, ?, geloscht). ∗)
Initialisiere alle Zellen T[i] mit (−,−, leer).
Initialisiere load mit 0. (Zahlt nicht-leere Zellen.)
Initialisiere bound (maximal m − 1).
FG KTuEA, TU Ilmenau AuD – 06.06.2005 26
looku p(x):
Finde erstes j in der Indexfolge h(x, 0), h(x, 1), h(x, 2), . . .
mit T[j].status = leer
oder (T[j].status = voll und T[j].key = x);
Falls T[j].status = leer : return n ot fou n d ;
Sonst: return T[j].data.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 27
delete(x):
Finde erstes j in der Indexfolge h(x, 0), h(x, 1), h(x, 2), . . .
mit T[j].status = leer
oder (T[j].status = voll und T[j].key = x);
Falls T[j].status = leer : tue nichts;
(∗ Warnung: not found ∗)
Sonst: T[j].status← geloscht;
FG KTuEA, TU Ilmenau AuD – 06.06.2005 28
insert(x, r):
Finde erstes j in der Indexfolge h(x, 0), h(x, 1), h(x, 2), . . .
mit T[j].status = leer
oder (T[j].status = voll und T[j].key = x);
Merke dabei das erste l in dieser Folge,
das T[l].status ∈ {geloscht, leer} erfullt;
F all 1: T[j].status = voll : T[j].data← r; (∗Update ∗)
F all 2: T[l].status = geloscht: T[l]← (x, r, voll);
(∗ uberschreibe geloschtes Feld ∗)
F all 3: T[l].status = leer : (∗ j = l, neue Zelle ∗)
if load + 1 > bound then”Uberlaufbehandlung“
else load← load + 1; T[j]← (x, r, voll);
FG KTuEA, TU Ilmenau AuD – 06.06.2005 29
Uberlaufbehandlung, V erdopplung:
Sinnvoll: Uberlauf tritt ein, wenn der Anteil der vollen und
geloschten Zellen zusammen eine Schranke α0m uberschreitet.
(α0 passend zum Sondierungsverfahren festlegen.)
Zahle die vollen Zellen: Anzahl v.
Falls v + 1 > α1m fur (z.B.) α1 = 0.8α0, verdopple Tabel-
lengroß e.
Trage Schlussel neu in die groß ere Tabelle ein.
Sonst: Trage alle Schlussel neu in die alte Tabelle T ein.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 30
Trick fur neues Eintragen:
(Ohne zusatzlichen Platz. N ur fur Spezialisten!)
1) Fur i = 0, 1, . . . , m− 1 tue folgendes:
Wenn T[i].status = voll, setze T[i].status ← a lt.
Wenn T[i].status = geloscht, setze T[i].status ← leer.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 31
2) Fur i = 0, 1, . . . , m− 1 tue folgendes:
Wenn T[i].status = alt,
dann setze (x, r)← (T[i].key, T[i].data),
setze T[i].status = leer,
und fuge (x, r) ein – mit folgender Besonderheit:
Eine mit alt markierte Zelle wird wie leer behandelt,
der dort enthaltene Eintrag (x′, r′) wird durch (x, r, voll) ver-
drangt;
(x′, r′)wird sofort anschließend mit demselben V erfahren ein-
gefugt.
Dies setzt sich fort, bis eine Einfugung in eine mit leer mar-
kierte Zelle erfolgt.
Dann fahrt man mit der Abarbeitung der i-Schleife fort.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 32
Sortieren
G egeben:
Universum U mit totaler Ordnung <.
Sortierproblem, abstrakt: Siehe Vorlesung 1.
G egeben:
Universum U mit totaler Ordnung <.
Elemente: (Sortier-)Schlussel.
Gegeben: Folge (a1, . . . , an) in U .
Aufgabe: Arrangiere so um zu (b1, . . . , bn), dass b1 ≤ · · · ≤ bn.
O der: Berechne eine Permutation π von {1, . . . , n}, die
(a1, . . . , an) sortiert, d.h. mit bi = aπ(i), 1 ≤ i ≤ n, gilt
b1 ≤ · · · bn.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 33
Sortiermethoden, schon gesehen:
Straight Insertion Sort, B ubble Sort, Shell Sort (GdP1)
FG KTuEA, TU Ilmenau AuD – 06.06.2005 34
Sortieren
Viele Varianten:
• Eintrage enthalten neben Schlussel weitere Daten (data);
Eintrag/Item: mit Sortierschlussel (key) versehenes Objekt.
• Eintrage sind nur Zeiger/Referenzen auf Datensatze (mit
Schlusseln)
Bei Vorkommen gleicher Sortierschlussel:
Sortierverfahren heißt stabil, wenn Objekte mit identischen
Schlusseln in der Ausgabe in derselben Reihenfolge stehen wie
in der Eingabe.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 35
Sortieren
x
π(2) π(5) π(8) π(1)
4
RA
5
OR
9
HM
4
LG IT
8
a1 a2 a3 an
1
SO
1
RT IE
1
1
SO IE
11
RT
4
RA
4
LG
5
OR
9
HM US
10
IT
8
Inform:
Item:
Schlüssel "key"
"data"dat
"Stabilität"
US
10
FG KTuEA, TU Ilmenau AuD – 06.06.2005 36
Array-Sortieren
Eingabe:
Array A[1 . . n] mit Eintragen a1, . . . , an ∈ U .
Aufgabe: Permutiere die Eintrage von A[1 . . n] so, dass
schließlich
A[1] ≤ A[2] ≤ A[3] ≤ . . . ≤ A[n].
Alternative: Berechne eine Permutation π von {1, . . . , n},
die A[1 . . n] sortiert.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 37
Array-Sortieren
Bemerkung: Permutationssortieren und gewohnliches Sortie-
ren sind praktisch dasselbe Problem.
Wenn man das eine gelost hat, kann man das andere in
zusatzlicher Zeit O(n) losen.
1) Gegeben sei eine Permutation π von {1, . . . , n},
die A[1 . . n] sortiert.
Transportiere A[i] nach B[π(i)], i = 1, . . . , n.
Dann kopiere B[i] nach A[i], i = 1, . . . , n.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 38
Array-Sortieren
Bemerkung: Permutationssortieren und gewohnliches Sortie-
ren sind praktisch dasselbe Problem.
Wenn man das eine losen kann, kann man das andere in
zusatzlicher Zeit O(n) losen.
2) Gegeben sei ein gewohnliches Sortierverfahren S.
Eingabe: A[1 . . n].
Setze B[i] ← (B[i],i), fur 1 ≤ i ≤ n.
Zweite Komponente: index.
Sortiere B[1 . . n] mittels S, Sortierschlussel: erste
Komponente.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 39
Array-Sortieren
Beispiel :
A: 4 6 2 3 9 12 6 4 0
B: 4 6 2 3 9 12 6 4 0
index: 1 2 3 4 5 6 7 8 9
B, sortiert: 0 2 3 4 4 6 6 9 12
index: 9 3 4 1 8 2 7 5 6
π: 4 6 2 3 8 9 7 5 1
π(B[i].index)← i, fur 1 ≤ i ≤ n.
Verifiziere Korrektheit!
FG KTuEA, TU Ilmenau AuD – 06.06.2005 40
Listen-Sortieren
Eingabe: Liste L mit Eintragen a1, . . . , an ∈ U .
Aufgabe: Permutiere die Listenelemente in L so, dass schließ-
lich die Eintrage in L aufsteigend sortiert sind.
∗∗ ∗ ∗∗... ...
... ... ...7 3 1 6
1 3 6 7
β:α: γ: δ:
α:γ: δ:...
...
β:...
Nur Zeiger (∗) andern sich. Vorteil: Kein Datentransport.
Kosten: Platz fur Zeiger.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 41
Maß zahlen fur Sortieralgorithmen: In Abhangigkeit von n
fragen wir nach:
1. Laufzeit (in O-Notation);
2. Anzahl der Vergleiche
A[i] < A[j] bzw. A[i] ≤ A[j]
(”wesentliche V ergleiche“);
3. Anzahl der Datenverschiebungen oder Kopiervorgange
(wichtig bei sehr umfangreichen Objekten);
4. der neb en A (und pi) benotigte Speicherplatz;
FG KTuEA, TU Ilmenau AuD – 06.06.2005 42
wenn dieser nur O(1), also von n unabhangig, ist:
Algorithmus arbeitet”in situ“.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 43
Mergesort - Sortieren durch Mischen
(engl. merge = vermengen, reißverschlussartig zusam-
menfugen)
Algorithmenparadigma oder -schema:
”divide-and-conquer“ (D -A-C )
(”teile und herrsche“)
FG KTuEA, TU Ilmenau AuD – 06.06.2005 44
Vorgehen eines D-A-C-Algorithmus A fur Berechnungsproblem
P auf Instanz x ∈ I :
0. Trivialitatstest: Wenn P fur x einfach direkt zu losen ist,
tue dies.
Sonst:
1. Teile: Zerteile x in (zwei oder mehr) Stucke x′1, x
′2, . . . , x
′b.
Wesentlich fur Korrektheit/Terminierung: Jedes der Stucke ist
”kleiner“ als x.
2. R ekursion: Lose P fur x′1, x
′2, . . . , x
′b, durch rekursive
Verwendung von A.
3. Kombiniere: Baue aus den Teillosungen fur die Stucke
x′1, x
′2, . . . , x
′b eine Losung fur x auf.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 45
Mergesort ist konkreter D-A-C-Algorithmus zum Sortieren
eines Arrays A[1 . . n]:
0. Trivialitatstest: Wenn n ≤ 1, ist nichts zu tun.
1. Teile: Zerlege A in zwei gleichgroße Teilarrays A1 und A2.
2. Rekursion: Sortiere A1 und A2 durch rekursive Aufrufe von
Mergesort.
3. Kombiniere: Konstruiere aus den sortierten Teilarrays aus
2. ein sortiertes Array, das alle Eintrage enthalt.
Technisch gunstiger:
Mergesort sortiert ein Teilarray A[a . . b].
FG KTuEA, TU Ilmenau AuD – 06.06.2005 46
Gegeben sei eine Prozedur merge(a, m, b), 1 ≤ a ≤ m < b ≤
n
d ie folge n d e s tu t:
V ora u sse tz u n g: A[a ..m] u n d A[m + 1 . .b] sin d sortie rt.
Re su lta t: A[a ..b] ist sortie rt.
A n sa tz : Qu a sip a ra lle le r D u rc h la u f d u rc h d ie T e ila rra ys.
D e ta ils: Siehe V o rlesu ng G dP 1.
A u fw a n d : ≤ b − a S c h lu sse lve rgle ic h e , Ze it Θ (b − a + 1).
F G K T u E A , T U Ilm e n a u A u D – 06.06.2005 47
Algorithm us m ergeSort(a, b)
(1) if b− a > 1 then
(2) m ← (b− a) div 2;
(3) m ergeSort(a, m);
(4) m ergeSort(m + 1, b);
(5) m erge(a, m, b).
Terminierung, Korrektheit: Induktion ub er k = b− a + 1:
Klar falls a = b.
Falls a < b: Teilarrays hab en L angen d(b − a + 1)/2e und
b(b− a + 1)/2c – b eides < (b− a + 1).
N ach I.V. liefern die rekursiven Aufrufe in (3) und (4) das
korrekte Resultat.
N ach Annahme ub er m erge sortiert dann Zeile (5) korrekt.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 48
Zeitanalyse:
1) Die Kosten (Rechenzeit) sind proportional zur Anzahl der
durchgefuhrten Vergleiche.
2) W ir fi nden eine obere Schranke CMS(k) fur die Anzahl der
Vergleiche, die mergeSort(a, b) ausfuhrt, auf k = b − a + 1
Schlusseln.
R ek ursionsungleichung:
CMS(1) = 0;
CMS(k) ≤ k − 1︸ ︷︷ ︸
m erge
+CMS(bk/2c) + CMS(dk/2e),
fur k ≥ 2.
Resultierende Schranken:
FG KTuEA, TU Ilmenau AuD – 06.06.2005 49
k 1 2 3 4 5 6 7 8 9 10 11
CMS(k) ≤ 0 1 3 5 8 11 14 17 21 25 29
Diff .: dlog ke − 1 2 2 3 3 3 3 4 4 4
Kann zeigen: CMS(k) ≤∑
1≤i≤kdlog ie.
Exakte B erechnung der Summe ist moglich. Liefert:
CMS(k) ≤ dlog ke · k − 2dlo g ke + 1.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 50
”E ntw icklungsmethode“ : Losung fur den Fall k = 2`.
CMS(k)
= CMS(2`)
≤ 2` + 2 · CMS(2`−1)
≤ 2` + 2 · 2`−1 + 4 · CMS(2`−2)
≤ 3 · 2` + 23 · CMS(2`−3)
≤ . . .
≤ j · 2` + 2j · CMS(2`−j)
≤ . . .
≤ ` · 2` + 2` · CMS(2`−`)
= k log k.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 51
Alternative: Direkte Analyse, Induktionsbeweis.
TMS(k) seien die Kosten eines Aufrufs mergeSort(a, b), auf
k = b− a + 1 Schlusseln, im schlechtesten Fall.
Es gibt Konstante c > 0 und d > 0 mit
TMS(1) ≤ c;
TMS(k) ≤ d · k + TMS(bk/2c) + TMS(dk/2e), fur k ≥ 2.
Trick: Losung mit P arametern A, B raten; der Induktionsbe-
weis liefert die richtigen P arameter.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 52
Behauptung: TMS(k) ≤ A · k + Bk log k, fur alle k ≥ 1.
Beweis: Induktion uber k.
Interessant: Die genauen Werte A und B werden erst durch
die Rechnung ermittelt.
k = 1: TMS(1) ≤ c ≤ A · k, falls A ≥ c.
k ≥ 2:
FG KTuEA, TU Ilmenau AuD – 06.06.2005 53
TMS(k) ≤ d · k + TMS(bk/2c) + TMS(dk/2e)
I.V.
≤ d · k + Abk/2c+ Bbk/2c logbk/2c
+ Adk/2e+ Bdk/2e logdk/2e
≤ d · k + Ak + Bk logdk/2e
≤ d · k + Ak + Bk(log k + 0.6− 1)
denn: k ≥ 3⇒ log(k + 1) ≤ log k + 0.6. Also:
TMS(k) ≤ (d + A− 0.4B)k + Bk log k.
Wenn wir A = c und B = d/0.4 wahlen, funktioniert der
Induktionsbeweis.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 54
Analog zeigt man:
TMS(k) ≥ A′k+B′k log k, fur gewisse Konstanten A′, B′ > 0.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 55
Satz
Die Anwendung des Mergesort-Algorithmus, d. h. der Auf-
ruf mergeSort(1, n), auf einem Array von n Objekten
benotigt hochstens n log n Vergleiche und hat Kosten (Lauf-
zeit) O(n log n).
M ergesort ist stabil (wenn merge entsprechend eingestellt
wird).
M ergesort benotigt zusatzlichen Speicherplatz,
ist also nicht”in situ“ ,
(n/2 Arrayeintrage, wenn man weiter keine Vorkehrungen
trifft).
FG KTuEA, TU Ilmenau AuD – 06.06.2005 56
Variante 1: (Standardmaß ig angewandt)
Ziel: Uberproportional hohen Zeitaufwand fur rekursive Aufru-
fe bei kleinen Teilarrays vermeiden.
Strategie: In mergeSort kleine Teilarrays
(b−a ≤ ∆, ∆ ≥ 1 konstant) durch (z. B.) Straight-Insertion-
Sort sortieren.
Das optimale ∆ auf einer konkreten Maschine kann nur ein
Experiment liefern.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 57
Variante 2: Sortieren von (linearen) Listen.
Wenn die Liste L nur ein Element enthalt, ist nichts zu tun.
Andernfalls wird die Liste in 2 Teillisten L1, L2 der halben
Lange zerteilt.
(Durchlaufe L, hange die Eintrage abwechselnd an L1 und L2
an.
Kosten: Θ(Lange von L).)
Auf L1 und L2 wird der Algorithmus rekursiv angewendet.
Dann werden die beiden nun sortierten Listen gemischt.
(Vgl. Ubung zu dunn besetzten Matrizen.)
Laufzeitanalyse: Identisch zum Obigen.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 58
Variante 3: Iteratives Mergesort,”b ottom-up“
Idee: Arbeite in Runden i = 1, 2, 3, . . . , dlog ne.
Vor Runde i: Teilarrays A[(l− 1)2i + 1 . . . l2i] sind aufsteigend
sortiert.
(Eventuell ist das am weitesten rechts stehende Teilarray un-
vollstandig.)
In Runde i fuhre
merge((l − 2)2i + 1, (l − 1)2i, l2i) aus,
fur l = 2, 4, . . . , 2bn/2i+1c.
(Mogliche Sonderrolle fur unvollstandige Teilarrays ganz
rechts.)
FG KTuEA, TU Ilmenau AuD – 06.06.2005 59
Beisp iel :
7 2 9 6 3 1 6 10 2 17 12 6 2 7 4
6 10 2 17 2 7 42 7 6 9 1 3 6 12
6 10 2 22 9 1 36 7 6 12 17 4 7
10 29766321 2 4 6 7 12 17
A:
C:
A:
C:
A:
Runde
1
2
4
3
1 2 2 2 3 4 6 6 7 7 9 10 17126
FG KTuEA, TU Ilmenau AuD – 06.06.2005 60
Trick, spart Kopierarbeit:
Benutze 2 Arrays, die in jeder Runde ihre Rolle wechseln.
Zeitverhalten von iterativem Mergesort:
wie bei rekursivem Mergesort.
Bei dieser Variante bietet sich noch eine alternative, einfache
Zeitanalyse an:
J ede Runde kostet offenbar Zeit Θ(n), und es gibt dlog ne
Runden: also ist die Gesamtzeit
Θ(ndlog ne) = Θ(n log n).
FG KTuEA, TU Ilmenau AuD – 06.06.2005 61
Variante 4: Mehrweg-Mergesort
Besonders in Kombination mit dem iterativen Verfahren inter-
essant ist die Moglichkeit, in einer merge-Runde nicht nur ein
Array, sondern 3, 4, oder mehr Teilarrays zusammenzumischen.
Beispiel :
1 7 9 13 2 5 7 9 3 6 6 10 2 4 11 12
Die nächsten gewählten Elemente:
C:
A:
aus 4 (Rest−)Arrays.
1 2 2 3 4 5 6 6 7 7
"9" aus 1.Teilarray,
4−way merge: wähle kleinstes Element
"9" aus 2. Teilarray, 10, 11, etc.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 62
Bei Cache-Architekturen oder Sortieren von Daten auf H inter-
grundspeichern (Platten) kann diese Variante Laufzeitvorteile
bringen, da die Anzahl der Cache- bzw. Seitenfehler (cache
m isses bzw. page faults) verringert wird.
Fruher: Sortieren von Daten auf Bandern.
Algorithmus der Wahl: Mergesort.
FG KTuEA, TU Ilmenau AuD – 06.06.2005 63