ad2

Werbung
Sortieralgorithmen
Vorlesung
Algorithmen und Datenstrukturen 2
im SS 2004
Prof. Dr. W. P. Kowalk
Universität Oldenburg
●
Literatur
Die folgenden Bücher wurden für die Vorlesung verwendet.
Darüber hinaus gibt es viele weitere Literatur zu diesen Themen, die
u.a. in diesen Büchern zitiert wird:
–
Robert Sedgewick: Algorithmen.
Pearson Studium 2002.
–
Mark Allen Weiss:
Data Structures & Algorithm Analysis in Java.
Addison Wesley Longman 1999.
–
Timothy Budd: Classic Data Structures in Java.
Addison Wesley Longman 2001.
–
I.N. Bronstein, K.A. Semendjajew: Taschenbuch der
Mathematik.
Verlag Harri Deutsch. 1987.
Übersicht AD 2
●
Übersicht über die Inhalte der Vorlesung AD 2
–
Datenstrukturen
●
●
–
Sortieralgorithmen
●
●
–
Bewertung von Algorithmen (Komplexität vs.
Laufzeitmessung)
Algorithmen auf Datenstrukturen
Direkte Sortierverfahren
Höhere Sortierverfahren
Suchalgorithmen
●
●
Einfache Suchverfahren
Suchstrukturen
Übersicht AD 2
●
Übersicht über die Inhalte der Vorlesung AD 2-2
–
Paralle Programmierung
●
●
●
●
●
–
Numerische Algorithmen:
●
●
●
●
●
Threads in Java (Wiederholung aus Java-Kurs)
Synchronisation von Proessen
Semaphore
Monitore
Synchronisationsmechanismen in Java
Nullstellen, Extremum von Funktionen
Analytische Funktionen
Splines
Lineare Programmierung
Weitere Themen
Rückschau auf AD 1
●
Sprache der Informatik
●
Wissenschaftstheorie und Informatik
–
Modelle und Systeme
●
Automaten
●
3AA
●
Informatik und Information/Informationstheorie
●
Formale Sprachen / Syntax von Programmen
●
Algorithmen
Rückschau auf AD 1
●
Ausdrücke, Anweisungen, Programme
●
Datentypen
●
Abstrakten Datentypen
–
Stack
–
Queues
–
Deques
–
BigNumbers in Java
●
Funktionen und Prozeduren
●
Rekursion
●
Laufzeitkomplexität
Sortieren
Grundbegriffe
Klassifizierung
Komplexität
Direkte Sortieralgorithmen
Höhere Sortieralgorithmen
Spezielle Verfahren
Sortieren – Einführung
●
Zum Beschleunigen des Zugriffs auf größere
Mengen von Datenobjekten
–
Daten in bestimmte Reihenfolge bringen
●
●
●
●
alphabetisch (Telefonbuch, Lexikon)
numerisch (Buchseiten, Hausnummern)
lexikographisch (allgemeines Alphabet)
Vorgang wird als Sortieren (sorting) bezeichnet
–
Beispiele
●
●
●
Anordnung von Zeitschriften nach Erscheinungsdatum,
Schülern nach Größe
Studentennamen nach alphabetischer Ordnung
Sortieren – Einführung
●
●
●
Grundsätzliche Fragestellungen und Algorithmen
zum Sortieren
Man klassifiziert Sortieralgorithmen in
–
innere Sortieralgorithmen
–
äußere Sortieralgorithmen.
inneren Sortieralgorithmen unterteilt in
–
direkte Sortieralgorithmen
–
höhere Sortieralgorithmen
Sortieren – Einführung
●
Direkte Sortieralgorithmen i.d.R. langsamer
–
●
●
Sehr viel einfacher zu implementieren
In vielen höhere Sortieralgorithmen als
Hilfsalgorithmen verwendet
–
●
Aufwand meist O(N2),
kurze Folgen in der Regel mit höheren Sortieralgorithmen nur sehr viel langsamer zu sortieren
Direkte Sortieralgorithmen daher sehr wichtig.
Sortieren – Einführung
●
Laufzeitkomplexität höherer Sortieralgorithmen
meist von Ordnung O(N*log N)
–
●
konstanter Faktor spielt wichtige Rolle
Lineare Laufzeitkomplexität möglich
–
eigenen Rechnerarchitektur (parallele Prozessoren)
–
zusätzlicher Speicheraufwand
–
Dieses werden wir ebenfalls untersuchen.
Sortieren – Grundlagen
●
●
Daten häufig bei der
Sammlung/Erstellung bereits sortiert
Dennoch interessante Sortieralgorithmen
Sortieren – Grundbegriffe
●
●
Eine Folge von N Zahlen lässt sich in einem Feld
abspeichern:
–
integer array Feld [1..N];
–
Unsortiertes Feld
–
Sortiertes Feld
Permutieren
Vertauschen zweier Elemente des Feldes
Sortieren – Grundbegriffe
●
●
Permutation:
Ein anderes Feld mit gleichen Elementen wie
Feld, evtl. in anderer Reihenfolge
Zu Feld mit N Elementen gibt es
N! verschiedene Permutationen
–
Beweis durch mathematische Induktion
–
Formel, wenn einige Elemente gleich sind?
Sortieren – Grundbegriffe
●
●
Feld[i]>Feld[j]
–
Feld[i] ist größer als Feld[j]
–
auch, wenn Ordnung „>“
nicht übliche Bedeutung wie bei Zahlen
i<j
–
Feld[i] steht links von Feld[j]
–
Feld[j] steht rechts von Feld[i]
Sortieren – Grundbegriffe
●
●
Total geordnet
–
Feld[i] < Feld[j],
–
Feld[i] == Feld[j] oder
–
Feld[i] > Feld[j]
Partiell geordnet
–
Elemente, zwischen denen keine dieser drei möglichen
Relationen besteht
–
beispielsweise Tupel (a,b) von Zahlen
(komplexe Zahlen)
(a,b) ≤ (c,d) ↔ a ≤ b ٨ c ≤ d
a ,b∈
Sortieren – Grundbegriffe
●
Aufsteigend geordnet
–
●
Absteigend geordnet
–
●
●
i < j → Feld[i] < Feld[j]
i < j → Feld[i] > Feld[j]
Total geordnete Menge N verschiedener
Feldelementen kann stets auf genau eine Weise
(aufsteigend) sortiert werden.
Sortierung einer partiell geordneten Menge
–
i < j → ¬ Feld[i] > Feld[j]
Sortieren – Grundbegriffe
●
Stabiles Sortierverfahren
–
i < j ٨ Feld[i] = Feld[j] → iS < jS
Ordnung gleicher Feldelemente bleibt erhalten.
–
Sortierung bei verschiedenen Schlüsseln
(Vorname, Nachname)
Sortieren – Grundbegriffe
●
Fehlstellungszahl
–
Untere Fehlstellungszahl nj zu Index j
–
Anzahl i: i < j, für die Feld[i] > Feld[j]
–
Untere Fehlstellungszahl: n=∑ n j
N
i=0
N
–
●
obere Fehlstellungszahl analog: m=∑ m j
Satz: n = m
–
i=0
Untere Fehlstellungszahl = obere Fehlstellungszahl
Sortieren – Grundbegriffe
●
Allgemein nur Fehlstellungszahl (Inversionszahl)
●
Bedeutung der Inversionszahl
–
●
kleinste Anzahl von Vertauschungen benachbarter
Elemente, um Permutation in sortiertes Feld zu
überführen. Wieso?
Größte Inversionszahl eines Feldes der Länge N
–
absteigend sortiertes Feld mit verschiedenen
Feldelementen
Sortieren – Grundbegriffe
●
●
●
●
Anzahl der Fehlstellungen kann quadratisch mit
Anzahl der Feldelemente N wachsen
Sortierung durch Vertauschen benachbarter
Elemente in Fehlstellung
Inversionszahl meistens sehr groß
–
im Mittel etwa Hälfte der maximalen Inversionszahl
–
z.B. Bubble Sort mit Laufzeitkomplexität O(N2)
effizientes Sortierverfahren sollte schneller sein
Sortieren – Grundbegriffe
●
Ordnungsverträglich
–
Laufzeit eines Sortierverfahrens wächst monoton mit
Inversionszahl jeder Permutation
–
Effizientere Verfahren sind häufig nicht oder nur
teilweise ordnungsverträglich Sortieren – Grundbegriffe
●
A-fast geordnet
–
In manchen Fällen stehen alle Elemente nahezu an ihrem
Platz
–
ak: Abstand des Elements an Stelle k von Zielplatz
–
für jedes k sei |k-ak| < A,
–
Feld heißt A-fast geordnet.
–
Fehlstellungszahl kleiner als N·A
–
Laufzeitkomplexität für Sortierung dieses Feldes wächst
linear mit Anzahl der Feldemente N: O(N). Sortieren – Grundbegriffe
●
Komplexere Algorithmen sortieren mit einem
maximalem Aufwand von O(n·log(N))
–
häufig verschiedene Nachteile
●
●
●
●
nicht stabil
nicht ordnungsverträglich
zusätzlicher Speicherplatz Wichtig, die Eigenschaften von Algorithmen zu
kennen
–
abhängig von Anwendungen
–
quantitative, qualitative Eigenschaften
–
minimale, maximale, mittlere Laufzeiten
Einteilung der Sortierverfahren
●
●
Verwendete Datensätze
–
public class CDatenSatz {
public CDatenSatz (int i) {key=i};
int key = 0;
String Name = "";
}
–
key wird als Schlüssel bezeichnet
Äußere Sortierverfahren halten nur kleine
Teilmenge der Daten im Speicherplatz
–
größter Teil der Daten auf externen Speichermedien
–
sequentieller Zugriff
–
früher meist Magnetbändern
Einteilung der Sortierverfahren
●
●
Innere Sortierverfahren halten sämtliche zu
sortierenden Daten im Speicher
Vertauschen
–
●
Elemente in falscher Reihenfolge werden solange
vertauscht, bis alle in richtiger Reihenfolge stehen.
Auswählen
–
kleinstes Element wird herausgesucht, an richtige Stelle
gebracht usw.
Einteilung der Sortierverfahren
●
Einfügen
–
●
Element wird an richtiger Stelle einer sortierten Teilfolge
eingefügt. Mischen
–
Zwei sortierte Teilfolgen werden zur längeren sortierten
Teilfolge zusammengefasst. Einteilung der Sortierverfahren
●
●
●
Verteilen
–
Elemente mit verschiedenen Schlüsseln werden in
unterschiedliche Felder sortiert,
–
mindestens so viele Felder, wie Schlüssel
Verfahren haben unterschiedliche Vor- und
Nachteile,
Entscheidung für ein geeignetes Verfahren hängt
i.d.R. von jeweiliger Situation ab.
Langsamste Sortierverfahren
●
maximale Dauer
–
keine unsinnigen Operationen
●
–
keine Elemente in richtiger Reihenfolge vertauschen.
Vertauscht man nur benachbarte, falsch stehende
Elemente, so erhalt man
●
●
Bubble Sort-Algorithmus,
Laufzeit proportional der Inversionszahl
–
maximale Laufzeit eines Sortieralgorithmus im gleichen
Maße wie die Inversionszahl,
–
in der Regel quadratisch mit Anzahl der Feldelemente
Schnellste Sortierverfahren
●
●
●
Anzahl oberer und unterer Fehlstellungen
–
Index si des Platzes eines Elements bestimmen
–
si = i + mi – ni (Index des Elements Feld[i])
Jeder Platz nur zweimal berührt, d.h.
Laufzeitkomplexität O(2·N) = linear!
Meist ist Anzahl oberer / unterer Fehlstellungen
nicht bekannt – kaum praktikabel
Schnellste Sortierverfahren
●
nur zwei Elemente vergleichen oder vertauschen
●
vorliegende Information möglichst ausnutzen
●
über Lage der Feldelemente informieren
–
●
Sortierung mit linearem Aufwand
Kenntnis über Teilfolge: Feld[1] bis Feld [m]
–
nächstes Element einsortieren mit Binärteilungsprinzip O
(log(2·m))
–
Gesamter Aufwand
●
●
log2(2) + log2(3) + log2(4) + … + log2(N) = log2(N!) ≈ O(N·log2(N))
Stirlingsche Formel
Schnellste Sortierverfahren
●
●
Vergleich jeweils zweier Elemente
–
Ausnutzung bereits sortierter Datenmengen
–
Algorithmus nicht schneller als O(N·log2(N))
Grenze akzeptabel
–
Algorithmen mit Aufwand N·log2(N) für Praxis völlig
ausreichend
–
Logarithmusfunktion wächst nur sehr langsam
–
Algorithmen von geringerer Ordnung meist andere
Nachteile
Direkte Sortierverfahren
●
Aufwand stets O(N2)
–
●
für größere Anzahl zu sortierender Elemente unvertretbar
zeitaufwendig
Höhere Verfahren besser geeignet
–
direkte Verfahren teilweise Hilfsverfahren bei höheren
Verfahren
–
höheren Verfahren bei kleinen zu sortierenden
Datenmengen sehr ineffizient
Folgen und Reihen
●
Zahlenfolge
–
a 1 , a 2 , a 3,  , a N −2 , a N −1 , a N
Zahlenfolge heißt arithmetisch Folge, wenn
∀ i1: d i =ai −a i−1=d =konstant
–
Die Summe der Summanden einer arithmetischen Folge
heißt arithmetischen Reihe
–
Für die Summenformel der arithmetischen Reihe gilt
a1a N
∑ ai = 2 .
i=1
N
(erste Glied + letztes Glied durch 2).
Folgen und Reihen
●
Beweis für Summenformel mit
2⋅
= 

