3. Sortieren - Universität Tübingen

Werbung
3. Sortieren
Beispiel für Analyse von Verfahren und gleichzeitig
„eine Art, Datenmengen zu verwalten“.
Sortieren: eine Folge so permutieren, dass sie aufsteigend
geordnet ist.
13,7,11
7,11,13
Motivation: 25% aller Rechnerzeit wird für Sortieren
verbraucht.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
1
3.1 Sortieren durch Auswahl:
Eingabe: 11,3,6,7,6,12
Ausgabe: 3,6,6,7,11,12
Jeweils Minimum suchen, ausgeben, streichen
1.) Wie repräsentieren wir Ein- und Ausgabefolgen?
Benutzen z.B. Felder A und B:
i-tes Ein- und Ausgabeelement in A[i] bzw. B[i].
2.) Was bedeutet es, eine Zahl zu streichen?
Benutzen weiteres Feld:
Rem: array [1...n] of boolean
Rem[i] = true bedeutet, dass A[i] durchgestrichen ist.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
2
3.) Wie bestimmen wir die Position des Minimums?
function Posofmin: integer;
var i, pos : integer
begin i ← 1;
while Rem[i] do i ← i+1;
pos ← i;
for i = 1 to n do
if (A[i] < A[pos]) and not Rem[i]
then pos ← i;
Posofmin ← pos;
end
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
3
Wenn wir nicht Zahlen sortieren, sondern beliebige
Elemente eines bestimmten Typs, so ersetzen wir
(A[i] < A[pos]) durch lessthan (A[i], A[pos]),
wobei
function lessthan (x,y : typ): boolean
geeignet definiert werden muss.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
4
Sortieren durch Auswahl
for i ← 1 to n do Rem[i] := false;
for i ← 1 to n do
begin j ← posmin;
B[i] ← A[j];
Rem[j] ← true
end;
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
5
Elegantere und platzeffizientere Lösung
86376
3|6 8 7 6
3 6|8 7 6
3 6 6|7 8
3 6 6 7|8
36678
for i ← 1 to n do
begin j ← posmin (i,n);
(* posmin liefert Minimum von A[i],...,A[n] *)
exchange (A[i], A[j]);
end;
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
6
3.2 Quicksort
(Sortieren durch Teilen)
Wende „Teile- und Beherrsche“-Prinzip an.
Eingabe: Feld S mit Werten x1, x2, ..., xn
Idee
1. Teile S-{x1} bzgl. x1 in 2 Mengen A,B
(Teile)
A = {xi | i ≥ 2 und xi ≤ x1 }, sei A = j
B = {xi | i ≥ 2 und xi > x1 }
Speichere A in S[1]...S[j]
x1 in S[j+1]
B in S[j+2]...S[n]
x1
A
j j+1
B
2. Wende Verfahren rekursiv auf A und B an.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
(Beherrsche)
7
Implementierung:
Füge S [0] = −∞ und S [n + 1] = +∞ zu S hinzu.
Dies erspart einige Tests.
Teil 1: Teile
i ← 2 ; j ← n ; k ← S[1] ;
repeat while S [i ] ≤ k do i ← i+1 ;
while S [ j ] > k do j ← j-1 ;
if i ≤ j then vertausche (S[i], S[j])
i ← i+1 ; j ← j-1 ;
fi
until i > j ;
Vertausche (S[1], S[j])
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
8
Analyse: Kosten = Anzahl der Vergleiche zwischen S[i]‘s.
Kosten im schlechtesten Fall:
Kosten eines Aufrufs Quicksort (l,r) sind
a) unmittelbare Kosten bei Teile-Schritt O(r-l+1) Vergleiche
b) Kosten der rekursiven Aufrufe
Sei QS(n) = max. Anzahl von Vergleichen, die Quicksort
an Feld der Länge n durchführt.
Es gilt:
QS (n ) = O(n) + max{ QS ( j − 1) + QS (n − j )}
424
3 1424
3
1≤ j ≤ n 1
QS (0) = QS (1) = 0.
Vorlesung Algorithmen (RN/MK/AZ)
rek. Aufruf für A
für B
WSI für Informatik, Universität Tübingen
9
Behauptung:
n
QS (n ) = ∑ i ≤
i=2
( )
1
n(n + 1) = O n 2
2
Beweis: durch Induktion
Bemerkung: An Eingabe 1, 2, 3, ..., n führt Quicksort
wirklich O(n2) Vergleiche durch. Obere Schranke
ist also scharf.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
10
Kosten im Mittel:
Annahmen:
1. Elemente von S sind paarweise verschieden.
2. Jede der n! möglichen Permutationen der Eingabe ist
gleich wahrscheinlich.
Damit können wir o.B.d.A. annehmen, dass die Schlüssel
die Zahlen 1, 2, ..., n sind und dass S[1] = k ist mit
Wahrscheinlichkeit 1/n für 1 ≤ k ≤ n.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
11
Dann müssen rekursiv Teilprobleme der Größe k-1 und
n-k gelöst werden.
Diese Teilprobleme sind wieder zufällige Folgen,
d.h. sie erfüllen Annahmen 1.) und 2.).
(Beweis: entfällt, siehe Literatur)
Sei QS (n ) die mittlere Anzahl der Vergleiche, die
Quicksort an einem Feld der Größe n durchführt.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
12
QS (0) = QS (1) = 0
(
)
und QS (n ) = n + " Erwartungswert QS ( A) + QS (B ) "
(
)
1 n
= n + ∑ QS (k − 1) + QS (n − k )
n k =1
2 n −1
= n + ∑ QS (k )
n k =0
n −1
n ⋅ QS (n ) = n 2 + 2∑ QS (k )
k =0
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
13
und
(n + 1)QS (n + 1) = (n + 1)
2
n
+ 2∑ QS (k )
k =0
Dann:
(n + 1)QS (n + 1) − nQS (n ) = (n + 1)2 − n 2 + 2QS (n )
= 2n + 1 + 2QS (n )
(n + 1)QS (n + 1) = 2n + 1 + (n + 2)QS (n )
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
14
⇒
n+2
QS (n + 1) ≤ 2 +
QS (n )
n +1
n+2
n +1
n