=
a1

a2

aN

a N −1
=
a1

a1d

a1d⋅ N −1

a1d  N −2
=
2 a1d⋅ N −1

2 a1d⋅ N −1
= a1a1d⋅ N −1  a1a1d⋅ N −1
= N⋅a1a1d⋅ N −1
= N⋅a1a N 
N⋅a1a N 
⇒ =
.
2












a i =a1i−1⋅d

a N −1

a2
 a1d  N −2

a1d
 2 a1d⋅ N −1


aN

a1

a1d⋅ N −1

a1

2 a1d⋅ N −1
 a1a1d⋅ N −1
Folgen und Reihen
●
Zahlenfolge
a 1 , a 2 , a 3 , , a N −1 , a N
–
Zahlenfolge heißt geometrische Folge, wenn
–
Die Summe der Summanden einer arithmetischen Folge
heißt geometrische Reihe
–
Für die Summenformel der geometrischen Reihe gilt
ai
∀ i1 :qi =
=q=konstant
a i−1
N
N
q −1
∑ ai =a1⋅ q−1 .
i=1
Folgen und Reihen
●
i−1
a
=a
⋅q=a
⋅q
Beweis für Summenformel mit i i−1
1

=
q⋅
=
a1

a 1⋅q

a 1⋅q 2



a 1⋅q N −2

a 1⋅q

a 1⋅q 2

a 1⋅q 3



−q⋅=a 1−a 1⋅q N
⋅1−q=a 1⋅1−q N 
a 1−a 1⋅q N
1−q N
=
=a 1⋅
.
1−q
1−q
Mathematische Induktion
●
●
●
Beweisverfahren für (natürliche Zahlen)
Einfachste Form:
Beweise E(n) für alle natürlichen Zahlen n.
–
Beweise E(1).
–
Beweise: Gilt für irgendein n: E(n), so gilt auch E(n+1).
Hinweise
–
'Beweis' dieses Beweisverfahrens:
E(1)  E(2)  E(3)  ...  E(n–1)  E(n).
–
Bezeichnung (Mathematische) Induktion von Pascal.
–
Bessere Beschreibung: Stereotype logische Deduktion.
Mathematische Induktion
●
Geltungsbereich
–
Nur wenn E(1) gilt;
jeweils explizit nachzuweisen.
–
Beweis gilt nur für endliche Zahlenmengen, also nicht für
die Menge der natürlichen Zahlen.
–
Gegenbeispiel:
●
E(k)  {Die Menge {1,2,..,k} ist endlich}
●
Es gilt E(1), da {1} eine endliche Menge ist.
Da die Vereinigung zweier endlicher Mengen endlich ist, gilt
auch: {1,2,..,m-1}{m}={1,2,..,m-1,m} ist endlich.
●
Also folgt: E(m-1) und {m} endlich  E(m) für jede Zahl m.
●
Daher wäre die Menge der natürlichen Zahlen endlich.
●
Mathematische Induktion – Beispiel
●
Anzahl der Permutationen von N Elementen: N!.
–
Ein Element: (a), eine Anordnung
–
(nicht nötig, 2 Elemente: (a,b) (b,a): zwei Anordnungen)
–
(nicht nötig, 3 Elemente:
(a,b,c) (a,c,b) (b,a,c) (c,a,b) (b,c,a) (c,b,a): 6 Anordn.)
–
Gebe es für (N-1) Elemente (N-1)! Permutation
(p1,p2,...,pN-1),
so gilt für N Elemente (N-tes Elemente = pN):
1: (pN,p1,p2,...,pN-1), 2:(p1,pN,p2,...,pN-1), 3:(p1,p2,pN,...,pN-1),
N-1:(p1,p2,...,pN,pN-1), N:(p1,p2,...,pN-1,pN)
–
Daher ist die Anzahl der Permutationen N·(N-1)!=N!.
Mathematische Induktion – Beispiel
●
Pascalsches Dreieck:
   
  
N  N = N 1
k
k 1
k 1
 