(2 + ...) 
= 2+
 2 +
2 +
n +1 
n 
n −1

2
2
 2

= 2 + (n + 2)
+ +
+ K + 1
 n +1 n n −1


1
1 
 1
= 21 + (n + 2)
+ + K +  .
2 
 n +1 n

Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
15
d.h.
n
1

 n 1 
QS (n ) ≤ 21 + (n + 1)∑  = 2 + 2(n + 1) ∑ − 1
i=2 i 

 i =1 i 
n
1
= 2 + 2(n + 1)∑ − 2(n + 1)
i =1 i
n
1
= 2(n + 1)∑ − 2n
i =1 i
≤ 2(n + 1)(1 + ln n ) − 2n
= O(n log n )
Satz: Die mittlere Laufzeit von Quicksort ist O(n log n).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
16
3.3 Heapsort
(Sortieren durch Auswahl)
Heap ist Datenstruktur, die folgende Operationen
unterstützt:
• function
Emptyheap : heap;
liefert Heap mit Wert ø.
• procedure
Insert (x: item, var h: heap);
verändert „Wert“ von h durch Einfügen von x
• function
Extractmin (var h: heap): item;
verändert Wert von h durch Streichen des Minimums
und liefert gestrichenes Element.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
17
Heapsort:
h ← Emptyheap;
for i = 1 to n
do Insert (A[i], h);
for i = 1 to n
do B[i] ← Extractmin (h);
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
18
Zur Realisierung von Heaps:
Ein binärer Baum ist entweder leer oder er besteht aus einem
Knoten, der Wurzel genannt wird, und einem rechten und
linken Teilbaum.
Bsp.:
u
v
w
x
u ist die Wurzel, v die Wurzel des linken Teilbaums von u, ...
v = Kind von u, u = Elternknoten von v, x ist ein Blatt.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
19
Sei u ein Knoten in einem Baum T.
 0, falls u die Wurzel ist
Tiefe(u) := 
 Tiefe(Elternknoten(u)) +1, sonst
Bsp.: Tiefe(w) = 1
 0, falls u ein Blatt ist
Höhe(u) := 
 max{Höhe(v) | v ist Kind von u} +1, sonst