N  N =1N = N 1
0
1
1
–
Für k=0:
–
Gelte die Formel für k=m-1; für k=m gilt:
   




N  N
m
m1
=

=

=

=

=
 




N  N ⋅N −m
m
m m1
N ⋅1 N −m 
m1
m
N ⋅ N −mm1 
m m1
N ⋅ N 1 
m m1
N 1
m1
Statistik
●
Kennzahlen von
–
Mittelwert
–
k-tes Moment
–
Varianz
–
X ={ X i }i=1.. N
N
Zahlenfolgen
1
E [ X ]= ⋅∑ X i
N i=1
Standardabweichung
N
1
k
k
E [ X ]= ⋅∑ X i
N i=1
N
1
2
V [ X ]= ⋅∑  E [ X ]− X i 
N i=1
 [ X ]=  V [ X ].
2
–
Berechnung der Varianz
2
V [ X ]=E [ X ]−E [ X ] .
Statistik
●
In der Statistik wird gezeigt, dass der Mittelwert
einer Grundgesamtheit mit großer
Wahrscheinlichkeit in dem Intervall liegt:
E [ X ]± [ X ]
–
●
Je kleiner σ, desto enger ist dieses Intervall
Praktisches Vorgehen:
–
Wiederhole Messung solange, bis  [ X ]
–
Oder bis der Variationskoeffizient
[ X ]
CX=