Bsp.: Höhe(w) = 2
Tiefe(T) := max {Tiefe(u) | u ist Knoten in T}
Höhe(T) := max {Höhe(u) | u ist Knoten in T}
= Höhe(Wurzel(T))
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
20
(Binäre) Heaps lassen sich durch Binärbäume darstellen:
Bsp.: {1, 2, 3, 4, 5} darstellbar durch
1
5
1
2
4
2
oder
3
oder ...
3
4
5
Jeder Baumknoten u ist mit einem Element S[u] beschriftet.
Zusätzlich fordern wir die „Heap-Eigenschaft“:
Ist u Elternknoten von v, so ist S [u ] ≤ S [v ]
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
21
Realisierung der Heap-Operationen:
• function Emptyheap:
klar!
• function Extractmin:
Minimumsbestimmung: Min. steht an der Wurzel
Minimumsentfernung: Baum muss „reorganisiert“ werden
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
22
Bsp.:
2
Reorg. I
6
8
10
⇒
4
11
10
6
15
6
8
4
11
6
15
13
13
I) Beliebiges Blatt wird entfernt und an die Wurzel gesetzt.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
23
II) danach wird durch sukzessives Vertauschen mit dem
kleinsten Kind die Heap-Eigenschaft wiederhergestellt:
4
Reorg. II
⇒
8
6
4
Reorg. II
⇒
10
11 6
15
6
8
6
11 10
13
Vorlesung Algorithmen (RN/MK/AZ)
15
13
WSI für Informatik, Universität Tübingen
24
procedure Insert: Einzufügendes Element an Knoten anhängen,
welcher höchstens ein Kind hat.
Danach Vertauschen mit Elternknoten, falls
dieser größer ist usw.
Bsp.: Einfügen des Elements 5:
4
6
8
⇒
6
11 10
5
4
⇒
6
15
8
13
Vorlesung Algorithmen (RN/MK/AZ)
6
11 5
10
4
6
15
13
8
11 6
5
10
WSI für Informatik, Universität Tübingen
15
13
25
Ausgewogene Bäume:
Es gibt k ≥ 0, sodass
1. Alle Blätter haben Tiefe k oder k+1 und
2. Blätter der Tiefe k+1 sitzen „ganz links“.
Bsp.:
1
2
4
3
5
6
8
7
Nummerierung der Knoten:
Nummeriere Knoten der Höhe
nach und innerhalb jeder Höhe
von links nach rechts.
9 10
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
26
Dann gilt:
(1) Hat ein Knoten Nummer i > 1, so hat sein Elternknoten
die Nummer i / 2 .
(2) Hat ein Knoten Nummer i, so haben seine Kinder
(falls existent) die Nummern 2i und 2i+1.
⇒
Darstellung ausgewogener binärer Baum durch Paar (A,n),
wobei n Anzahl der Knoten und A Array, sodass A[i]
Beschriftung des Knotens mit Nummer i ist für alle i = 1, ..., n.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
27
Beispiel:
1
16
2
14
4
8
2
8
7
4
9
1
5
9
10
6
3
3
7
10
A: 16 14 10 8 7 9 3 2 4 1
1 2 3 4 5 6 7 8 9 10
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
28
Zur Implementierung von Heapsort:
type heap = record
A: array [1...N] of item;
<*N hinreichend groß*>
n: integer;
end
function Emptyheap : heap;
var h: heap;
begin
h.n ← 0; <*keine Elemente*>
Emptyheap ← h
end
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
29
procedure Insert (x: item; var h: heap);
var i,j: integer;
finish: boolean;
begin
h.n ← h.n +1; <*ein Element mehr*>
i ← h.n
h.A[i] ← x; <*neues, „linksbündiges“ El.*>
finish ← (i = 1);
while not finish do
begin
j ← i div 2 <*j Elternknoten von i*>
if h.A[i] < h.A[j]
then Interchange (h.A[i], h.A[j])
else finish ← true;
i ← j;
if finish = false then finish ← (i=1);
end
end
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
30
Zur Laufzeit-Analyse von Heapsort:
Heapsort besteht i.w. aus je n Aufrufen von Insert und
Extractmin.
„Leicht“ sieht man:
Ausführungszeit von Insert und Extractmin ist
O(Höhe des Baumes)
Lemma:
Hat ein ausgewogener Baum die Höhe m, so enthält er
mindestens 2m und weniger als 2m+1 Knoten.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
31
Nun gilt:
2 m ≤ n ⇒ m − 1 ≤ log n 
Wir erhalten Laufzeit =
O(n ⋅ m ) = O(n ⋅ (log n  + 1)) = O(n log n ).
Bemerkungen:
• Obwohl Heapsort im Gegensatz zu Quicksort sogar im Worst
Case Laufzeit O(n log n) hat, ist Quicksort in der Praxis
meist überlegen.
• Für „vergleichsbasierte Sortierverfahren“ läßt sich die untere
Schranke Ω(n log n ) beweisen, Heapsort ist in diesem
Sinne also asymptotisch optimal. Diese untere Schranke
gilt auch im Durchschnitt (bei Gleichverteilung).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
32
3.4 Mergesort
(Sortieren durch Mischen)
Bisher betrachtete Sortierverfahren:
Daten im Hauptspeicher.
Für externe Speichermedien, aber andere Sortierverfahren
vorteilhaft, z.B. Sortieren durch Mischen:
Füge zwei (oder mehrere) sortierte Folgen zu einer
sortierten Folge zusammen.
Z.B.
11 6 6 5 3
12 8
Vorlesung Algorithmen (RN/MK/AZ)
5
12 11 8
6
6
WSI für Informatik, Universität Tübingen
5
5
3
33
Mischalgorithmus:
Start mit leerer Ausgabefolge
Solange mind. eine Eingabefolge nichtleer,
- bestimme x = min A, wobei A die Menge der ersten
Elemente der nichtleeren Eingabefolgen ist,
- entferne x aus Eingabefolge, wo es vorkommt und
- füge es ans Ende der Ausgabefolge.
Korrektheit: x ist nicht nur das Minimum über A, sondern
über der Menge aller verbleibenden
Eingabeelemente ...
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
34
Zum Sortierverfahren:
Bezeichne aufsteigend sortierte Teilfolgen als „Runs“.
Grundprinzip:
Teile Eingabe in Teilfolgen der Länge 1 (das sind Runs).
Mische danach Runs zu längeren Runs.
Bsp.: Eingabe: 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5
(1) Streuphase:
3, 4, 5, 2, 5, 5
3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5
1, 1, 9, 6, 3
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
35
(2) Mischphase:
345255
13 59 35
11963
14 26 5
1134 355
11234569
2569
355
11233455569
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
36
Beobachtung:
Nach i-tem Durchlauf haben alle Runs
Länge ≤ 2i .
Allgemeiner: pi für p = # Eingabedateien
= # Ausgabedateien
Wenn p i ≥ n, so ist die Eingabe sortiert.
Also genau logp n Durchläufe nötig.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
37
Effizienzverbesserung:
Annahme: Hauptspeicher habe Platz für m Elemente (p < m < n).
Dann können wir Durchläufe sparen, indem wir interne
Sortierverfahren dazu benutzen, anfangs Runs der Länge m
zu erstellen.
Bsp.: m = 3
3 1 4 1 5 9 2 6 5 3 5
113 459
235 56
Vorlesung Algorithmen (RN/MK/AZ)
134 256
159 35
11233455569
WSI für Informatik, Universität Tübingen
38
Analyse:
Nach i Durchläufen haben die Runs Länge m·2i (bzw. m·pi).
n