E[X ]
Zufallszahlen
●
Definition von Zufallszahlenfolgen
–
Sei eine Folge von Zahlen gegeben:
{z k }k =1.. N , ∀ k : z k ∈[ 0,1 ⊂ℝ
z1, z2, z3, ... , zN-1, zM.
–
Dann heißt diese Zahlenfolge eine Zufallszahlenfolge,
wenn gilt:
●
●
Die Werte zk sind gleichmäßig über [0,1) verteilt.
zk und die p Werte {zk-p, zk-p+1, zk-p+2, ... ,zp-2, zp-1} sind
unkorreliert.
Zufallszahlen
●
Definition von unkorreliert
–
Seien zwei Zahlenfolgen { y k }k =1.. N , {z k }k =1.. N gegeben.
Dann wird
1
Cov  y , z =
N
N
 E [ y ]− y k ⋅ E [ z ]−z k 
∑
i=1
Kovarianz von {y} und {z} genannt.
–
Konvergiert die Kovarianz mit wachsendem N gegen
null, so heißen {y} und {z} unkorreliert!
1
lim
N ∞ N
N
 E [ y ]− y k ⋅ E [ z ]−z k  0
∑
i=1
Langsamstes Sortierverfahren
●
Voraussetzungen
–
●
Methode
–
●
Keine unsinnigen Operationen
Vertausche benachbarte 'Fehlstellungen', solange es
solche gibt → Bubblesort.
Ergebnis
–
'Langsamstes' Sortierverfahren so schlecht wie
Bubblesort, d.h. V = N −12
●
●
Vergleiche:
Vertauschungen: Anzahl der Fehlstellungen
Schnellstes Sortierverfahren
●
Fehlstellungszahl zu Feld[i]
–
●
Methode
–
●
Index des endgültigen Platzes des Elements Feld[i]
si = i + mi – ni
Vertausche jedes Element auf 'seinen' Platz
Aber
–
Wie berechnet man die Fehlstellungszahl? → O(N2)
–
Nicht praktikabel!
Schnellstes Sortierverfahren
●
●
Einschränkungen
–
Vergleiche nur jeweils zwei Elemente
–
Nutze bereits bekannte Information, z.B. sortierte
Teilfolge
Ergebnis
–
Füge in sortierte Teilfolge nach Binärteilungsprinzip ein
mit Aufwand O(log N).
●
●
log2(2) + log2(3) + log2(4) +…+ log2(N) = log2(N!) ≈ O
(N·log2(N)),
(Stirlingsche Formel)
Herunterladen