Also genügen log p  Durchläufe.
m

Bsp.: n = 107, m = 104, p = 3
⇒ 7 Durchläufe
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
39
3.5 Bucketsort
(Sortieren durch Fachverteilung)
Betrachte oBdA Alphabet Σ = {1, 2, ..., m}
Für die Wörter x = x1 ... xk und y = y1 ... yr ∈ Σ*
sagen wir, dass x kleiner als y (x < y) ist,
genau dann, wenn
∃i, 0 ≤ i ≤ k ∀j, 1 ≤ j ≤ i: x j = y j und
entweder i = k < r
oder i < k und i < r und xi+1 < yi+1.
Ziel: Wörter über dem Alphabet Σ bzgl. der gegebenen
Ordnung sortieren.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
40
Spezialfall 1: Alle n Wörter haben Länge 1.
Lösungsansatz: Stelle m Fächer bereit und gehe die n Zahlen
durch und wirf jede Zahl in das ihrem Wert gemäße
Fach.
Implementierung der Fächer z.B. als lineare Listen und ein
Feld der Größe m zum Speichern der Listenköpfe.
Gesamtzeitaufwand: O(n + m)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
41
Spezialfall 2: Alle n Wörter haben gleiche Länge k.
Schreibweise: i-tes Wort: xi = x1i x2i ... xki
Vorteilhaft, zunächst nach dem k-ten Symbol zu sortieren,
dann nach dem (k-1)-ten, usw.
Damit k „Läufe“ über die Menge der Wörter.
Jeder Lauf gemäß Spezialfall 1
Laufzeit O((n + m) ·k)
⇒
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
42
Bsp.: 123 , 124, 223, 324, 321
m = 4, n = 5, k = 3
1. Lauf
321
2. Lauf
3. Lauf
223
123
124
123
Vorlesung Algorithmen (RN/MK/AZ)
324
124
223
123
321
223
324
124
324
321
WSI für Informatik, Universität Tübingen
43
Wie vermeiden wir Aufwand mit leeren Fächern?
Sei sj die Anzahl der im j-ten Lauf nichtleeren Fächer.
Ziel: Aufsammeln im j-ten Lauf in O(sj) Schritten
und damit Aufwand j-ter Lauf O(sj + n).
Erzeuge n·k Paare (j, xj i), 1 ≤ i ≤ n, 1 ≤ j ≤ k
und sortiere durch Fachverteilung zunächst nach der zweiten
und dann nach der ersten Komponente.
Nach 2. Lauf liegen im j-ten Fach gerade alle Buchstaben
in sortierter Reihenfolge, die an der j-ten Stelle vorkommen.
Aufwand 1. Lauf: O(n·k + m)
Aufwand 2. Lauf: O(n·k + k)
Σ : O(n·k + m)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
44
Allgemeiner Fall: n Wörter beliebiger Länge
n
|xi| =: ri , L := ∑ li , lmax := maxi {li}
i =1
Beachte: x i nicht „zu früh“ in Fachverteilung miteinbeziehen;
erst bearbeiten, wenn nach dem li-ten Buchstaben
sortiert wird.
(
Sortiere Wörter zunächst der Länge nach ...)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
45
Algorithmus:
1 Bestimme li ∀i und erzeuge Paare (li, Verweis auf xi)
2 Sortiere (li, Verweis auf xi) durch Fachverteilung nach
1. Komponente. Bezeichne Länge[k] die Liste der Elemente
der Länge k.
3 Erzeuge L Paare (j, xji), 1 ≤ i ≤ n, 1 ≤ j ≤ ri und
sortiere sie nach der 2. und dann der 1. Komponente.
2. Fachverteilung liefert lineare Listen Nichtleer[j],
1 ≤ j ≤ lmax . Lösche Duplikate aus Nichtleer[j].
4 Sortiere nun die Wörter xi durch Fachverteilung wie oben
beschrieben (unter Berücksichtigung von Länge[k]).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
46
Eine einfache Analyse zeigt:
Satz:
Sortieren durch Fachverteilung sortiert n Wörter
der Gesamtlänge L über einem Alphabet der
Größe m in Zeit O(m + L).
Anwendung: Sortieren n reeller Zahlen x1, ...,xn
Vereinfachung: Betrachte reelle Zahlen xi (0,1] mit 1 i
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
n:
47
3.6 Hybridsort
α ∈ R fest, k := α ⋅ n
1 Schaffe k leere Körbe. Wirf xi in den Korb
k ⋅ xi  für 1 ≤ i ≤ n
2 Wende Heapsort auf jeden Korb an und konkateniere
die Körbe, d.h. reihe sie hintereinander auf.
Mitteilung:
1. Worst Case Laufzeit von Hybridsort ist O(n log n).
2. Wenn xi unabhängig gemäß Einheitsverteilung aus (0,1]
gewählt, dann hat Hybridsort mittlere Laufzeit O(n).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
48
Herunterladen