Inhaltsberblick
0. Einfhrung
Programmstrukturen
Vorlesung
1. Algorithmen
Paradigmen, Analyse
2. Datenstrukturen
Allgemeiner berblick
3. Listen
Lineare Speicherstrukturen, Stack, Queue
4. Bume
Suchstrukturen
5. Vektoren
Sortieren, Hashing
6. Graphen
Traversierungs- und Optimierungsalgorithmen
VO Algorithmen und Datenstrukturen E. Schikuta
Literatur
R. Sedgewick, Algorithmen in C++ (Teil 1-4), Addison Wesley, 3. berarbeitete Auflage, 2002 Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest, Introduction to Algorithms, published by MIT Press and McGraw-Hill. (First published in 1990.) Jim Gray, Vortrag: Parallel Database Systems Analyzing LOTS of Data, Microsoft Research, 1997 E. Schikuta, Folien zur Vorlesung, Algorithmen und Datenstrukturen 1, SS 2006
Danksagung Fr Mitarbeit und Durchsicht der Folien geht mein besonderer Dank an Helmut Wanek, Clemens Bruckmann und Martin Polaschek Mein weiterer Dank geht an zahlreiche Studierende der letzten Jahre, die im Rahmen ihrer bungen die Basis fr einige der dynamischen Beispiele der VO lieferten.
E. Schikuta
E. Schikuta
Kapitel 0:
Die Wissenschaft der Informatik umfasst alle Modelle (Methoden, Verfahren, Konzepte, etc.), die dazu dienen eine gegebene Eingabe in eine beliebige Ausgabe zu verwandeln
Einfhrung
Input
Informatik
Output
E. Schikuta
E. Schikuta
Modelle der
Input
Computerprogramm Spielregeln
Output ...
Informatik
Amerikanischer Wildreis 1 Tasse ergibt 3 Portionen Reis grndlich waschen 1 Tasse Reis in 3 Tassen kochendes Wasser geben kurz aufkochen lassen bei schwacher Hitze 25 min bedeckt dnsten Reis abdecken, salzen, mit Gabel auflockern restliche Flssigkeit verdampfen
10
0.2 Algorithmus Unter Algorithmus versteht man die schrittweise Vorschrift zur Berechnung gesuchter aus gegebenen Gren, in der jeder Schritt aus einer Anzahl eindeutig ausfhrbarer Operationen und einer Angabe ber den nchsten Schritt besteht. Ursprung
Algorithmus Berechnungsvorschrift Ben Musa Al-Chwarizmi (usbekischer Mathematiker um 825), erstes Buch ber Algebra arithmos ... griechisches Wort fr Zahl
VO Algorithmen und Datenstrukturen E. Schikuta
Eindeutigkeit
Jeder Schritt der Ausfhrung mu eindeutig sein, keine Mehrdeutigkeiten mglich
Endlichkeit
Statisch: mit endlich vielen Zeichen formulierbar Dynamisch: in endlich vielen Schritten beendbar
Vollstndigkeit
sollte vollstndig sein, sollte alle mglichen Flle behandeln
Korrektheit
sollte das gewnschte Ergebnis liefern
11
12
Algorithmen knnen auf ganz unterschiedliche Art konzipiert werden (Paradigmen): prozedural versus funktional versus logik-basiert orthogonal dazu objektorientiert (OO) auf eine bestimmte Art konzipierte Algorithmen knnen auf ganz unterschiedliche Art ausgedrckt werden (Darstellung): natrlichsprachlich, in einer Programmiersprache,
E. Schikuta
E. Schikuta
13
14
Das Programm ist nur aus Funktionen (Abbildungen) im mathematischen Sinn aufgebaut. Jedes Vorkommen eines Funktionsaufrufes kann durch das Funktionsergebnis ersetzt werden. Funktionen haben keine Seiteneffekte; es gibt keine Variablen. n=0 1 Beispiel: Fakulttsfunktion n! = n > 0 n (n 1)!
3! 3(3-1)! 32! 32(2-1)! 321! 321(1-1)! 3210! 3211 6 hier: kann ersetzt werden durch
Der Lsungsweg ist durch eine Folge von Anweisungen vorgegeben Anweisungen knnen Werte in Variablen zwischenspeichern, lesen und verndern
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
15
16
0.3 Algorithmendarstellung Wie man einen Algorithmus darstellen kann, hngt vom gewhlten Paradigma ab! Fr das prozedurale Paradigma bieten sich insbesondere an: Graphisch
Ablaufdiagramme Struktogramme
Ablaufdiagramm = Flussdiagramm
Anweisungen stehen in Knoten Kontrollfluss: gerichtete Kanten Start summe = 0
Darstellung graphisch
Struktogramm
Anweisungen stehen in Blcken Kontrollfluss: Form, Struktur der Blcke
summe = 0
n>0? summe = summe + n JA drucke summe n=n1 Ende NEIN
Pseudocode
Knstliche Programmiersprachenderivate Stilisierte Prosa
Programmiersprachen
VO Algorithmen und Datenstrukturen E. Schikuta
Pro: leicht erfassbar, Standardnotation, auch dem Anwender verstndlich (Diskussionsbasis) Con: groe Programme unberschaubar, schwierig direkt in Programmiersprache umsetzbar, schwer
editierbar, automatische Codegenerierung eher beschrnkt (meist nur Prozedurkpfe)
VO Algorithmen und Datenstrukturen E. Schikuta
17
18
Darstellung Pseudocode
Programmiersprachenderivate
Anlehnung an eine Programmiersprache (z. B. Pascal, MODULA-2); Ziel, eine der natrlichen Sprache mglichst nahe Kunstsprache zu schaffen (standardisierte Darstellung!) begin comment Das ist ALGOL; integer n,i,summe; read(n); summe := 0; for i := n step -1 until 1 do summe := summe + i; print(summe) end
Darstellung Programmiersprache
Kenneth E. Iverson, 1979
Notation as a Tool of Thought Inventor of APL
Stilisierte Prosa
Beschreibung der schrittweisen Ausfhrung
Schritt 1:Initialisiere. Setze summe auf 0. Schritt 2:Abarbeitung der Schleife. Solange n grer als 0, addiere n zu summe, ziehe 1 von n ab. Schritt 3:Ausgabe. Drucke summe.
Pro: Programmiersprache sehr hnlich, direkte Umsetzung einfach Con: hnliche Komplexitt wie Programmiersprache, fr den Anwender oft schwer verstndlich
Pro: (fast) direkt ausfhrbar Con: komplex, fr Entwurf nur sehr beschrnkt einsetzbar
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
19
20
Programmiersprachen-Paradigmen
Damit ein Computer ein Problem lsen kann, mssen wir ihm den Algorithmus in Form eines Programms, das in einer Programmiersprache geschrieben ist, prsentieren
Generation erste zweite dritte
Programmiersprachen-Gruppen
Typ der Programmiersprache Maschinensprachen Maschinenorientierte Sprachen (Assembler) Problemorientierte Sprachen Datenbanksprachen Sprachen der KI Objektorientierte Sprachen Hybride Sprachen Vertreter Binr- und Hexadezimal-Programmierung OS/370 Assembler, 2650 Assembler, 8080 Assembler FORTRAN, COBOL, Pascal, MODULA-2, C SQL, Natural-2 Lisp, PROLOG Smalltalk C++
ProgrammiersprachenParadigmen
vierte fnfte ? ?
prozedural versus funktional versus logik-basiert sequentiell versus parallel typisiert versus untypisiert (flieender bergang) orthogonal dazu: objektorientiert
prozedural versus funktional versus logik-basiert sequentiell versus parallel typisiert versus untypisiert (flieender bergang) orthogonal dazu: objektorientiert
E. Schikuta
E. Schikuta
21
22
Sequenz, Zuweisung
j 1 j j + 1
Aktion 2
j = 1; j = j + 1;
oder Aktion 2
j = 1; j++;
E. Schikuta
E. Schikuta
23
24
Verzweigung
Aktionsblock wird solange wiederholt, wie die Bedingung (Eintrittsbedingung) gilt
nein while (Bedingung true) ja Aktion
while - Schleife
ja ja nein
j > n
nein
nein
while j < n
ja
j 0
j i
j j + 1
JA
Bedingung erfllt ?
NEIN
Teil 1
Teil 2
if (j > n) j = 0; else j = i;
while (j < n) j = j + 1;
E. Schikuta
E. Schikuta
25
26
Funktion / Prozedur (1) Abgeschlossene algorithmische Einheiten bestehen aus Sequenzen, Verzweigungen, Schleifen und Funktions-/Prozeduraufrufen Funktion
Eingangswerte, genau ein Ausgangswert
Bedingung erfllt? JA
Prozedur
nur Eingangswerte
Eintrittsbedingung Anweisung
Anweisung
E. Schikuta
E. Schikuta
27
28
Funktion/Prozedur (2)
0.5 Rekursion Ein Objekt heit rekursiv, wenn es durch sich selbst definiert ist, oder sich selbst (teilweise) enthlt. Beispiele:
Fernseher Mathematik
(Definition der Fakultt)
Funktion
int sum(int n) { int summe = 0; while(n > 0) { summe += n; n--; } return summe; }
Prozedur
void sum(int n) { int summe = 0; while(n > 0) { summe += n; n--; } printf(%d\n, summe); }
n = 0 n! = n > 0
1 n ( n 1) !
E. Schikuta
E. Schikuta
29
30
Rekursive Programmteile Eine Prozedur/Funktion heit rekursiv, wenn sie sich in der Folge ihrer Abarbeitung selbst referenziert. Eine Prozedur/Funktion P heit direkt rekursiv, wenn sie sich explizit selbst aufruft. Hingegen ist P indirekt rekursiv, wenn sie den Aufruf einer anderen Prozedur/Funktion enthlt, die ihrerseits wieder P (direkt oder indirekt) aufruft. Berechnung der Fakultt
// Berechnung von n! fr n>=0 int fakultaet(int n) { if(n == 0) rekursiver return(1); Aufruf else return(n * fakultaet(n-1)); }
Direkte Rekursion
E. Schikuta
31
32
return (1*1)
E. Schikuta
E. Schikuta
33
34
Expr ::= SimpleExpr [RelOp SimpleExpr] SimpleExpr ::= [SignOp] Term [AddOp Term] Term ::= Factor {MulOp Factor} Factor ::= ( Expr ) | NOT Factor | Value
MulOp * (
Nachteile
Programme knnen fehlerhafter sein logische Fehler schwerer zu finden mgliche Verlangsamung der Programme Programm schwerer lesbar (vergl. Vorteile!)
VO Algorithmen und Datenstrukturen E. Schikuta
35
36
Kriterien
Abbruchkriterium
Spezifikation einer zu erreichenden Programmsituation, bei der das Programm die rekursiven Aufrufe beendet.
E. Schikuta
E. Schikuta
37
38
Kapitel 1:
Algorithmen
E. Schikuta
E. Schikuta
39
40
Ziele
Algorithmen zu Problemstellungen finden!
Lsungsanstze finden, konstruieren
Vergleiche mit anderem Programmieransatz, z.B. for- statt while-Schleife! alternativer Programmierstil (Warum?)
VO Algorithmen und Datenstrukturen E. Schikuta
41
42
Beispiel:
Schleifenform (siehe oben) Rekursion statt Iteration
Achtung! Was ist bei einem Aufruf n<0 zu beachten?
i =
i =1
n (n + 1) 2
Umsetzung
int sum(int n) { return (n*(n+1))/2; }
E. Schikuta
43
44
Was ist gut? Oder vielleicht besser? Problem: Laufzeitenvergleich fhrt nur zu punktueller Qualittsbestimmung
Laufzeit, Speicherplatzverbrauch Abhngig von
Computer Betriebssystem Compiler, ...
10
Gau
1
0,1
E. Schikuta
E. Schikuta
45
46
1.2 Algorithmen-Paradigmen Generelle Techniken zur Lsung groer Klassen von Problemstellungen Greedy algorithms
gefriger, gieriger Ansatz, Wahl des lokalen Optimums
1.2.1 Greedy (1) In jedem Schritt des Algorithmus wird die Mglichkeit gewhlt, die unmittelbar (lokal) den optimalen (kleinsten bzw. grten) Wert bezglich der Zielfunktion liefert. Dabei wird die globale Sicht auf das Endziel vernachlssigt. Vorteil:
Effizienter Problemlsungsweg, oft sehr schnell, kann in vielen Fllen relativ gute Lsung finden
Divide-and-conquer algorithms
schrittweise Zerlegen des Problems der Gre n in kleiner Teilprobleme
Dynamic programming
dynamischer sukkzessiver Aufbau der Lsung aus schon berechneten Teillsungen
Nachteil:
Findet oft keine optimale Lsung
E. Schikuta
E. Schikuta
47
48
8.2.1.0
4 Mnzen
E. Schikuta
49
50
1.2.2 Divide-and-conquer (1) Ausgehend von einer generellen Abstraktion wird das Problem iterativ verfeinert, bis Lsungen fr vereinfachte Teilprobleme gefunden wurden, aus welchen eine Gesamtlsung konstruiert werden kann. Verschiedene Anstze Problem size division
Divide-and-conquer (2)
Zerlegung eines Problems der Gre n in eine endliche Anzahl von Teilproblemen kleiner n
Step division
Aufteilen einer Aufgabe in eine Sequenz (Folge) von individuellen Teilaufgaben
Case division
Diese Vorgangsweise wird auch oft mit stepwise refinement oder top-down approach bezeichnet Identifikation von Spezialfllen zu einem generellen Problem ab einer gewissen Abstraktionsstufe
51
52
Problem size division Durch Zerlegung Verringerung der Problemgre, d.h. P(n) k*P(m),
wobei k, m < n
Binre Suche
Suche eine Zahl x in der (aufsteigend) sortierten Folge z1,z2,..,zn (allgemein: zl,zl+1,..,zr mit l=1, r=n) und ermittle ihre Position i Zerlegung: k = 1 und m n/2 Trivial: finde mittleren Index m = (l+r)2 Falls zm=x Ergebnis m, sonst Falls x<zm suche x im Bereich zl,z2,..,zm-1 sonst suche x im Bereich zm+1,zm+2,..,zr
Suche Zahl 7
1 3 4 6 7 8 10 7 8 10 7
E. Schikuta
E. Schikuta
53
54
az + bz + c = 0
2
z1, 2 = (
1 2 b ) q ,q = b 2 4ac 2a 2a
Idee
nicht Start von Problemgre n und Aufteilung bis Gre 1, SONDERN
Start mit Lsung fr Problemgre 1, Kombination der berechneten Teillsungen bis eine Lsung fr Problemgre n erreicht wurde.
VO Algorithmen und Datenstrukturen E. Schikuta
55
56
Beachte
57
58
1.3 Analyse u. Bewertung von Algorithmen Ziel ist objektive Bewertung von Algorithmen Kriterien:
Effektivitt
Ist das Problem lsbar, ist der Ansatz umsetzbar in ein Programm? CW-Wert
Korrektheit
Macht der Algorithmus was er soll?
Termination
Hlt der Algorithmus an, besitzt er eine endliche Ausfhrungszeit? Hchstgeschwindigkeit Beschleunigung
Komplexitt
Wie strukturiert ist der Algorithmus Strukturkomplexitt? Wie schnell ist der Algorithmus Laufzeitkompexitt?
E. Schikuta
E. Schikuta
59
60
Korrektheit
Algorithmus kann als lauffhiges Computerprogramm formuliert werden. effective it does work
Problem
Formulierung Transformation der Problembeschreibung in einen exekutierbaren Algorithmus
Ich will, brauche, mu haben ... So geht das!
Laufzeit
Struktur
Termination
E. Schikuta
61
62
1.3.2 Korrektheit Produziert der Algorithmus das gewnschte Ergebnis? Zwei Vorgangsweisen mglich
Testen Formales Testen
Formales Testen Mathematisch orientierte Verifikationstechniken erlauben es, die Korrektheit von Programmstcken in Abhngigkeit von Bedingungen an die Eingabedaten (Prmissen) zu beweisen
McCarthy, Naur, Floyd, Hoare, Knuth, Dijkstra, etc.
Testen
Vollstndiges Austesten meist nicht mglich Statistischer Ansatz meist verfolgt, z.B. Pfadberdeckung (Strukturelle Komplexitt) Bestenfalls Falsifizierung erreichbar
Es knnen nur Fehler gefunden werden, aber es kann keine Korrektheit bewiesen werden
zwingt den Entwickler Entwurfsentscheidungen noch einmal nachzuvollziehen und hilft beim Auffinden logischer Fehler Algorithmus muss verstanden werden je grer ein Programmsystem, umso schwieriger die Verifikation (in der Praxis kaum von Bedeutung)
63
64
Verifikation Programm-Verifikation
verschiedene Anstze
Rckwrtsbeweis:
Ind. Anfang fr n = 1 1*2/2 = 1 Ind. Voraussetzung (1+2++n-1) = (n-1)*n/2 Ind. Schluss (1+2++n-1)+n = (n-1)n/2 +n = = ((n-1)n +2n)/2 = (n2-n+2n)/2 = = n(n+1)/2
i =
i =1
n ( n + 1) 2
Strukturierter Ansatz, beruht auf Prdikatentransformation berprfung, ob die Voraussetzungen (weakest preconditions, wp) an die Eingabedaten garantieren, dass das Programm in einem Zustand terminiert, der das gewnschte Programmziel erfllt. Man bezeichnet diese Programmziel, welches die Aufgabe des Programms beschreibt, als Korrektheitsbedingung
Hierzu darf das Programm nur aus einfachen Zuweisungen, Vergleichen, while-Form Schleifen und Anweisungsfolgen bestehen. Alle anderen Konstrukte mssen bersetzt werden.
E. Schikuta
E. Schikuta
65
66
Verifikation - Beispiel
Beispiel
int sum(int n) { int s = 0; i = 1; while(i <= n) { s = s + i; i = i + 1; } return s; }
1.3.3 Termination (1) Frage: Hlt der Algorithmus an, d.h. besitzt er eine endliche Ausfhrungszeit? Falls nicht klar, oft folgende Technik einsetzbar: Man finde eine Gre oder eine Eigenschaft des Algorithmus der die folgenden 3 Charakteristiken erfllt:
Eine 1-1 Abbildung dieser Gre auf die ganzen Zahlen kann aufgestellt werden. Diese Gre ist positiv. Die Gre nimmt whrend der Ausfhrung des Algorithmus kontinuierlich ab (dekrementiert).
VO Algorithmen und Datenstrukturen E. Schikuta
Rckwrtsbeweis
Korrektheitsbedingung : s = i
i =1 n
(i n + 1)) ( s + i = j ) (i n + 1) ( s = j ) (i n + 1) SI
j =1 j =1
i 1
(0 = j ) ( 0 n )
j =1
n0
E. Schikuta
67
68
Termination (2) Idee: Die gefundene Gre besitzt bei Algorithmusbeginn einen vorgegebenen positiven Startwert, der sich kontinuierlich verringert. Da die Gre nie negativ werden kann, folgt, dass der Algorithmus terminieren muss, bevor die Gre kleiner 0 ist.
Gre n
Beispiel:
int sum(int n) { if(n <= 0) return 0; if(n == 1) return 1; Dekrement else return n+sum(n-1); }
E. Schikuta
These
komplexes Programm hohe Kosten klares Programm geringere Kosten
VO Algorithmen und Datenstrukturen E. Schikuta
69
70
Grundsatz
Softwaremetriken Ziel Metriken (Mazahlen) zu finden, die den Aufbau, Struktur, Stil eines Moduls (Programmstcks) bewerten und vergleichen lassen. Anforderungen
Gltigkeit
Misst tatschlich was es vorgibt zu messen
When you can measure what you are speaking about and express in numbers you know something about it, but when you cannot measure it, when you cannot express it in numbers, your knowledge is of a meager and unsatisfactory kind. Lord Kelvin
Einfachheit
Resultate sind einfach verstndlich und interpretierbar
Sensitivitt
Reagiert ausreichend auf unterschiedliche Ausprgungen
Robustheit
Reagiert nicht auf im Zusammenhang uninteressante Eigenschaften
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
71
72
Kohsion
Misst Informationsfluss von und nach Auen abhngig von der Modulgre
Kohsion (extern)
Henry-Kafura Metrik (Informationsfluss),
Inter-modulare Komplexitt
Beschreibt Komplexitt zwischen Moduln Kupplung
Fenton und Melton,
VO Algorithmen und Datenstrukturen E. Schikuta
73
74
Programmbeispiel
0: private sub foo (a as integer) 1: while a < limit do 2: process_1 a 3: if bar(a) then 4: process_2 a 5: elseif mumble(a) then 6: process_3 a 7: else 8: process_4 a 9: end if 10: end while Basis Menge 11: end sub Pfad 1: 1
1
Die Metrik von McCabe ist ein Ma zur Beurteilung der Modul Komplexitt
Basiert auf der zyklomatischen Komplexitt V: liefert die Anzahl der unabhngigen Pfade in einem Programmgraph
Bei einem unabhngigen Pfad wird mindestens eine 'neue' Kante im Programmablaufplan beschritten.
Erfahrungswerte fr die zyklomatische Komplexitt V(G) Einschtzung im Normalfall <5 5-10 > 10 > 20 einfach normal komplex, sollte restrukturiert werden schwer verstndlich, wahrscheinlich fehlerhaft
E. Schikuta
10
11
75
76
Ma fr Modulkomplexitt
LOC NCSS McCabe
E. Schikuta
E. Schikuta
77
78
Verbindungskomplexitt
Quantifizierung des lesenden und verndernden Zugriffs des Moduls auf die Umgebung FANIN Zhlt die Datenflsse zwischen Moduln
FAN-INm: Anzahl der Module die m verwenden Modul genauer: Anzahl der Datenflsse, die im Modul m terminieren + Anzahl der Datenstrukturen, aus FANdenen der Modul m Daten ausliest OUT FAN-OUTm: Anzahl der Module die m verwendet genauer: Anzahl der Datenflsse, die vom Modul m ausgehen + Anzahl der Datenstrukturen, die der Modul m verndert
Probleme HK
Abh. vom Datenfluss, bei einem FAN = 0, gesamt 0 auch bei hoher Modulkomplexitt Wiederverwendbarkeit wird durch hohen FAN Wert bestraft
Henry-Kafura Formel
Cim * (FAN-INm * FAN-OUTm)2
Cim Modulkomplexitt (z.B. LOC, McCabe, )
E. Schikuta
E. Schikuta
79
80
1.3.4.3 Inter-modulare Komplexitt Fenton und Melton Metrik Ma zur Bestimmung der Kupplung Kupplung misst die Unabhngigkeit zwischen Moduln
Globale Kupplung eines Programms wird abgeleitet aus den Kupplungswerten zwischen allen mglichen Modulpaaren
Kupplungstypen
Binre Relationen definiert auf Paaren von Moduln x, y
Nach dem Grad der Unerwnschtheit geordnet
0. No coupling: keine Kommunikation zwischen x und y 1. Data coupling: Kommunikation ber Parameter (Daten) 2. Stamp coupling: akzeptieren selben Record-Typ als Parameter 3. Control coupling: Kommunikation ber Parameter (Kontrolle) 4. Common coupling: Zugriff auf selbe globale Datenstruktur 5. Content coupling: x greift direkt auf interne Struktur von y zu (ndert Daten, Anweisungen)
E. Schikuta
E. Schikuta
81
82
1.3.5 Laufzeitkomplexitt Aussagen ber das Laufzeitverhalten von Algorithmen in Abhngigkeit von der Problemgre Ziel
Algorithmen zu vergleichen
int sum(int n) int s = 0; int i = 1; while(i <= n) { s = s + i; i = i + 1;} return s; }
1000,0
Ansatz
Messen der Ausfhrungszeit der einzelnen Anweisungen Bestimmen, wie oft jede Anweisung beim Programmablauf ausgefhrt wird Summe berechnen
100,0
Problem
Ausfhrungszeiten abhngig von Maschinen- bzw. Systemarchitektur, bersetzungsqualitt des Compilers, etc.
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
83
84
Probleme des simplen Ansatzes Entspricht einem Ansatz des Ausprobierens Nur punktuell mglich
bestimmte Problemgre, Datenverteilung
Ordnungsnotation Grundprinzip
Die exakten Werte der Ausfhrungszeiten sind uninteressant!
Ordnungsnotation
Man mchte Aussagen treffen (siehe Ziel), dass Algorithmus A grob gesehen gleich schnell wie Algorithmus B ist.
Durch Beschreiben der Laufzeiten von A und B ber Funktionen f(n) und g(n) wird diese Fragestellung auf Vergleich dieser Funktionen zurckgefhrt.
Man betrachtet das asymptotische Wachstum der Ausfhrungszeiten der Algorithmen bei wachsender Problemgre n.
VO Algorithmen und Datenstrukturen E. Schikuta
85
86
Big - O / / - Notation
Big-O-Notation: Eine Funktion f(n) heit von der Ordnung O(g(n)), wenn zwei Konstanten c0 und n0 existieren, sodass f(n) c0g(n) fr alle n > n0.
liefert eine Obergrenze fr die Wachstumsrate von Funktionen fO(g), wenn f hchstens so schnell wie g wchst.
z.B.: 17n2 O(n2), 17n2 O(2n)
Summen-Beispiel
Laufzeitschtzung: fsum(n) =T1+T2+n*(T3+T4+T5)+T3+T6
Messung: T1=0.1, T2=0.1, T3=0.3, T4=0.1, T5=0.1, T6=0.1 reale Werte, in der Implementierung gemessen
Big--Notation: Eine Funktion f(n) heit von der Ordnung (g(n)), wenn zwei Konstanten c0 und n0 existieren, sodass f(n) c0g(n) fr alle n > n0.
liefert eine Untergrenze fr die Wachstumsrate von Funktionen fO(g), wenn f mindestens so schnell wie g wchst.
z.B.: 17n2 (n2), 2n (n2), n37 (n2)
200
400 n
600
800
1000
- Notation: Das Laufzeitverhalten ist (n) falls gilt: f(n)=O(n) und f(n)=(n) (beschreibt das Laufzeitverhalten exakt)
VO Algorithmen und Datenstrukturen E. Schikuta
daraus folgt bezglich der Ordnung des Algorithmus fsum(n) O(n) und weiters fsum(n) (n), d.h. fsum(n) (n).
Die daraus fr unser Beispiel ableitbare Aussage lautet, dass die Laufzeit des Algorithmus direkt proportional zur Problemgre n ist
VO Algorithmen und Datenstrukturen E. Schikuta
87
88
Laufzeitvergleich (1)
Laufzeitenvergleich
Annahme vorgegebene Problemgre und unterschiedliches Laufzeitverhalten
Ordnung log n n n n log n n n n2 n3 2n Laufzeit 1.2 x sec 3.2 x 10 -4 sec 0.1 sec 1.2 sec 31.6 sec 2.8 h 31.7 a ber 1 Jahrhundert 10 -5
100
n n . log ( n ) n n 2 3 400 600 1000
Laufzeitvergleich (2)
Beschreibung des Laufzeitverhaltens
durch obere O(n) und untere Schranke (n) z.B.: T(n) = 1.5n2 + 5n - 200 O(n2), da n2 T(n) 2n2
6 1 10
800
200
3 n
0 20 40 n 60 80 100
5 8 10
2 2. n 2 1.5. n 2 n n 5. n
5 6 10 200
80 n n log ( n ) 40
5 4 10
60
5 2 10
20
0
0 200 400 n 600 800 1000
200
400 n
600
800
1000
E. Schikuta
E. Schikuta
89
90
Daher in Kombination:
T(n) = 13*n2 + 47*n 11*log2(n) + 50000 O(n2)
E. Schikuta
E. Schikuta
91
92
Rekurrenzen
Einfache Rekursion Einige wichtige Rekurrenzen
int sum(int n) { if(n <= 0) return 0; T1 if(n == 1) return 1; T2 return n + sum(n-1); T3+T(n-1) } T(n) = T1+T2+T3+T(n-1) T(n) = T(n-1) + 1 T(n) = T(n-2) + 1 + 1 T(n) = 1 + + 1 + 1 n T(n) = O(n)
VO Algorithmen und Datenstrukturen
T(n) = T(n-1)+n T(n) = n*(n+1)/2 = O(n2) T(n) = T(n/2)+1 T(n) = ld n = O(log n) T(n) = T(n/2)+n T(n) = 2*n = O(n)
T(0)=T(1)=1
T(n) = 2*T(n/2)+n T(n) = n*ld n = O(n*log n) T(n) = 2*T(n/2)+1 T(n) = 2*n = O(n)
E. Schikuta
93
94
Algorithmische Lcke
Eine algorithmische Lcke fr ein Problem existiert, falls fr die bekannten problemlsenden Algorithmen A gilt, dass ihr Aufwand grer als der ableitbare Lsungsaufwand fr das Problem P ist. Ziel:
O(A) dient zur Beschreibung des Algorithmus (P) dient zur Beschreibung des Problems
die algorithmische Lcke zu schlieen, d.h. (P) = O(A)
1.3.6 Laufzeitanalyse von rekursiven Programmen Die Laufzeitanalyse von rekursiven Programmen ist meist nicht-trivial
Bis jetzt nur taxativ gelst
Probleme
Palt Pneu
(P) O(A)
algorithmische Lcke
Algorithmen
Aneu Aalt
Laufzeitverhalten eines rekursiven Programms lsst sich durch eine Rekurrenz beschreiben Beispiel: Mergesort
if n = 1 (1) T ( n) = 2T ( n / 2) + ( n) if n > 1 wobei folgende Lsung angegeben wurde T ( n) = (n log n)
(n)
(n log n)
Geschlossene Lcke
Aufwand
O(n2)
O(n3)
Offene Lcke
Graphenisomorphie, T(Anaiv) aus O( |V|! )
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
95
96
Iterationsmethode
Umwandlung der Rekurrenz in eine Summe und Anwendung von Techniken zur Grenzwertberechnung von Summen
Mastermethode
Liefert Grenzen fr Rekurrenzen der Form T(n) = aT(n/b) + f(n), wobei a 1, b > 1 und f(n) ist eine gegebene Funktion
VO Algorithmen und Datenstrukturen E. Schikuta
Es seien a 1, b 1 und c 0 Konstante T(n) ist definiert durch aT(n/b) + (nc) wobei n/b entweder n/b oder n/b ist T(n) besitzt dann den folgenden asymptotischen Grenzwert
Fall 1: wenn c < logba dann T(n) = (nlog a) Fall 2: wenn c = logba dann T(n) = (nc log n) Fall 3: wenn c > logba dann T(n) = (nc)
b
E. Schikuta
97
98
Beispiel
Binres Suchen
int bs (int x, int z[], int l, int r) { if (l > r) // Schwelle, kein Element vorhanden return -1; // 0 verboten, da gltiger Indexwert! else { int m = (l + r) / 2; if (x == z[m]) // gefunden! return m; else if (x < z[m]) return bs(x, z, l, m-1); else // x > z[m] Fall 1: wenn c < logba dann T(n) = (nlogba) return bs(x, z, m+1, r); } Fall 2: wenn c = logba dann T(n) = (nc log n) } Fall 3: wenn c > logba dann T(n) = (nc)
Weitere Beispiele
Fall 1: wenn c < logba dann T(n) = (nlogba) Fall 2: wenn c = logba dann T(n) = (nc log n) Fall 3: wenn c > logba dann T(n) = (nc)
Beispiel: Mergesort
a = 2, b = 2, c = 1
a = 1, b = 2, c = 0
99
100
Kapitel 2: Datenstrukturen
Strukturkomplexitt
McCabe, Henry-Kafura, Fenton
Laufzeitkomplexitt
Ordnungsnotation, Algorithmische Lcke, Master Theorem
E. Schikuta
E. Schikuta
101
102
2.1 Situation
Jim Gray, 97
3 /sheet Platte:
disk (4 GB =) 500$ ASCII: 2 m pages
NY People Berk
Name Address Papers Picture Voice
Austin
Won Austin
Paperless office Library of congress online All information online entertainment publishing business Information Network, Knowledge Navigator, Information at your fingertips
E. Schikuta VO Algorithmen und Datenstrukturen
(100x cheaper) 0.025 /sheet Image: 200 k pages (10x cheaper) .25 /sheet Conclusio: Speichere alles auf Platten
E. Schikuta
103
104
Moores Law XXX verdoppelt sich alle 18 Monate 60% Steigerung pro Jahr
Micro Prozessor Geschwindigkeit Chip Dichte Magnetische Platten Dichte Kommunikationsbandbreite 1GB 128MB WAN Bandbreite 1 chip memory size 8MB ( 2 MB to 32 MB) nhert sich LAN
1MB 128KB 8KB 1970 1980 1990 2000
Wettervorhersage
Zirkulationsmodelle der Atmosphre und der Ozeane
1000 Jahre Simulation, 150 km2 Auflsung, 0.2 simulierte Jahre / Maschinenstunde Ein Durchlauf auf Intel Touchstone Delta 57 Wochen
E. Schikuta
105
106
Beispiele (2)
CERNs Herausforderung: Datagrid Neuer Beschleuniger LHC mit 4 Detektoren
Large Hadron Collider, 14 TeV Ziele: Suche nach Higgs Boson und Graviton (et al.) Start 2007
Detector Online Readout multi-level trigger filter out background reduce data volume
26,7 km Umfang 100 Meter tief
40 M
leve l1-
Hz
Ziele
Weltweiter Zugriff auf die Daten
CERN und Regional Centers (Europa, Asien, Amerika) 2000 Benutzer
B/se spec c) 7 ial h leve 5 KH z (75 ardwa l2 5 K embedde GB/sec) re Hz dp leve (5 GB/ rocesso sec) l3rs 10 P (100 0 Hz Cs M
(40 T
E. Schikuta
107
108
10500 Knoten 2.1 Petabyte Platten Platz 340 Gigabyte IO Bandbreite Tapes ???
Library of Congress (in ASCII) enthlt 0.025 Petabyte Aktuelle und zuknftige Projekte generieren weit mehr Daten Auf uns warten Exa-, Zeta-, Yotta Byte !!!
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
109
110
Geschwindigkeit: Speicherzugriffszeiten
Wie weit sind die Daten entfernt ?
SternbildAndromdeda Andromeda Tape /Optical Robot
Pluto
2.2 Motivation Beispiel: 100 Telefonnummern zu verwalten Ein Haufen Zettel mit Namen und Nummern
Finden einer Telefonnummern durch sequentielle Suche bentigt im Durchschnitt 50 Zugriffe
10 9 Clock Ticks
2,000 Years
106 Disk
2 Years
100 10 2 1
Linz Sacramento
1.5 hr
Rolodex
Zettel sortiert, in Ordnern und mit Namensindex Ziel mit einem (1!) Zugriff gewnschte Nummer
VO Algorithmen und Datenstrukturen E. Schikuta
111
112
Datenstrukturen
Erfllung dieser Ziele fhrte zur Entwicklung von
Datenstrukturen
Datenstrukturen dienen zur Verwaltung groer Mengen hnlicher Objekte
Unterschiedliche Datenstrukturen dienen zur Verwaltung unterschiedlicher Objekte, die durch unterschiedliche Eigenschaften charakterisiert sind, daraus folgt:
Qualitative Ziele
Untersttzung spezifischer Zugriffsarten auf Eigenschaften bzw. Charakteristiken der Daten
E. Schikuta
E. Schikuta
113
114
Beispiel: Telefonbuchverwaltung
Suche in einem Telefonbuch mit 2000000 Eintrgen
Annahme: Zugriff auf einen Datensatz in 0,01 ms
2.3 berblick Alle bekannten Datenorganisationsformen bauen auf einigen wenigen einfachen Techniken auf Sequentielle Techniken
Listen Stack, Queue
Baumstrukturen
Sequentiell Baumstruktur
100
10
Hashverfahren
Dictionary, Hash Tabelle, Kollisionsverfahren
VO Algorithmen und Datenstrukturen E. Schikuta
Hashverfahren
0,1
E. Schikuta
115
116
Liste Eine Liste (list) dient zur Verwaltung einer beliebig Anzahl von Elementen eines einheitlichen Typs.
Die Elemente werden in einer Sequenz angeordnet, die sich (meist) aus der Eintragereihenfolge ableiten lsst (ungeordnet). Der Aufwand des Zugriffes auf ein einzelnes Element ist abhngig von der Position in der Sequenz.
... Kopf Ende
Queue (Schlange)
Elemente werden nach dem FIFO (first-in, first-out) Prinzip verwaltet
Anwendungen: Warteschlangen, Bufferverwaltung, Prozessmanagement, Stoffwechsel
Anwendungen
sequentielle Datenbestnde, groe Datenmengen, externe Speicherung
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
117
118
Baum Der Baum (tree) stellt eine Generalisierung der Liste auf eine 2-dimensionale Datenstruktur dar.
besteht aus Knoten und Kanten Exponentieller Zusammenhang zwischen Tiefe des Baumes und Anzahl der Knoten Anwendungen: allgemeine Schlsselverwaltung, Haupt- und Externspeichermanagement
Heap
ungeordneter binrer Baum, Warteschlangen
B+-Baum
balanzierter Mehrwegbaum, Externspeicherverwaltung, Datenbanksysteme
Trie
Prefix-Baum, Zeichenkettenverwaltung, Wrterbcher
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
119
120
Vektor Ein Vektor (vector, Feld) verwaltet eine fix vorgegebene Anzahl von Elementen eines einheitlichen Typs.
Zugriff auf ein Element ber einen ganzzahligen Index (die Position im Vektor) Aufwand des Zugriffes fr alle Elemente konstant
x0 x1 x2 xn-1 xn
Dictionary
Der Index eines Elementes kann beliebigen Typ haben und wird mit dem Element gemeinsam gespeichert Anwendungen: Verwaltung komplexer (zusammengesetzter) Informationen, Zuordnungslisten
Anwendungen
Verwaltung fix vorgegebener Anreihungen, Strings, math. Konzepte
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
121
122
Vergleichskriterien Dynamik
Datenverwaltung
Einfgen, Lschen
Informeller Vergleich
Datenstruktur
Liste
Strken
dynamisch beliebige Datenmenge klares Modell geringer Speicherplatz dynamisch beliebige Datenmenge logarithmischer Aufwand der Operationen dynamisch direkter Elementzugriff konstanter Aufwand der Operationen
Schwchen
linearer Aufwand der Operationen simples Modell Balanzierungsalgorithmen aufwendigerer Speicherplatzverbrauch komplexes Modell oft fixe Datenmenge eingeschrnkte Operationen
Datenmenge
beliebige oder fixe Anzahl von Elementen
Aufwand
Laufzeit der Operationen Speicherplatzverbrauch
Baum
Modell
Operationenumfang
Vektor
E. Schikuta
E. Schikuta
123
124
Datenstrukturen
Typen Vergleichskriterien
Listen
E. Schikuta
E. Schikuta
125
126
3.1 Definition Listen Eine (lineare) Liste ist eine Datenstruktur zur Verwaltung einer beliebig groen Anzahl von Elementen eines einheitlichen Typs.
Der Zugriff auf die einzelnen Elemente einer (simplen) Liste ist nur vom Kopf (Head) aus mglich. Das Ende der Liste wird auch als Tail bezeichnet. Die Elemente werden in einer Sequenz angeordnet, die sich (meist) aus der Eintragereihenfolge ableiten lt (ungeordnet).
... Kopf
VO Algorithmen und Datenstrukturen
Ende
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
127
128
Liste Definition:
Eine Liste L ist eine geordnete Menge von Elementen L = (x1, x2, , xn) Die Lnge einer Liste ist gegeben durch |L| = |(x1, x2, , xn)| = n Eine leere Liste hat die Lnge 0. Das i-te Element einer Liste L wird mit L[i] bezeichnet, daher gilt 1 i |L| Einfgen
Element am Kopf einfgen
Zugriff
Kopfelement bestimmen
Lschen
Kopfelement entfernen
Erzeugen
Liste neu anlegen
Lngenbestimmung
Anzahl der Elemente bestimmen
Inklusionstest
Test, ob Element enthalten ist
E. Schikuta
E. Schikuta
129
130
x0
x1
x2
...
x1
x0
VO Algorithmen und Datenstrukturen
x1
x2
...
xn
E. Schikuta
131
132
x2
VO Algorithmen und Datenstrukturen
x3
...
xn
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
133
134
x1
x2
...
n
liefert den ganzzahligen Wert n
x1
...
...
true
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
135
136
zur Verwendung in der Klassen Def., besserer Ansatz mit C++ Templates
22200 22208 22216 22224 22232 22240 22248 22256 22264 22200 22208 22216 22224 22232 22240 22248 22256 22264
E. Schikuta
E. Schikuta
137
138
Memory Typen
Contiguous memory
Physisch zusammenhngender Speicherplatzbereich, uerst starr, da beim Anlegen die endgltige Gre fixiert wird. Verwaltung ber das System. Datenstrukturen auf der Basis von contiguous memory knnen nur eine begrenzte Anzahl von Elementen aufnehmen.
Zugriff
<Feldname>[index] z.B.: x[0] = 3.1415 * r * r; a[9999] = 0;
E. Schikuta
E. Schikuta
139
140
Achtung:
p = 0 // erlaubt, // Initialisierung p = 4711 // verboten // Adressmanipulation
Operatoren
x p 22192 22200
3.14158 22192
& ... liefert die Adresse des Objekts * ... dereferenziert den Zeiger und liefert den Inhalt der ref. Objektes -> ... Zugriff auf eine Strukturkomponente ber einen Zeiger, d.h. x->y entspricht (*x).y
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
141
142
Zerstren
List::~List() {p = 0;}
Einfgen
void List::Add(ItemType a) { if(p < 8) { list[p] = a; p++; } else cout << "Error-add\n"; }
E. Schikuta
E. Schikuta
143
144
Zugriff
ItemType List::FirstElement() { if(p > 0) return list[p-1]; else cout << "Error-first\n"; }
Inklusionstest
int List::Member(ItemType a) { int i = 0; while(i < p && list[i] != a) i++; if(i < p) return 1; else return 0; }
Lschen
void List::RemoveFirst() { if(p > 0) p--; else cout << "Error-remove\n"; }
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
145
146
Rekursive Datenstruktur Eine Datenstruktur heit rekursiv oder zirkulr, wenn sie sich in ihrer Definition selbst referenziert
Basismodell fr dynamisch erweiterbare Datenstrukturen
Liste class Element{ InfoType Info; Element* Next; } Baum class Node { KeyType Key; Node* LeftChild; Node* RightChild; }
VO Algorithmen und Datenstrukturen E. Schikuta
head
E. Schikuta
147
148
E. Schikuta
E. Schikuta
149
150
E. Schikuta
E. Schikuta
151
152
?
E. Schikuta VO Algorithmen und Datenstrukturen
E. Schikuta
153
154
Liste - Traversieren
Sequentielles Abarbeiten einer Liste, Besuchen aller Elemente
head 1. Initialisieren des Hilfszeigers
help = head;
help head
0
3.3 Stack
Der Stack (Kellerspeicher) ist ein Spezialfall der Liste, die die Elemente nach dem LIFO (last-in, first-out) Prinzip verwaltet
Idee des Stacks: Man kann nur auf das oberste, zuletzt daraufgelegte Element zugreifen (vergleiche Buchstapel, Holzsto, ...)Anwendungen: Kellerautomaten, Speicherverwaltung, HP-Taschenrechner (UPN), ...
help
Das Verhalten des Stacks lsst sich ber seine (recht einfachen) Operationen beschreiben
push: Element am Stack ablegen top: Auf oberstes Element des Stacks zugreifen pop: Element vom Stack entfernen isEmpty: Test auf leeren Stack ?
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
155
156
Stack als Liste Stack ist eine spezielle Liste, daher knnen die Stackoperationen durch Listenoperationen ausgedrckt werden.
Push(S,a) Top(S) Pop(S) Add(S,a) FirstElement(S) RemoveFirst(S)
Methode Top
Liefert den Inhalte des obersten Elementes des Stacks.
0
0
1 2
0
IsStackEmpty(S)
wenn Length(S) = 0 return true sonst false
Methode Pop
Oberstes Element des Stacks wird entfernt.
VO Algorithmen und Datenstrukturen
1
2
E. Schikuta
E. Schikuta
157
158
3.4 Queue
Die Queue (Warteschlange) ist ein Spezialfall der Liste, die die Elemente nach dem FIFO (first-in, first-out) Prinzip verwaltet
Idee: Die Elemente werden hintereinander angereiht, wobei nur am Ende der Liste Elemente angefgt und vom Anfang der Liste weggenommen werden knnen Anwendungen: Warteschlangen, Bufferverwaltung, Stoffwechsel, Prozessmanagement,
Einfache Operationen
Enqueue
Element am Ende der Queue ablegen
Methode Front
Liefert den Inhalte des ersten Elementes der Queue
2
1
2
Front
Erstes Element der Queue zugreifen
Dequeue
Erstes Element aus der Queue entfernen
Methode Dequeue
Erstes Element der Queue wird entfernt
E. Schikuta VO Algorithmen und Datenstrukturen
1 2
IsQueueEmpty
Test auf leere Queue
VO Algorithmen und Datenstrukturen
E. Schikuta
159
160
Queue als Liste Queue ist ebenfalls eine spezielle Liste, daher sollten alle Queueoperationen auch durch Listenoperationen ausgedrckt werden knnen.
Enqueue(Q,a) Front(Q) Dequeue(Q) Add(S,a) ? Nicht trivial ! ?
Front(Q) Front(Q)
ItemType e; // Hilfselement List L; // Hilfsliste int n = Q.Length(); for (int i = 1; i <= n - 1; i++) { L.Add(Q.FirstElement()); Q.RemoveFirst(); } e = Q.FirstElement(); n = L.Length(); for (i = 1; i <= n; i++) { Q.Add(L.FirstElement()); L.RemoveFirst(); } return e;
Mglichkeit (umstndlich!)
Zugriff auf das erste Queueelement (letzte in der Liste) durch iteratives Entfernen aller Elemente und gleichzeitigen Aufbau einer gestrzten Hilfsliste. Danach Vorgang umkehren.
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
161
162
Dequeue Dequeue(Q)
List L; int l = Q.Length(); for (int i = 1; i <= n - 1; i++) { L.Add(Q.FirstElement()); Q.RemoveFirst(); } Q.RemoveFirst(); int n = L.Length(); for (i = 1; i <= n; i++) { Q.Add(L.FirstElement()); L.RemoveFirst(); }
x1
x2
...
xn
xi
C++-Methode: ItemType AccessElement(position i);
E. Schikuta E. Schikuta VO Algorithmen und Datenstrukturen
163
164
Methode AccessElement
ItemType List::AccessElement(int pos) { Element* act = head; int actpos = 1; while(actpos < pos) { act = act->next; actpos++; } return act->value; }
Queue als Liste (2. Versuch) Neuerlicher Definitionsansatz mit zustzlicher Listenoperation etwas einfacher, aber ...
Enqueue(Q,a) Add(Q,a) Front(Q) AccessElement(Q,Length(Q)) Dequeue(Q) ? RemoveElement(Q, Length(Q))
Mglichkeit:
Analog zu positionsbezogener Zugriffsfunktion eine positionsbezogene Teilungsfunktion entwerfen, die eine Liste an einer vorgegebener Stelle in 2 Teillisten zerlegt.
E. Schikuta
E. Schikuta
165
166
Methode RemoveElement
void List::RemoveElement(int pos) { Element* pred, * act; int actpos = 2; if(pos == 1) RemoveFirst(); erstes Element else { pred = head; act = head->next; while(act != 0 && actpos < pos) { pred = act; act = act->next; 2 Hilfszeiger actpos++; } if(act == 0) return; pred->next = act->next; delete act; } }
VO Algorithmen und Datenstrukturen E. Schikuta
head
0 Position:
VO Algorithmen und Datenstrukturen
i-1
i+1
E. Schikuta
167
168
Methode AddElement
Analog auch AddElement mgl.: Einfgen an beliebiger Stelle
void List::AddElement(ItemType a, int pos) { Element* pred, * act; int actpos = 2; if(pos == 1) Add(a); erstes Element else { pred = head; act = head->next; while(act != 0 && actpos < pos) { pred = act; act = act->next; 2 Hilfszeiger actpos++; } pred->next = new Element; pred->next->value = a; pred->next->next = act; } }
VO Algorithmen und Datenstrukturen E. Schikuta
Queue
class Queue { public: Queue(); bool Enqueue(ItemType a); ItemType Front(); bool Dequeue(); bool IsQueueEmpty(); }
E. Schikuta
169
170
Vergleich "unserer" Datenstrukturen Generelle Unterscheidung zwischen statischer und dynamischer Realisierung
statische R.: contigous memory, Felder dynamische R.: dynamic memory, dynamische Objekte
Konstruktor Destruktor Add FirstElement RemoveFirst Length Member
Datenverwaltung
Einfgen und Lschen wird untersttzt
Datenmenge
statische R.: beschrnkt, abhngig von der Feldgre dynamische R.: unbeschrnkt
abhngig von der Gre des vorhandenen Speicherplatzes
171
172
Circular List
Zirkulr verkettete Liste
Ordered List
Geordnete Liste
IsStackEmpty O(1)
IsQueueEmpty O(1)
E. Schikuta
E. Schikuta
173
174
jedes Element besitzt 2 Zeiger, wobei der eine auf das vorhergehende und der andere auf das nachfolgende Element zeigt Basis-Operationen einfach
class Node { KeyType Key; Node* Pred; Node* Succ; }
VO Algorithmen und Datenstrukturen
175
176
17
Tail Head
x1
x2
x3
x4
E. Schikuta
E. Schikuta
177
178
Bume
E. Schikuta
179
180
4.1 Definition Bume Ein Baum (tree) ist ein spezieller Graph, der eine hierarchische Struktur ber eine Menge von Objekten definiert
Intuitives Vorstellungsmodell - Nicht-lineare Datenstruktur Anwendungen
Reprsentieren Wissen, Darstellung von Strukturen, Abbildung von Zugriffspfaden, Analyse hierarchischer Zusammenhnge, ... Stammbaum
Cronus Zeus Poseidon Demeter Persephone
Beispiel Bume
Prozessorfamilien
8088 68000 68020 68030 68040
Spezialfall Liste
E. Schikuta
E. Schikuta
181
182
Definition Bume (1) Ein Baum besteht aus einer Menge von Knoten, die durch gerichtete Kanten verbunden sind
Ein Pfad oder Weg ist eine Liste sich unterscheidender Knoten, wobei aufeinander folgende Knoten durch eine Kante verbunden sind
Komponenten Die Wurzel ist der einzige Knoten mit nur wegfhrenden Kanten Knoten von denen keine Kanten wegfhren heien Blatt (leaf) Pfad/Weg von der Wurzel Wurzel zum Blatt Knoten, in die Kanten hinein- und von denen Knoten (interner) Kanten wegfhren, heien interne Knoten
Kante Blatt
Es gibt genau einen Pfad der 2 Knoten miteinander verbindet und jeder Knoten hat nur einen direkten Vorgnger; alle Vorgnger sind von ihm selbst verschieden (definierende Eigenschaft eines Baumes)
Ein Baum enthlt daher keine Kreise, d.i. ein Pfad bei dem der Startknoten gleich dem Endknoten ist
E. Schikuta
E. Schikuta
183
184
Ungltige Bume
E. Schikuta
E. Schikuta
185
186
Lnge, Hhe, Tiefe Die Lnge eines Weges zwischen 2 Knoten entspricht der Anzahl der Kanten auf dem Weg zwischen den beiden Knoten Die Hhe eines Knoten ist die Lnge des lngsten Weges von diesem Knoten zu den erreichbaren Blttern Die Tiefe eines Knoten ist die Lnge des Weges zur Wurzel Die Hhe eines Baumes entspricht der Hhe der Wurzel
VO Algorithmen und Datenstrukturen E. Schikuta
r2 ... T2
rk Tk
E. Schikuta
187
188
Tiefe (depth)
<stmt> ::= <select-stmt> | <expr> <select-stmt> ::= if ( <expr> ) <stmt> else <stmt> <expr> ::= <relational-expr> | <assign-expr> | ident <relational-expr> ::= <expr> < <expr> <assign-expr> ::= ident = <expr>
Nonterminal Symbole (werden aufgelst) if, ident Terminalsymbole (nicht mehr aufgelst) ::=, | Grammatiksymbolik
E. Schikuta
E. Schikuta
189
190
Spezielle Bume
Bume (trees)
else
<stmt> <expr>
ident b
Die Ordnung bezieht sich auf die Position der Knoten im Baum (Knoten A links von Knoten B) und nicht auf die Werte der Knotenelemente
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
191
192
4.2 Binre Bume Binre Bume sind geordnete Bume, in denen jeder Knoten maximal 2 Kinder hat und die Ordnung der Knoten mit links und rechts festgelegt ist
Binrer Baum mit 2 Kindern Binrer Baum mit rechtem Kind (right child) Binrer Baum mit linkem Kind (left child) Binrer Baum ohne Kind (Blatt)
VO Algorithmen und Datenstrukturen E. Schikuta
In jeder neuen Ebene wird im optimalen Fall die Anzahl der Bltter verdoppelt
Entartung mglich: Jeder Knoten hat genau ein Kind entspricht linearer Liste
VO Algorithmen und Datenstrukturen E. Schikuta
193
194
E. Schikuta
E. Schikuta
195
196
Zusammenhang zwischen Knoten/Bltter und Hhe: O(n) Knoten/Bltter : O(log n) Hhe wichtigste
Eigenschaft von Bumen
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
197
198
Eigenschaft
Ein kompletter binrer Baum mit n Knoten hat eine Hhe von maximal h = log2 n
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
199
200
Baum Traversierung Traversieren eines Baumes bezeichnet das systematische Besuchen aller seiner Knoten
Unterschiedliche Methoden unterscheiden sich in der Reihenfolge der besuchten Knoten Mgliche Reihenfolgen A, B, C B, A, C B, C, A
Expression Tree
Systematische Auswertung eines mathematischen Ausdrucks Ein mathematischer Ausdruck kann in Form eines Expression Trees angegeben werden
+
(20 / 5) + 3
/ 3
20
Bltter reprsentieren Operanden (Zahlenwerte), interne Knoten Operatoren Baumdarstellung erspart Klammernnotation
E. Schikuta
E. Schikuta
201
202
Traversierungsalgorithmus
Traversierungsalgorithmen bestehen prinzipiell aus 3 verschiedenen Schritten
Bearbeiten eines Knotens (process node) Rekursiv besuchen und bearbeiten des linken Kindes (visit left child) Rekursiv besuchen und bearbeiten des rechten Kindes (visit right child)
Preorder Traversierung
Algorithmus
preorder(node) { if(node != 0) { process(node) preorder(left child) preorder(right child) } }
Beispiel
20/5+3
+
A
3
B C
20
Faustregel
Knoten bearbeiten beim 1. Besuch
Anwendung
LISP, Assembler
Process-Reihenfolge: Notation-Reihenfolge:
ABCDE + / 20 5 3
E. Schikuta
E. Schikuta
203
204
Postorder Traversierung
Algorithmus
postorder(node) { if(node != 0) { postorder(left child) postorder(right child) process(node) } }
Inorder Traversierung
Algorithmus
Beispiel
20/5+3
+
A
3
Postfix-Notation-Reihenfolge
(Operand1, Operand2, Operator)
B C
20
Beispiel
20/5+3
+
A
3
B C
20
Infix-Notation-Reihenfolge
5
Faustregel
Knoten bearbeiten beim letzten Besuch
Faustregel
Process-Reihenfolge: Notation-Reihenfolge: CDBEA 20 5 / 3 + Knoten bearbeiten beim 2. oder letzten Process-Reihenfolge: Besuch Notation-Reihenfolge: einfacher algebraischer Taschenrechner (ohne Klammern)
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
Anwendung
Invers Polish Notation, HP Taschenrechner, FORTH
Anwendung
CBDAE 20 / 5 + 3
205
206
4.3 Binre Suchbume In einem Binrbaum besitzt jeder (interne) Knoten eine linke und eine rechte Verbindung, die auf einen Binrbaum oder einen externen Knoten verweist
Verbindungen zu externen Knoten heien Nullverbindungen, externe Knoten besitzen keine weiteren Verbindungen
Schlsseleigenschaft im BST Fr jeden internen Knoten gilt, dass alle Werte der Nachfolger im linken Unterbaum kleiner (oder gleich) dem Knotenwert und die Werte der Nachfolger im rechten Unterbaum grer als der Interne Knotenwert sind
12 <= > 3 10 11 15 21
Knoten Externe Knoten
Reprsentieren quasi die Datenspeicher (enthalten nur mehr Schlssel und Daten, keine Zeiger auf Nachfolger), z.B. Seiten auf der Platte Bei Hauptspeicherstrukturen meist vernachlssigbar
werden im Weiteren grafisch oft nur mehr durch einen Strich dargestellt
VO Algorithmen und Datenstrukturen E. Schikuta
Ein binrer Suchbaum (binary search tree, BST) ist ein Binrbaum, bei dem jeder interne Knoten einen Schlssel besitzt
externe Knoten besitzen keine Schlssel Auf den Schlsseln ist eine lineare Ordnung < definiert
Wenn x und y verschieden sind, so gilt x<y oder y<x; ist x<y und y<z, dann gilt auch x<z
VO Algorithmen und Datenstrukturen E. Schikuta
207
208
Operationen
Effiziente Administration
Aufwand proportional zur Hhe des Baumes und nicht zur Anzahl der Elemente Einfgen, Zugriff und Lschen im Durchschnitt von O(log n) Signifikante Verbesserung im Vergleich zum linearen Aufwand (O(n)) bei Liste Zugriff auf Elemente in sortierter Reihenfolge durch inorder Traversierung
Einfgen
Einfgen eines Elementes in den Baum unter Bercksichtigung der Ordnungseigenschaft
Suche
Test auf Inklusion
Lschen
Entfernen eines Elementes aus dem Baum unter Erhaltung der Ordnungseigenschaft
Ausgabe
Ausgabe aller Elemente in sortierter Reihenfolge
...
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
209
210
Klassendefinition
typedef int ItemType; class SearchTree { class node { public: node public ItemType info; node * leftchild, * rightchild; node(ItemType x, node * l, node * r) {info=x; leftchild=l; rightchild=r;} }; typedef node * link; link root; void AddI(ItemType); void AddR(link&, ItemType); bool MemberI(ItemType); bool MemberR(link, ItemType); node void PrintR(link, int); public: SearchTree(){root = 0;} leftchild info rightchild void Add(ItemType); int Delete(ItemType); bool Member(ItemType); void Print(); };
Einfachheitshalber in alles
E. Schikuta
E. Schikuta
211
212
Suche (iterativ)
bool SearchTree::MemberI(ItemType a) { if(root) { link current = root; while(current) { if(current->info == a) return true; if(a < current->info) current = current->leftchild; else current = current->rightchild; } } return false; } bool SearchTree::Member(ItemType a) { return MemberI(a); }
Suche (rekursiv)
bool SearchTree::MemberR(link h, ItemType a) { if(!h) return false; else { if(a == h->info) return true; if(a < h->info) return MemberR(h->leftchild, a); else return MemberR(h->rightchild, a); } } bool SearchTree::Member(ItemType a) { return MemberR(root, a); } Aufruf: SearchTree t; t.Member(7);
Aufruf:
SearchTree t; t.Member(7); Verzweigung auf root->leftchild, da root->info > a (d.I. 12 > 7) 12 15
E. Schikuta
E. Schikuta
213
214
Einfgen in einem binren Suchbaum Das Einfgen entspricht einer erfolglosen Suche (wobei gleiche Schlssel bergangen werden) und dem Anfgen eines neuen Knotens an der Nullverbindung wo die Suche endet (anstelle des externen Knotens)
Einfgen 13 Suche
12 7 3 11 15 21 3 7 11 13
Einfgen (iterativ)
hnlich dem Einfgen in eine Liste (2 Hilfszeiger)
void SearchTree::AddI(ItemType a) { Aufruf: if(root) { link current = root; SearchTree t; link child; current, child while(1) { t.Add(7); if(a <= current->info) { child = current->leftchild; if(!child) {current->leftchild = new node(a, 0, 0); return;} } else { child = current->rightchild; if(!child) {current->rightchild = new node(a, 0, 0); return;} } current = child; } } else { current root = new node(a, 0, 0); return; child } } 12 void SearchTree::Add(ItemType a) { AddI(a); 7 15 }
Hilfszeiger:
Knoten anfgen
12 15 21
E. Schikuta
E. Schikuta
215
216
Einfgen (rekursiv)
void SearchTree::AddR(link& h, ItemType a) { if(!h) {h = new node(a, 0, 0); return;} if(a <= h->info) AddR(h->leftchild, a); Man beachte die Verwendung eines Referenzparameters else (link&), erspart die 2 AddR(h->rightchild, a); Hilfszeiger } void SearchTree::Add(ItemType a) { AddR(root, a); }
Traversieren
void SearchTree::PrintR(link h, int n) { if(!h) return; Inorder PrintR(h->rightchild, n+2); Traversierung for(int i = 0; i < n; i++) cout << " "; cout << h->info << endl; PrintR(h->leftchild, n+2); } void SearchTree::Print() { PrintR(root, 0); Gibt Baum um 90 Grad gegen den }
Aufruf
SearchTree t; t.Add(7);
Aufruf
SearchTree t; t.Print();
E. Schikuta
E. Schikuta
217
218
Lschen (2)
Lschen von Knoten 3 durch Ersetzen des linken Kindzeigers von Knoten 7 durch eine Nullverbindung (externer Knoten)
12 7 3 11 15 21
7
12 15 11 21
Flle 1 und 2 sind einfach durch Anhngen des verbleibenden Teilbaums an den Elternknoten des zu lschenden Knotens zu lsen. Fr Fall 3 muss ein geeigneter Ersatzknoten gefunden werden. Hierzu eignen sich entweder der kleinste im rechten (Inorder Nachfolger) oder der grte im linken Teilbaum (Inorder Vorgnger)
VO Algorithmen und Datenstrukturen E. Schikuta
Fall 2
Lschen von Knoten 15 durch Einhngen des Knoten 21 als rechtes Kind von 12
12 7 11 15 21
7
12 21 11
E. Schikuta
219
220
Lschen (3)
Fall 3
7 3 11 12 15 21
Laufzeit
Erwartungswert der Einfge- und Suchoperationen bei n zuflligen Schlsselwerten ist ungefhr 1,39 ld n Im ungnstigsten Fall kann der Aufwand zu ungefhr n Operationen entarten Beispiele fr ungnstige Suchbume
3 3 7 11 12 15 21 11 12 7 15 21
Im Falle des Lschens von 12 eignen sich als Ersatz die Knoten mit den Werten 11 (grte im linken) oder 15 (der kleinste im rechten Teilbaum). Dies resultiert in 2 mglichen Bumen:
11 7 3 15 21 3 7 11 15 21
Somit muss der Lschvorgang fr Fall 3 in zwei Teile zerlegt werden: 1. Finden eines geeigneten Ersatzknotens 2. Ersetzen des zu lschenden Knotens (was wiederum aus dem Entfernen des Ersatzknotens aus seiner ursprnglichen Position (entspricht Fall 1 oder 2) und dem Einhngen an der neuen Stelle besteht)
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen
E. Schikuta
221
222
Datenmenge
unbeschrnkt
Modelle
Hauptspeicherorientiert Untersttzung komplexer Operationen
Bereichsabfragen, Sortierreihenfolge
Laufzeit
223
224
Einfgen in einen AVL Baum Das Einfgen verluft analog zum Einfgen im binren Suchbaum
4 46 5 46
Beispiel
4 46 2 17 3 78 1 32 2 50 1 88 0 0 1 48 62 1 0 00 0 1 48 62 1 2 50 1 88 3 78
Einfgen 54
2 17 1 32
4 78 3 50 1 88
Hhen sind neben den 2 17 Knoten angegeben Anmerkung: externe Knoten 0 nicht vergessen, sie haben die 1 32 Hhe 0!
Problem: die Balanzierungseigenschaft kann durch das Einfgen verletzt werden d.h. Korrektur notwendig
1 48 62 2
1 54
E. Schikuta
E. Schikuta
225
226
Einfgen Beispiel
Fall 1
B A
C
eigentlich T4 T3
Fall 2
A
4 46 2 17 1 32 1 4 78 3 50 88
T4
B B A C
T1 T2
T4
2 17
Doppelte Rotation
3 62 2 50 1
T3
1 32 1
2 78 1 88
T4
T1
T2
T3
48
T1
62 2
Einfache Rotation
T1
Doppelte Rotation
T4
48
T3 T1
54
T2
T2
T3
1 54
T2
VO Algorithmen und Datenstrukturen
E. Schikuta
227
228
Einfache Rotationen
Nach Einfgen eines Elementes ( ) Baum nicht mehr balanziert Durch Symmetrie 2 einfache Rotationsflle zu unterscheiden B A
LL-Rotation
2 3 1 2
Doppelte Rotationen
Die doppelte Rotation besteht eigentlich aus 2 einfachen Rotationen Die RL Rotation aus einer LL Rotation des rechten Subbaumes und danach einer RR Rotation des gesamten Baumes der nicht balanziert ist (die LR Rotation funktioniert entsprechend umgekehrt)
Ausgangspunkt A C B
1 2 3 4
Zwischenphase
RL-Rotation 1.Phase: LL Rotation
Ergebnis
RL-Rotation 2.Phase: RR Rotation
A B C
1 2 3
LL-Fall
1
B B
RR-Rotation
3 1
RR-Fall
1 2
A
3
Fall Bestimmung 1. Ausgehend vom Knoten, bei dem die Balanzierung verletzt ist, berprft man, welcher Teilbaum lnger ist (L oder R). 2. Danach beim Kindknoten im nicht balanzierten Teilbaum feststellen, welcher weiterer (Sub)Teilbaum lnger ist (L oder R) (bei gleicher Lnge einfacher Fall)
B A
2 3
C A B
4
C B A
3
B A C
2 3
E. Schikuta
E. Schikuta
229
230
4 7
LR Rot.
4 5
7 unbal.
0
3 2 1 0 4
5 5
RR Rot.
3 unbal.
3 1
2
2 0
2 1 3
5 7
2 bal.
1
0 0
4
1 0
0 0
3
0 0
5
simpel
5 7
1 unbal.
2 1 0 3
4
1 0
4 3
4 5
0 2
4 2
4
0 0 0
5
LL Rot.
unbal.
2
1 1
RL Rot.
2 1 3 5
6 7
2
0
2 1 4
7
0
1
0
3
0 0
7
1 0 0
6
0
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
231
232
Lschen im AVL Baum Das Lschen funktioniert analog zum Lschen im binren Suchbaum Gelschte Knoten knnen zu nicht balanzierten Bumen fhren Lsung durch Rotationen analog zum Einfgen
Eine (Lsch) Rotation kann aber die Balanzierung eines anderen Knoten verletzen Daher kann ein Lschvorgang eine Serie von Rotationen auslsen um Unbalanziertheiten vom Lschort bis zur Wurzel aufzulsen Die ist unterschiedlich zum Einfgen, wo mit einer Rotation die Unbalanziertheit behoben werden kann
VO Algorithmen und Datenstrukturen E. Schikuta
5 8
4 LL Rot.
5 8
8 simpel
2 1 3 6 7
2 1 3 6
7 10 9
7 RR Rot.
6 RR Rot.
4 6
7 9
10 11 3 2 1 7 9
10 9 7 11
11 10 3 9 11
10 11
5 simpel
10 11
2 RL Rot.
3 1 9
10 11
1 simpel
7 3 9 10 11
E. Schikuta
233
234
4.5 Mehrwegbume sind Bume mit Knoten, die mehr als 2 Kinder besitzen knnen
Intervallbasierten Suchdatenstrukturen
k1
x < k1
Datenmenge
unbeschrnkt
Modelle
Hauptspeicherorientiert Untersttzung komplexer Operationen
Bereichsabfragen, Sortierreihenfolge
k2 ... km-1 p1
km pm-1
km x
p0
k1 x < k2
km-1 x < km
pm
Laufzeit
Speicherplatz Rotation Zugriff Einfgen Lschen Sortierreihenfolge
VO Algorithmen und Datenstrukturen
Heuristische Analyse (Wirth 79) zeigt, dass eine Rotation bei jeder 2-ten Einfgeoperationen und nur bei jeder 5-ten Lschoperation vorkommt Die Hhe eines AVL-Baumes mit n Knoten ist 1.45 log n, d.h. hchstens 45 % grer als erforderlich.
E. Schikuta
Knoten besteht aus einer Menge von m Schlsselwerten k1, k2, , km und m+1 Verweisen (Kanten) p0, p2, , pm, sodass fr alle Schlssel xj im Unterbaum, der durch pi referenziert wird, gilt ki xj < ki+1 (Schlssel liegen im Intervall [ki, ki+1[).
Beispiel
3 9
11 37 13 39 41 53
E. Schikuta
235
236
Suchen im Mehrwegbaum
hnlich zur Suche im binren Suchbaum Bei jedem internen Knoten mit Schlsseln k 1, k2, , km und Verbindungen p0, p1, , pm
Suchschlssel s = ki (i = 1, , m): Suche erfolgreich S k1: fortsetzen im Unterbaum p0 ki s < ki+1: fortsetzen im Unterbaum pi s > km: fortsetzen im Unterbaum pm Falls man einen externen Knoten erreicht: Suche erfolglos
2-3-4 Bume Ein 2-3-4 Baum ist ein Mehrwegbaum mit den folgenden 2 Eigenschaften
Greneigenschaft: jeder Knoten hat mindestens 2 und maximal 4 Kinder Tiefeneigenschaft: alle externe Knoten besitzen dieselbe Tiefe Abhngig von der Anzahl der Kinder heit ein interner Knoten 2-Knoten, 3-Knoten oder 4-Knoten
11 37 3 9 13 39 45 53
Beispiel: Suche 50
11 37 3 9 13 39 45 53 50
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
237
238
Hhe eines 2-3-4 Baumes Satz: Ein 2-3-4 Baum, der n interne Knoten speichert, hat eine Hhe von O(log n) Beweis
Die Hhe des 2-3-4 Baumes mit n internen Knoten sei h Da es mindestens 2i interne Knoten auf den Tiefen i = 0, , h-1 gibt und keine internen Knoten auf Tiefe h, gilt n 1 + 2 + 4 + + 2h-1 = 2h 1 Daher gilt h log2 (n + 1) Knoten Tiefe
1 2 2h-1 0
VO Algorithmen und Datenstrukturen
0 1 h-1 h
E. Schikuta VO Algorithmen und Datenstrukturen
5-Knoten
v 27 30 32 35
E. Schikuta
239
240
Lschen Der Lschvorgang wird auf den Fall reduziert, wo der zu lschende Schlsselwert in einem internen Knoten mit externen Knotenkindern liegt Andernfalls wird der Schlsselwert mit seinem Inorder Nachfolger (oder Inorder Vorgnger) ersetzt
Analog Fall 3 binre Suchbume
Schlssel k3 wird in den Elternknoten u von v eingefgt (dadurch kann eine neue Wurzel entstehen)
11 24 32 3 9 v5 13
u v v3 v4 35 3 9
27 30 v1 v2
13
E. Schikuta
E. Schikuta
241
242
Unterlauf
Durch das Lschen eines Schlssels in einem Knoten v kann es zu einem Unterlauf (underflow) kommen
Knoten v degeneriert zu einem 1-Knoten mit einem Kind und keinem Schlssel 11 27 v 3 9 13
Fall 2: Verschieben
Schlsselwerte und entsprechende Kinder werden zwischen Knoten verschoben
E. Schikuta
E. Schikuta
243
244
Datenmenge
unbeschrnkt
Modelle
Hauptspeicherorientiert Untersttzung komplexer Operationen
Bereichsabfragen, Sortierreihenfolge
Laufzeit
E. Schikuta
245
246
4.6 Externspeicherverwaltung
Problem
Hauptspeicher zu klein
Lsung
Speicherung der Knoten auf dem Externspeicher (Platte)
Hauptspeicher
hhenbalanziert
2-3-4 Baum
log(n)
Platte
E. Schikuta
E. Schikuta
247
248
Plattenzugriffe Ansatz
Referenzieren eines Knotens entspricht Zugriff auf die Platte
Bei Aufbau eines binren Schlsselbaumes fr eine eine Datenmenge von z.B. einer Million Elementen ist die durchschnittliche Baumhhe log2106 20, d.h. 20 Suchschritte 20 Plattenzugriffe
Seitenverwaltung Lsung
Zerlegung des binren Baumes in Teilbume, diese in sog. Seiten (pages) speichern
Dilemma
Unterschied Aufwand Platten- zu Hauptzugriff Faktor 100000, milli- zu nano-Sekunden (z.B. 5ms 60 ns) Jeder Suchschritt bentigt einen Plattenzugriff hoher Aufwand an Rechenzeit
Mehrwegbaum (multiway-tree)
Bei 100 Knoten pro Seite fr 1 Million Elemente nur mehr log 100106 = 3 Seitenzugriffe Im schlimmsten Fall (lineare Entartung) aber immer noch 10 4 Zugriffe (10 6 / 100)
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
249
250
Seitenverwaltung (2)
Knoten entsprechen Seiten (Blcke)
besitzen eine Gre, Seitengre (Anzahl der enthaltenen Eintrge bzw. Speichergre in Bytes) reprsentieren die Transfereinheit zwischen Haupt- und Externspeicher Zur Effizienzsteigerung des Transfers wird die Gre der Seiten an die Blockgre der Speichertransfereiheiten des Betriebssystems angepat (Unit of Paging/Swapping)
Index Hauptspeicher
schreiben
Externspeicher
Daten
Seiten
... lesen ...
Index
ermglicht den effizienten Zugriff auf die Daten
Disk
Daten
enthalten die gespeicherte Information (vergleiche externe Knoten)
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
251
252
Knotenarten 2 Knotenarten
Indexknoten
Erlauben effizienten Zugriff auf die externe Knoten Definieren die Intervallbereiche der Elemente, die im zugeordneten Teilbaum gespeichert sind. realisiert durch interne Knoten
Externe Knoten
Enthalten die zu verwaltende Information realisiert durch Blattknoten
Beispiel
11
3 9 11
25
25
37
26 37
253
254
11
17
19
21
23
25
30
35
37
46
Jeder Indexknoten hat mindestens 2 und maximal 4 Grenzwerte und folglich mindestens 3 und maximal 5 Kinder Ausnahme ist die Wurzel Die Gre der externen Knoten ist eigentlich durch die Ordnung nicht definiert, wird aber blicherweise in der Literatur gleichgesetzt
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
255
256
Suche
11 1 3 8 11 17 19 23 21 35 23 25 30 35 37 46
Suchen
11 11 17
Element 17
23 35 11 11 x < 23 19 21 enthalten
Element 27
23 35 23 nicht enthalten 25 30 1 3 8 11 17 11 23 21 35 23 x < 35
19
23
25
30
35
37
46
?
11 23 35
Bereichsabfrage mglich
Suche alle Element im Breich [Untergrenze, Obergrenze]
VO Algorithmen und Datenstrukturen
Warum?
11
17
19
21
23
25
26
30
35
37
46
E. Schikuta
E. Schikuta
257
258
E. Schikuta
E. Schikuta
259
260
30 35 37 46
11 19 11 17 18
23
28
35 23 11 19 28 35
19
21
261
262
35
37
23 11 1 3 8 11 17 19 23 18 19
VO Algorithmen und Datenstrukturen
Element wird entfernt, ist Knoten unterbesetzt ( Underflow), Elementanzahl < k Umgekehrter Vorgang zum Split benachbarte Knoten werden verschmolzen (merge) 23 25 28 26 28 Interner Knoten unterbesetzt, muss ebenfalls mit Nachbarn verschmolzen werden.
E. Schikuta
35
21
30
35
263
264
B+-Baum Lschen (3) Das Verschmelzen kann zur Verringerung der Baumhhe fhren, 2 Knoten werden zur neuen Wurzel verschmolzen, alte Wurzel wird entfernt.
11 11 1 3 8 17 18 19 21 19 23 23 28 25 26 28 30 35 11 16 19 17 21 18 11 16 17
Beispiel: (Baumausschnitt)
Lschen von 19
...
Verschmelzen - berlauf
... ...
Splitten
...
19
21 18
...
18 17 21
...
21
11
16 18
Diese (Verschmelzen-Splitten) Sequenz erzeugt eine besseren Aufteilung der Datenstze zwischen benachbarten Knoten. Dies wird auch hier (siehe 2-3-4 Baum, eigentlich flschlicherweise) als Datensatzverschiebung (shift) bezeichnet.
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
265
266
Datenblockverkettung
In der Praxis werden die Datenblcke linear verkettet, um einen effizienten, sequentiellen Zugriff in der Sortierreihenfolge der gespeicherten Elemente zu ermglichen
11 11 1 3 8 17 18 19 21 19 23 23 28 25 26 28 30 35
Datenmenge
unbeschrnkt
abhngig von der Gre des vorhandenen Speicherplatzes
Modelle
Externspeicherorientiert Untersttzung komplexer Operationen
Bereichsabfragen, Sortierreihenfolge
E. Schikuta
E. Schikuta
267
268
4.8 Trie
Dient zur Speicherung von Strings (Verwaltung von Wrterbchern, Telefonbchern, Spellcheckern, etc.)
Bezeichnung wird abgeleitet von retrieval, wird aber wie try ausgesprochen
Bei k Buchstaben ein k+1-ary Tree, wobei jeder Knoten durch eine Tabelle mit k+1 Kanten auf Kinder reprsentiert wird.
Y Z $
Spezialformen
Patricia Tree, de la Briandais Tree
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
269
270
P I N $ I N G $
S E N $ $ E H
T I I N N $ $ S $
W I N $ N $ PIN SING
I $ THE
Einfgen Suchen
VO Algorithmen und Datenstrukturen
271
272
Analyse Trie
Datenverwaltung
Einfgen und Lschen untersttzt Struktur des Tries unabhngig von der Einfgereihenfolge
Datenmenge
unbeschrnkt
Modelle
Hauptspeicherorientiert Untersttzung komplexer Operationen
Bereichsabfragen, Sortierreihenfolge
Laufzeit
Speicherplatz O(n) O(log n) O(log n) O(log n) O(n) Zugriff Einfgen Lschen Sortierreihenfolge
Bei der exakten Berechnung ist die Basis des Logarithmus von der Kardinalitt der Zeichenmenge, z.B. 26 (Grossbuchstaben), 2 (Bitstrings)
E. Schikuta
E. Schikuta
273
274
4.9 Priority Queues Datenstruktur zum wiederholten Finden und Entfernen des Elementes mit dem kleinsten (bzw. grten) Schlsselwert aus einer Menge
Anwendungen
Simulationssysteme (Schlsselwerte reprsentieren Exekutionszeiten von Ereignissen) Prozessverwaltung (Prioritten der Prozesse) Numerische Berechnungen (Schlsselwerte entsprechen den Rechenfehlern, wobei zuerst die groen beseitigt werden) Grundlage fr eine Reihe komplexer Algorithmen (Graphentheorie, Filekompression, etc.) Anmerkung: Im folgenden betrachten wir o.B.d.A. nur Priority Queues die den Zugriff auf die kleinsten Elemente untersttzen VO Algorithmen und Datenstrukturen E. Schikuta
275
Operationen Construct
Erzeugen einer leeren Priority Queue
IsEmpty
Abfrage auf leere Priority Queue
Insert
Einfgen eines Elementes
FindMinimum
Zurckgeben des kleinsten Elementes
DeleteMinimum
Lschen des kleinsten Elementes
VO Algorithmen und Datenstrukturen E. Schikuta
276
Geordnete Liste
Elemente werden in der Reihenfolge ihrer Gre eingetragen (Aufwand O(n)). Zugriff bzw. Lschen konstanter Aufwand O(1)
Problem
Aufwand O(n) schwer zu vermeiden.
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
277
278
10
11
Heap
Binrer kompletter Baum Wert jedes Knotens ist kleiner (grer) oder gleich den Werten seiner Nachfolgerknoten Wurzel enthlt kleinstes (grtes) Element Anordnung der Unterbume bez. Ihrer Wurzel undefiniert (ungeordneter Baum)
VO Algorithmen und Datenstrukturen E. Schikuta
Beispiel
6
1
3
0
6
1
5
2
10
3
9
4
11
5
10
11
5
E. Schikuta
279
280
Zugriff Zugriff auf das kleinste Element mit konstanten Aufwand: O(1) Wurzel = erstes Element im Feld.
3 6 10 3
0
5 9 11 10
3
6
1
5
2
9
4
11
5
E. Schikuta
E. Schikuta
281
282
Methode Insert
void PQ::Insert(int v) { int child, parent; a[++N] = v; child = N; parent = (child - 1)/2; while(child != parent) { if(a[parent] > a[child]) { swap(a[parent], a[child]); child = parent; parent = (parent - 1)/2; } else break; // to stop the loop } }
3 6 10 9
E. Schikuta
283
284
Methode DeleteMinimum
int PQ::DeleteMinimum() { int parent = 0, child = 1; int v = a[0]; a[0] = a[N]; N--; while(child <= N) { if(a[child] > a[child+1]) child++; if(a[child] < a[parent]) { swap(a[parent], a[child]); parent = child; child = 2*child + 1; } else break; // to stop the loop } return v; }
VO Algorithmen und Datenstrukturen E. Schikuta
5 6 10 9 4 6 9 11
E. Schikuta
4 11 3
lschen ok!
285
286
Analyse Heap
Datenverwaltung
Einfgen und Lschen untersttzt
Heaps und Heaps Bitte zu unterscheiden! Der Begriff Heap wird in der Informatik zur Bezeichnung verschiedener Konzepte verwendet
Heap als Datenstruktur zur Speicherung von Priority Queues Heap als Speicherbereich zur Verwaltung (vom Benutzer selbst verwalteter) dynamisch allozierter Speicherbereiche Heap als Speicherform in Datenbanken
Datenmenge
unbeschrnkt
Modelle
Hauptspeicherorientiert Nur simple Operationen
Laufzeit
Speicherplatz Zugriff (Minimum/Maximum) Einfgen Lschen O(n) O(1) O(log n) O(log n)
Der Heap stellt eine effiziente Basisdatenstruktur fr viele weitere darauf aufbauende Datenstrukturen dar
E. Schikuta
E. Schikuta
287
288
Suchbume
Binre Suchbume AVL-Bume 2-3-4 Bume B+-Baum Balanzierung
Vektoren
289
290
5 Vektoren Ein Vektor (Feld, array) verwaltet eine fix vorgegebene Anzahl von Elementen eines einheitlichen Typs.
Zugriff auf ein Element ber einen ganzzahligen Index (die Position im Vektor) Aufwand des Zugriffes fr alle Elemente konstant
5.1 Dictionary Ein Dictionary ist eine Datenstruktur, die nur die einfachen Operationen des Einfgens, Lschens und der Suche zur Verfgung stellt.
Ein Elemente im Dictionay besteht meist aus einem Schlssel- (key) und einem Informationsteil (info). Beispiele sind
Wrterbcher, Namenslisten, Bestandslisten, etc.
x0
x1
x2
xn-2
Xn-1
Methoden
Hashing: Datenorganisationsform Sortieren: Datenreorganisationsmethoden
VO Algorithmen und Datenstrukturen
key1 info1
key2 info2
Keyn-1 Infon-1
E. Schikuta
291
292
Beispiele Wrterbuch
(Ausschnitt)
Schlssel computable computation compute computer Information berechenbar Berechnung (be)rechnen Rechenautomat
Operationen Construct
Erzeugen eines leeren Dictionary
IsEmpty
Abfrage auf leeres Dictionary
Insert
Einfgen eines Elementes
Bestandsliste
Schlssel 1 4 17 25 Information CPU Bildschirm Tastatur Maus
Delete
Lschen eines Elementes
LookUp
Abfrage eines Elementes ber seinen Schlssel und liefern der Information
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
293
294
Klasse Dictionary
class Dictionary { private: node { KeyType Key; InfoType Info; }; node *Dict; int NumberElements; public: Dictionary(int max) { Dict = new node[max]; NumberElements = 0; } ~Dictionary() { delete Dict; } void Insert(KeyType k, InfoType I); void Delete(KeyType k); InfoType LookUp(KeyType k); };
VO Algorithmen und Datenstrukturen E. Schikuta
5.2 Hashing Hashing ist eine Methode Elemente in einer Tabelle direkt zu adressieren, in dem ihre Schlsselwerte durch arithmetische Transformationen direkt in Tabellenadressen (Indizes) bersetzt werden
Mit anderen Worten, der Index (die Position in der Tabelle) eines Elements wird aus dem Schlsselwert des Elements selbst berechnet. Tabelle Schlssel Adresse (Index)
0 1 2 3 4 5 6
Schlssel
Transformation
...
m-1
E. Schikuta
295
296
Transformation
Hash-Funktion h h: K {0, 1, m-1} Fr jedes j soll der Schlssel k j an der Stelle h(kj) in der Tabelle gespeichert werden. Der Wert h(K) wird als HashWert von K bezeichnet.
Wahl der Hashfunktion (eigentlich) beliebig!
VO Algorithmen und Datenstrukturen E. Schikuta
297
298
Beispiel Hashing
Bestandsliste
Gre der Liste 7 Hashfunktion h(k) = k mod 7
Kollision Eine Kollision tritt auf, wenn zwei oder mehrere Schlsselwerte auf dieselbe Tabellenposition abgebildet (gehasht) werden.
Datenstze
Schlssel 1 4 17 25 Information CPU Bildschirm Tastatur Maus
0 1 2 3 4 5 6
1 17 4
Dies bedeutet, da fr 2 Schlssel ki, kj, mit ki kj, gilt h(ki) = h(kj).
Diese Situation ist aber zu erwarten, da es viel mehr mgliche Schlssel als Tabellenpltze gibt (n >> m als Randbedingung). Die Hashfunktion h ist i.a. nicht injektiv, d.h. aus h(x)=h(y) folgt nicht notwendigerweise x=y.
Kollision
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
299
300
5.2.1 Separate Chaining Beim Separate (Simple) Chaining wird die Kollisionsbehandlung mit linearen Listen bewerkstelligt.
Kollidierende Schlsselwerte werden in einer linearen berlaufkette (Liste) ausgehend vom ursprnglich gehashten Tabellenplatz gespeichert. Wichtig: Element am Beispiel: Kopf der Liste
0 1 2 3 4 5 6 4 Bildschirm 17 39 Tastatur Drucker 25 Maus 1 CPU
h(k) = k mod 7
der Kollisionspfad ist definiert durch die Ausweichpltze aller Elemente, die auf den gleichen Platz "ge-hasht" wurden Wir betrachten nun 2 simple Kollisionsbehandlungen Separate Chaining und Double Hashing
VO Algorithmen und Datenstrukturen E. Schikuta
Der Eintrag des Elementes (39, Drucker) fhrt zu einer Verlngerung der berlaufkette.
VO Algorithmen und Datenstrukturen E. Schikuta
301
302
5.2.2 Double Hashing Beim Double Hashing wird bei Kollision eine zweite, von h unabhngige, Hashfunktion zur Bestimmung einer alternativen Position verwendet.
berlauf auf Position a0 = h(k) Bestimmung einer alternativen Position mit Kollisionsfunktion g : K {1, m-1}, z.B. ai+1 = (ai + g(k)) mod m Beispiel Kollision K
h(k) = k mod 7 g(k) = letzte Ziffer von k mal 3 K a0 = 25 mod 7 = 4 a1 = (4 + (5*3)) mod 7 = 5 K a0 = 39 mod 7 = 4 a1 = (4 + (9*3)) mod 7 = 3 a2 = (3 + (9*3)) mod 7 = 2
VO Algorithmen und Datenstrukturen
Linear Probing Spezialfall des Double Hashing Kollisionsbehandlung: Man verwendet den nchsten freien Platz
Bei Erreichen des Tabellenendes sucht man am Tabellenanfang weiter Hashfuktionen: a0 = h(k), ai+1 = (ai + g(k)) mod m
g(k) = 1
0 1 2 3 4 5 6
1 39 17 4 25
Beispiel
25 mod 7 = 4 (4+1) mod 7 = 5 39 mod 7 = 4 (4+1) mod 7 = 5 (5+1) mod 7 = 6
E. Schikuta VO Algorithmen und Datenstrukturen
K K K
5 6
E. Schikuta
303
304
Lschen
Separate Chaining: Entfernen des Listenelements Double Hashing: Positionen, an denen ein Element gelscht wurde, mssen gegebenenfalls mit einem speziellen Wert (wiederfrei) markiert werden, damit der entsprechende Kollisionspfad fr die restlichen Elemente nicht unterbrochen wird.
VO Algorithmen und Datenstrukturen E. Schikuta
Separate Chaining
+ Dynamische Datenstruktur, beliebig viele Elemente. - Speicherplatzaufwendig (zustzliche Zeigervariable).
Double Hashing
+ Optimale Speicherplatzausntzung. - Statische Datenstruktur, Tabellengre vorgegeben. - Kollisionbehandlung komplex, wiederfrei Markierung beim Lschen.
VO Algorithmen und Datenstrukturen E. Schikuta
305
306
Datenmenge
beschrnkt
abhngig von der Gre der vorhandenen Hashtabelle
Modelle
Hauptspeicherorientiert Untersttzung simpler Operationen
keine Bereichsabfragen, keine Sortierreihenfolge
Bitte beachten: Aufwand von Hashing stark abhngig vom Kollisionsverfahren, geht aber oft gegen O(n)
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
307
308
5.3 Dynamische Hash-Verfahren Dynamischen Hash-Verfahren versuchen im Falle von Kollisionen die ursprngliche Hashtabelle zu erweitern
Anlegen von berlaufbereichen (z.B. lineare Listen) Vergrerung des Primrbereichs (ursprngliche Tabelle)
Erfordert Modifikation der Hash-Funktion Ansatz: Familien von Hash-Funktionen h1: K addr1 ... hn: K addrn Wobei |addr1| < |addr2| < ... < |addrn| Ziel: Wechsel von addri auf addri+1 erfordert minimale Reorganisation der Hash-Tabelle (d.h. Umspeichern von Daten minimieren)
VO Algorithmen und Datenstrukturen E. Schikuta
Somit gilt
hi+1(x) = hi(x) oder hi+1(x) = hi(x) + 2i Beispiel:
addr2 = 0 .. 3, addr3 = 0 .. 7, h(x) = x 4 Adresswechsel
VO Algorithmen und Datenstrukturen
Wert 7 8 9 10 13 14 23 26
h(x) 7 8 9 10 13 14 23 26
309
310
5.3.1 Linear Hashing W. Litwin 1980 Organisation der Elemente in Blcken (Buckets)
Analog zu B-Bumen Blockgre b
Idee
Bei berlauf eines Blocks (Splitting) wird der Primr- und berlaufbereich um jeweils einen Block erweitert Primrbereich durch Hinzufgen eines Blocks am Ende der Hash-Tabelle berlaufbereich durch lineare Liste
Extendible Hashing
Verzeichnis mit binrer Expansion Primrbereiche
E. Schikuta
311
312
Einfgen Einfgen
Suche Block (hd oder hd+1) Falls Block voll
Fge Element in einen berlaufblock Neues Element in der linearen Liste Splitte Block NextToSplit und erhhe NextToSplit um 1
Suche
Suche nach Wert x
E. Schikuta
E. Schikuta
313
314
Bemerkungen
Die Rundennummer d wird erhht, wenn das Splitting einmal durch ist, d.h.
if(NextToSplit == 2d) { d++; NextToSplit=0; }
8 17 25 34 50 2 28 5 55
28=011100 34=100010 50=110010 55=110111
8 16 17 25 34 50 2 28 5 13 21 55 37 Split
16 17 25 34 50 2 28 5 13 21 55 8
Expansionspolitik
Bei jedem berlauf Splitten nicht wirklich sinnvoll Salzberg schlgt vor Expansion durchzufhren, wenn seit der letzten Expansion genau L * b Datenstze eingefgt wurden L ist definiert durch den Belegungsfaktor, d.h L = Rohdatenvolumen / Volumen der Datenstruktur Lange berlaufketten werden in jedem Fall vermieden
37 berlaufblock
E. Schikuta
In der Praxis keine linearen Adressrume sondern Aufteilen des Primrbereiches auf mehrere Hash Dateien pro Platte
Zuordnungssystem ber Verwaltungsblcke
E. Schikuta
315
316
Idee
Wenn Primrbereich zu klein wird, Vergrerung durch Verdopplung Primrbereich wird ber Index T verwaltet Bei berlauf eines Blocks Split dieses Blocks und Verwaltung des Blocks durch Verdoppeln des Index
Index ist viel kleiner als die Datei, daher Verdoppeln viel gnstiger
Index T Jeder Indexeintrag referenziert genau einen Datenblock Jeder Datenblock wird von genau 2k mit k 00 aus N0 Indexeintrgen referenziert 01 10 Die Anzahl der Indexeintrge, die den 11 Block referenzieren ist im Block lokal bekannt
Wird durch eine lokale Tiefe t verwaltet (Gegensatz globale Tiefe d fr die gesamte Hash-Tabelle) Anzahl der den Block referenzierenden Verzeichniseintrge entspricht 2d-t
Lokale Tiefe
317
318
Fall 1: t < d
Einfgen von 6
6=00110 d=2, b=4 14 8 10 26
00 01 10 11
1
Fall 2: t = d
Einfgen von 15, 19
15=01111 19=10011
9 13 7 31 23
d=2, b=4
00 01 10 11
8 14 6 10 26 9 13 7 31 23
9 13 7 31 23
2
E. Schikuta
E. Schikuta
319
320
Einfgen Fall 2: t = d
Erfordert eine Indexexpansion (Verdoppelung)
Neuen Speicherbereich fr 2d zustzliche Referenzen anfordern Fr jedes T[x], fr das gilt x 2d: T[x] = T[x-2d] d = d+1
d=3, b=4
000 001 010 011 100 101 110 111
d=3, b=4 8 9 13 14 6 10 26 7 31 23 15
2
d=3, b=4 8 9 13 14 6 10 26 7 31 23 15
2
8 9 13 14 6 10 26 7 31 23 15
Indexexpansion
19
8 9 13 14 6 10 26 19 7 31 23 15
3 3
E. Schikuta
E. Schikuta
321
322
16 8 28 32 9 13
d=3, b=4 16 8 56 32
000 001 010 011 100 101 110 111
3
9 13 28
Falls Index im Hauptspeicher gehalten werden kann, nur ein externer Zugriff notwendig Im worst case exponentielles Indexwachstum
Typisch bei clustered data (Daten sind nicht gleichverteilt) Daher Speicherplatzbedarf fr Index im worst case nicht akzeptierbar
Index normalerweise im Hauptspeicher
16 8 28 32 9 13
56
2
2 2
1. Indexexpansion
VO Algorithmen und Datenstrukturen
2. Indexexpansion
E. Schikuta
Problem der Blockung des Index auf der Platte Keine garantierte Mindestauslastung
VO Algorithmen und Datenstrukturen E. Schikuta
323
324
Groer Vorteil falls das Verzeichnis in den Hauptspeicher passt, nur ein Plattenzugriff auf einen Datensatz notwendig
Versucht dem Unvermgen des Extendible Hashings, den Index auf der Platte unterzubringen, mit einer speziellen Indexstruktur zu begegnen
E. Schikuta
E. Schikuta
325
326
Struktur
Index besteht aus x Bereichen Ein Bereich enthlt y Eintrge der Form <z, ptr> wobei
ptr ist eine Adresse auf einen Plattenblock z gibt die Anzahl der Verdoppelungen der entspr. Datenbereiche d.h. ptr ist die Adresse eines Datenbereichs mit 2z Plattenblcken x und y sind Potenzen von 2
Beispiel BISEH
b=2 (Blockgre), x=4 (Indexbereiche), y=4 (Eintrge pro IB) 64
00 00 0 01 10 11 225
67
10 11
155
01
0 0 0
255 255 = 1111 11 11 200 = 1100 10 00 56 = 0011 10 00 64 = 0100 00 00 155 = 1001 10 11 67 = 0100 00 11 12 = 0000 11 00 205 = 1100 11 01 225 = 1110 00 01
0 0
0
205 200 56
12
0. Plattenblock
20. Eintrag im IB 10
E. Schikuta
E. Schikuta
327
328
67 10 11 0 0 0
255
155 255 = 1111 11 11 200 = 1100 10 00 56 = 0011 10 00 64 = 0100 00 00 155 = 1001 10 11 67 = 0100 00 11 12 = 0000 11 00 205 = 1100 11 01 225 = 1110 00 01 128 = 1000 00 00 144 = 1001 00 00
67 10 11 0 0 2
155 255 = 1111 11 11 200 = 1100 10 00 56 = 0011 10 00 64 = 0100 00 00 155 = 1001 10 11 67 = 0100 00 11 12 = 0000 11 00 205 = 1100 11 01 225 = 1110 00 01 128 = 1000 00 00 144 = 1001 00 00 95 = 0101 11 11 31 = 0001 11 11
E. Schikuta
Ex
n pa
si
on
00 1 0 0
01 0
00 1 0 0
01 0
0
205 200 56
0
205 200 56
12
12
00
95 31 01 255
10 11
E. Schikuta
329
330
Allgemeiner Vergleich von Hash- zu Index-Verfahren Punkte, die zu beachten sind: Kosten der periodischen Reorganisation Hufigkeit von Einfgen und Lschen Average Case versus Worst Case Aufwand Erwartete Abfrage Typen
Hashing ist generell besser bei exakten Schlsselabfragen Indexstrukturen sind bei Bereichsabfragen vorzuziehen
5.4 Sortierverfahren Das Sortieren von Elementen (Werten, Datenstzen, etc.) stellt in der Praxis der EDV eines der wichtigsten und aufwendigsten Probleme dar.
Es existieren hunderte Sortieralgorithmen in den verschiedensten Varianten fr unterschiedlichste Anwendungsflle.
Hauptspeicher - Externspeicher Sequentiell - Parallel Insitu - Exsitu Stable - Unstable ...
Sortierverfahren gehren zu den am umfangreichsten analysierten und verfeinerten Algorithmen in der Informatik.
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
331
332
Sortierverfahren
Aufgabe
Ein Vektor der Gre n der Form V[0], V[1], , V[n-1] ist zu sortieren.
Lexikographische Ordnung auf den Elementen.
Insitu - Exsitu
Kommt das Sortierverfahren mit ursprnglichen Datenbereich aus (insitu) oder braucht es zustzlichen Speicherplatz (exsitu)?
Stable - Unstable
Wenn mehrere Datenstze denselben Schlsselwert haben, bleibt dann die ursprngliche Reihenfolge nach dem Sortieren erhalten?
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
333
334
Klasse Vector
class Vector { int *a, size; public: Vector(int max) { a = new int[max]; size = max; } ~Vector() { delete[] a; } void Selectionsort(); void Bubblesort(); void Quicksort(); void Mergesort(); int Length(); private: void quicksort(int, int); void mergesort(int, int); void swap(int&, int&); };
VO Algorithmen und Datenstrukturen E. Schikuta
335
336
P A A A A A
E E E E E E
V V V K K K
A P P P P P
K K K V V S
S S S S S V
E. Schikuta
337
338
Aufwand
generell O(n2)
E. Schikuta
E. Schikuta
339
340
v[1] P E
v[2] V
v[3] A
v[4] K
v[5] S
swaps:
P E E A A A
E P A E E E
V A K K K K
A K P P P P
K S S S S S
S V V V V V
void Vector::Bubblesort() { int n = Length(); int i, j; for(i = n-1; i >= 1; i--) for(j = 1; j <= i; j++) if(a[j-1] > a[j]) swap(a[j-1], a[j]); }
E. Schikuta
E. Schikuta
341
342
Aufwand
generell O(n2)
E. Schikuta
E. Schikuta
343
344
Pivotelement umordnen
Beliebiges Element als Pivotelement whlen
(im u.a. Bsp. linkes Element im Vektor, auch zufllige Wahl oder Median aus 3 zuflligen blich)
B T E E E E E E B E E E V A K N B B B B B B A A A A P V B A A P V
Bei Blockierung, d.h. links kleineres und rechts greres Element, diese beiden Elemente vertauschen
Pivotelement
P
E B P
345
346
Quicksort, Rekursion
v[0] n=7 P v[1] E v[2] V v[3] A v[4] K v[5] N v[6] B
Quicksort, Algorithmus
void Vector::Quicksort() { quicksort(0, Length()-1); } void Vector::quicksort(int l, int r) { int i, j; int pivot; if(r > l) { pivot = a[l]; i = l; j = r+1; for(;;) { while(a[++i] < pivot) if (i == r) break; while(a[--j] > pivot); if(i >= j) break; swap(a[i], a[j]); } swap(a[j], a[l]); quicksort(l, j-1); quicksort(j+1, r); } }
Pivot: P swaps: P-E, V-B, P-B, P-A, P-K, P-N E B A K Pivot: E swaps: E-B, E-A B A Pivot: B swaps: B-A A Pivot: A swaps: A A B E K
V Pivot: V swaps: V
K Pivot: K swaps: K
N Pivot: N swaps: N N P V
E. Schikuta
E. Schikuta
347
348
Quicksort, Eigenschaften
Hauptspeicheralgorithmus Insitu Algorithmus
sortiert im eigenen Datenbereich, braucht nur temporre Hilfsvariable (Stack), konstanter Speicherplatzverbrauch
Aufwand
Im Durchschnitt O(n*log(n)) Kann zu O(n2) entarten
Beispiel: Vektor ist vorsortiert und als Pivotelement wird immer das erste oder letzte Vektorelement gewhlt
Empfindlich auf unvorsichtige Wahl des Pivotelements Stabilitt nicht einfach realisierbar Rekursiver Algorithmus
Komplex zu realisieren, wenn Rekursion nicht zur Verfgung steht
VO Algorithmen und Datenstrukturen E. Schikuta
divide-and-conquer Ansatz.
VO Algorithmen und Datenstrukturen E. Schikuta
349
350
Mergesort, Rekursion
n=4
v[0] P
v[1] E E E
v[2] V
v[3] A V V A A Zerlegungsphase
1, 5 P
allgemeiner Fall
P E P
A V
Mergephase
E. Schikuta
E. Schikuta
351
352
Mergesort, Algorithmus
void Vector::Mergesort() { mergesort(0, Length()-1); } void Vector::mergesort(int l, int r) { int i, j, k, m; Vector help(r-l+1); if(r > l) { m = (r+l)/2; mergesort(l, m); mergesort(m+1, r); for(i=m+1; i>l; i--) help.a[i-1] = a[i-1]; for(j=m; j<r; j++) help.a[r+m-j] = a[j+1]; for(k=l; k<=r; k++) a[k]=(help.a[i]<help.a[j])?help.a[i++]:help.a[j--]; } }
VO Algorithmen und Datenstrukturen E. Schikuta
Exsitu Algorithmus
braucht einen zweiten ebenso groen Hilfsvektor zum Umspeichern
Aufwand
Generell O(n*log(n)) Braucht doppelten Speicherplatz
Rekursiver Algorithmus
Komplex zu realisieren, wenn Rekursion nicht zur Verfgung steht.
VO Algorithmen und Datenstrukturen E. Schikuta
353
354
5.4.5 Heapsort Eine Heap (Priority Queue) kann Basis zum Sortieren bilden (Williams 1964):
1. ein Element nach dem anderen in einen Heap einfgen 2. sukzessive das kleinste bzw. grte Element entfernt
die Element werden in aufsteigender bzw. absteigender Ordnung geliefert
Heapsort (modifizierter Ansatz) Kombination der beiden Arrays, Vermeidung von doppeltem Speicherplatz
6
0
9
1
11
2
10
3 4 5
6
0
9
1
11
2
10
3
5
4
3
5
1.
6 1 10 9
2.
0 5 2 11 10 6 1 9
0 11 2 10 9 1
0 11 2
...
Heap-Eigenschaft umdrehen: Wert jedes Knotens ist grer oder gleich den Werten seiner Kinderknoten
3 0 5 1 10 9 11 2
11 9 1 3 6
0 10 2 5
11
0
9
1
10
2
3
3
6
4
5
5
3 6
0 1
5 10 9 11
2 3 4 5
5
0
6 11 10 9
1 2 3 4 5
6
0
9 11 10
1 2 3 4 5 0 1 2 3 4 5
3
VO Algorithmen und Datenstrukturen
9 10 11
E. Schikuta VO Algorithmen und Datenstrukturen
5
E. Schikuta
355
356
Beispiel: buildheap
Wertemenge
9 6 5 10 3 11
6 1 9
0
Beispiel: heapsort
11 10 1 6 11
0
0 5
0 9 2 5 3
4
6
1
5
2
10
3
3
4
11
5
10
3 9
4 0
11
0 9 6 2 1 5 3 11
4 5
0 3 2
3 10
1
3 9
2
4 6
3
1 3 10 6
0 1
9 6 1 10 3 3 4
0 11 2 5 5 6 3 10 1 3
3 9
2
4 5
3
9
0
3 6
1
3
2
5 10 11
3 4 5
11 2 4 5 5
10
6 5 1 6
0
0 3 2 3 1 5
0
Wert 6 (Nr. 1) passt nicht, in Teilbaum sinken lassen, d.h. mit grerem der Nachfolger vertauschen, d.h. 6 mit 10
VO Algorithmen und Datenstrukturen
Heap-Eigenschaft erfllt!
11
0
10
1
9
2
6
3
3
4
5
5
5
1
3
2
9 10 11
3 4 5
3
1
6
2
9 10 11
3 4 5
3
0
5
1
6
2
9 10 11
3 4 5 E. Schikuta
E. Schikuta
357
358
E. Schikuta
359
360
Mergesort
immer Laufzeit O( n * log(n) ) doppelter Speicherplatz notwendig
Heapsort
keinen der obigen Nachteile aber hherer konstanter Aufwand
3500
4000
4500
5000
E. Schikuta
E. Schikuta
361
362
Comparison Sort Verfahren Man nennt diese bekannten Verfahren Vergleichende Sortierverfahren (Comparison sort)
Die Reihenfolge der Elemente wird dadurch bestimmt, dass die Elemente miteinander verglichen werden
Nur Vergleiche der Form xi < xj,, xi xj, ... angewendet
Diese Algorithmen zeigen als gnstigste Laufzeit eine Ordnung von O(n log n), d.h. wir konnten bis jetzt als untere Grenze (n log n) feststellen
Vermutung: Das Problem des Sortierens durch Vergleichen der Elemente lsst sich mit (n log n) beschreiben Falls gltig Algorithmische Lcke geschlossen, da (P) = O(A)
VO Algorithmen und Datenstrukturen E. Schikuta
Die Wege von der Wurzel zu den Blttern definieren die notwendigen Vergleiche um die entsprechenden Permutationen zu erreichen
E. Schikuta
363
364
n n n! = 2n ( ) n (1 + (1 / n)) > ( ) n e e
d.h. Algorithmische Lcke fr Vergleichende Sortierverfahren geschlossen
E. Schikuta
1,3,2
VO Algorithmen und Datenstrukturen
3,1,2
2,3,1
3,2,1
E. Schikuta
365
366
5.5 Sortieren in linearer Zeit Sortierverfahren, die nicht auf dem Vergleich zweier Werte beruhen, knnen eine Eingabe Sequenz in linearer Zeit sortieren
Erreichen die Ordnung O(n)
5.5.1 Counting Sort 1954 Erstmals verwendet von Harold H.Seward MIT Thesis Information Sorting in the Application of Electronic Digital Computers to Bussiness Operations als Grundlage fr Radix Sort. 1956 Erstmals publiziert von E.H. Fried 1960 unter dem Namen Mathsort von W. Feurzeig.
Beispiele
Counting Sort Radix Sort Bucket Sort
E. Schikuta
E. Schikuta
367
368
Allgemeiner Fall
Die Elemente sind aus dem Bereich [1..k], Doppelte sind erlaubt
Ansatz
Gegeben sei eine exakte Permutation 5 8 4 2 7 1 6 3
Jedes Element wird einfach auf die Position seines Wertes in einem Zielvektor gestellt
VO Algorithmen und Datenstrukturen E. Schikuta
369
370
3:
2. D.
C 1 2 4 6 7 8
2:
C 2 2 4 7 7 8
3:
3. D.
4 4
C 1 2 4 5 7 8
3:
1. Durchlauf
B C 2 2 4 6 7 8
3:
Ende
B 1 1 3 3 4 4 4 6
E. Schikuta
371
372
9=
1 0 0 1
3 2 1 0
Daraus folgt, dass der Gesamtaufwand O(n + k) ist In der Praxis haben wir sehr oft k = O(n), wodurch wir einen realen Aufwand von O(n) erreichen
Man beachte, dass kein Vergleich zwischen Werten stattgefunden hat, sondern die Werte der Elemente zur Platzierung verwendet wurden (vergl. Hashing)
Es werden Schlssel sortiert, indem ihre einzelnen Bits an derselben Bit Position miteinander verglichen werden
Das Prinzip lsst sich auch auf alphanumerische Strings erweitern
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
373
374
Binrer Quicksort Sehr altes Verfahren 1929 erstmals fr maschinelles Sortieren von Lochkarten. 1954 H.H. Seward [MIT R-232 (1954), p25-28 ] eigenstndig und ausfhrlich: P.Hildebrandt , H. Isbitz, H. Rising, J. Schwartz [JACM 6 (1959), 156-163] 1 Jahr vor Quicksort
Fhrt zum Binren Quicksort (Radix Exchange Sort) Von rechts nach links und stabiles Sortierverfahren
d.h. for(int i=0; i<b; i++) { ... }
375
376
Binrer Quicksort Partition Aufteilung der Datenstze durch insitu Ansatz hnlich des Partitionierens beim Quicksort
do { scan top-down to find key starting with 1; scan bottom-up to find key starting with 0; exchange keys; } while (not all indices visited)
Beispiel
1 1 0 1 0
Beispiel
1.
0 0 1 1 1 01 2. 0 0 10 11 10 00 1. 0 1 10 10 11
E. Schikuta
...
1 1 0 1 0
0 1 0 1 1
0 0 1 1 1
E. Schikuta
377
378
Binrer Quicksort Eigenschaften Binrer Quicksort verwendet im Durchschnitt ungefhr N log N Bitvergleiche
Gut geeignet fr kleine Zahlen Bentigt relativ weniger Speicher als andere Lineare Sortierverfahren Es ist ein Instabiles Sortierverfahren hnlich dem Quicksort nur fr positive ganze Zahlen
E. Schikuta
379
380
LSD-Radixsort Idee
Betrachte Bits von rechts nach links
LSD least significant digit Bei Binrem Quicksort von links nach rechts!
Was bedeutet stabil Bei einem stabilen Sortierverfahren wird die relative Reihenfolge von gleichen Schlsseln nicht verndert Beispiel
Erster Durchgang von letztem Beispiel Die relative Reihenfolge der Schlssel die mit 0 enden bleibt unverndert, dasselbe gilt fr die Schlssel, die mit 1 enden Mgliches Verfahren: Counting Sort
0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1
0 0 0 0 1 1 1 1
E. Schikuta
381
382
Bei der Anwendung eines Sortierverfahrens mit der Laufzeit O(n) (wie z.B. Partitionierung bei Radix Exchange Sort, Counting Sort bei Straight Radix Sort) ist daher die Ordnung von Radix Sort O(bn)
Counting Sort ist kein insitu Verfahren, daher doppelter Speicherplatz notwendig, fhrt in der Praxis zum Einsatz von O(n log n) Verfahren
383
384
5.5.3 Bucket Sort Annahme ber die n Eingabe Elemente, dass sie gleichmig ber das Intervall [0,1) verteilt sind Idee
Teile das Intervall [0,1) in n gleichgroe Teil-Intervalle (Buckets) und verteile die n Eingabe Elemente auf die Buckets
Da die Elemente gleichmig verteilt sind, fallen nur wenige Elemente in das gleiche Bucket
.17 .23
.26
Sortiere die Elemente pro Bucket mit Selection Sort Besuche die Buckets entlang des Intervalls und gib die sortierten Elemente aus
.78
E. Schikuta
E. Schikuta
385
386
Bucket Sort Algorithmus n = length(A); for(i=1; i<=n; i++) insert A[i] into list B[n*A[i]]; for(i=0; i<n; i++) sort list B[i] with insertion sort; Concatenate the lists B[0], B[1], ..., B[n-1] together in order
n 1
n 1
Um den Ausdruck zu berechnen Verteilung der Zufallsvariable ni bestimmen Es gibt n Elemente mit n Buckets, d.h. die Wahrscheinlichkeit eines Elements in eine Bucket zu fallen ist p = 1/n ni folgt der Binomial-Verteilung Da E[ni2] = Var[ni] + E2[ni] = 1 1/n + 12 = 2 1/n = (1)
E[ni] = n*p = 1 und Var [ni] = n*p*(1-p) = 1 1/n
387
388
5.6 Externes Sortieren Externes Sortieren bezeichnet alle Sortierverfahren, die nicht ausschlielich im Hauptspeicher ablaufen
Diese Verfahren bentigen sekundre (Platten) oder tertire (Bnder) Speichermedien blicherweise versteht man darunter Verfahren, die Bndern einsetzen
Eigenschaften von Bndern Bndern entsprechen allgemein Sequenzen Die Datenelemente sind hintereinander angeordnet und man kann auf sie nur sequentiell lesend und schreibend zugreifen
Verwaltung elementweise oder blockweise (ein Block umfasst mehrere gemeinsam verwaltete Elemente) Es ist nicht mglich auf ein beliebiges Element ohne Aufwand O(n) zuzugreifen Bnder knnen blicherweise von beiden Seite gelesen und geschrieben werden bzw. von einem Ende zum anderen gespult werden
Grund fr externe Verfahren sind zu sortierende Datenmengen, die nicht mehr vollstndig in den Hauptspeicher passen
In der Praxis hufig anzutreffen
Ziel ist die Anzahl der Transfers zwischen Hauptspeicher und Externspeicher zu minimieren
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
389
390
Soviel Daten wie mglich in den Hauptspeicher laden Diese Daten im Hauptspeicher sortieren Sortierte Daten (Run) auf externes Speichermedium schreiben
Ein Run ist eine geordnete Teil-Sequenz der urspr. Datenelemente
1, 5
1, 4, 5, 7, 9, 11, 12, 14
allgemeiner Fall
2, 3, 6, 8, 10, 13, 15
391
392
Algorithmus Bilden initaler Runs durch Sortieren der Daten im Hauptspeicher und gleichmiges Verteilen auf P Output Bnder Alternieren der Bnder
d.h. Input wird Output und vice cersa
Annahme
N zu sortierende Datenstze auf externem Gert Platz fr M Datenstze im Hauptspeicher 2 P externe Gerte (Bnder) zur Verfgung
P Inputbnder P Outputbnder
Solange
Merging der Runs von den Input auf die Output Bnder und alternieren der Bnder
Input auf Band 0, anderen Bnder 1, 2, , 2P 1 Ziel: sortiertes Ergebnis auf Band 0
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
393
394
Balanced Multiway Merging Analyse Durch Hardwareparameter (langsames Band) Anzahl der Banddurchlufe interessant N ... Anzahl der Elemente M ... Gre des Hauptspeichers Jeder Sortier-Durchlauf erzeugt N/M sortierte Runs Daher bei p-Weg Merging braucht man ungefhr logP(N/M) Durchlufe
Jeder Durchlauf verringert die Anzahl der Durchlufe um Faktor P Beispiel: Zu sortierende Datei 200 GB, Hauptspeicher 1 GB, Sortieren bentigt 5 Durchlufe
VO Algorithmen und Datenstrukturen E. Schikuta
Im Beispiel muss noch einmal Band 3 auf Band 0 (Ziel) kopiert werden
A A A D E E E GGG I I L MMN N NO P R R S T X *
E. Schikuta
395
396
Organisation im Hauptspeicher Organisation der Elemente im Hauptspeicher ber Priority Queue (z.B. Heap) Kleinstes Element (nchstes zu Mergen) ist direkt zugreifbar Einfgen eines neuen Elementes vom Band von der Ordnung O(log M)
M beschreibt die Gre des zur Verfgung stehenden Hauptspeichers
5.6.2 Replacement Selection Elemente im Hauptspeicher werden ber eine Priority Queue der Gre p verwaltet (sortiert)
PQ wird mit den kleinsten Elementen der p Runs gefllt Das kleinste Element der PQ wird auf das Output Band geschrieben und das nchste Element nachgeschoben Die PQ Eigenschaft wird mit einer heapify Funktion erhalten
Beispiel
A O S I R T A G N
Im Hauptspeicher sind nur die kleinsten Elemente der Runs, (dargestellt werden aber die ganzen Runs (zur Erklrung)) Realisierung ber Pointer auf die echten Runs = indirekter Heap
Erlaubt auch das Erzeugen von sortierten Runs die viel grer sind als der Hauptspeicher
E. Schikuta
E. Schikuta
397
398
Spezielle Situation falls ein Element kleiner als das letzte geschrieben ist
Kann nicht mehr Teil des Runs werden, wird markiert und als grer als alle Elemente des aktuellen Runs behandelt
Dieses Element beginnt einen neuen Run Es lsst sich zeigen, dass Runs, die mit Replacement Selection erzeugt wurden ungefhr 2 Mal so gro wie die PQ sind
VO Algorithmen und Datenstrukturen E. Schikuta
AINORSTX AEEGLMP
E. Schikuta
399
400
5.6.3 Polyphase Merging Nachteil des Balanced Multiway Merging ist die relativ groe Anzahl von bentigten Bndern
Ansatz mit P Bndern und 1 Output Band bentigt zwar weniger Bnder aber exzessives Kopieren
Output Band muss wieder auf P Bnder aufgeteilt werden Band 0 Band 1 Band 2 Band 0 Band 1 Band 2 Band 0 Band 1 Band 2 A E GOR S T X D EMR GI N AOR S T EGX I N
AMP
A I MN P
AEG L N
A D E E GMO R R S T X A EG L N
A G I I MN N P
E. Schikuta
E. Schikuta
401
402
Eigenschaften Diese Merge-until-empty Strategie kann auf beliebige Bandzahlen (> 2) angewendet werden Analyse ist kompliziert
Unterschied zwischen Balanced Multiway Sorting und Polyphase Merging eher gering Polyphase Merging nur fr geringe Bandzahlen (p < 9) besser als BMS
Dient eher zum Verringern der Bandzahlen
Sortieren
Klassische Verfahren O(n2) und O(n log n) Lineare Verfahren O(n) Externes Sortieren
E. Schikuta
E. Schikuta
403
404
Viele Probleme der Informatik lassen sich durch Graphen beschreiben und ber Graphenalgorithmen lsen Ungerichteter Graph
Graphen
Gerichteter Graph
E. Schikuta
E. Schikuta
405
406
Graphen-Beispiele
Ortsverbindungen
z.B. Zge
Wien Graz
6.1 Ungerichteter Graph Ein ungerichteter Graph G(V, E) besteht aus einer Menge V (vertex) von Knoten und einer Menge E (edge) von Kanten, d.h.
V = {v1, v2, , v|V|} E = {e1, e2, e|E|}
Linz Salzburg
Klagenfurt
Ablaufbeschreibungen
z.B. Projektplanung Maschinenhalle
Kanten rep. Abhngigkeiten
Fundamente Zufahrt Auenanlage Lieferung Maschinen Montage Maschinen
VO Algorithmen und Datenstrukturen E. Schikuta
Eine Kante e ist eine ungeordnetes Paar von Knoten aus V, d.h. e = [vi, vj] mit vi,vj V
v1 Rohbau Dach Innenausbau G(V, E) V = {v1, v2, v3} E = {e1, e2, e3} e1 = [v1, v2] v2
e2 = [v1, v3] v3
e3 = [v2, v3]
E. Schikuta
407
408
Kreis Ein Kreis ist ein Kantenzug, bei dem die Knoten v 1, v2, , vn-1 alle verschieden sind und v n = v1 gilt
v1 v3 v2 v4
Kreise: v2, v3, v5, v7, v2 v3, v4, v5, v3 v2, v3, v4, v5, v7, v2
v6
v3
v5
Eine Kantenzug ist eine Kantenfolge, in der alle Kanten verschieden sind, (im Beispiel ist KF1 ein Kantenzug, KF2 nicht.) Ein Weg oder Pfad ist eine Kantenfolge in der alle Knoten verschieden sind (ein einzelner Knoten gilt auch als Weg)
VO Algorithmen und Datenstrukturen E. Schikuta
v7
Ein Graph heit verbunden oder zusammenhngend, wenn fr alle mglichen Knotenpaare vj,vk ein Pfad existiert, der vj mit vk verbindet Ein Baum ist daher ein verbundener kreisloser (azyklischer) Graph
VO Algorithmen und Datenstrukturen E. Schikuta
409
410
Teilgraph Ein Graph G(V, E) heit Teilgraph von G(V, E), wenn V V und E E
G(V, E) V = {v1, v3} E = {e2} v1
Komponente Alle Knoten, die durch einen Weg verbunden werden knnen, heien Komponente eines Graphen
e2 = [v1, v3] v3 v1 v2 v4 v6 v3
Ein Teilgraph G(V,E) ist spannender Teilgraph von G(V,E), wenn V = V und G einen Baum bildet
G(V, E) V = {v1, v2, v3} E = {e1, e2} v1 e1 = [v1, v2] v2
e2 = [v1, v3] v3
v7 v5 v8
E. Schikuta
411
412
6.2 Gerichteter Graph Ein gerichteter Graph G(V, E) besteht aus einer Menge V von Knoten und einer Menge E von Kanten, wobei die Kanten geordnete Paare <vi,vj> von Knoten aus V sind
v1 e2 = <v2, v1> v2 e5 = <v4, v5> e4 = <v1, v3> e3 = <v2, v3> v3 v5 e1 = <v4, v1> e6 = <v1, v4> v4 G(V, E) V = {v1, v2, v3, v4, v5} E = {e1, e2, e3, e4, e5, e6}
6.3 Speicherung von Graphen Wir unterscheiden 2 Methoden zur Speicherung von Graphen
Adjazenzmatrix-Darstellung Adjazenzlisten-Darstellung
Ein Knoten v heit adjazent zu einem Knoten w, wenn eine Kante von v nach w fhrt, z.B.
ungerichtete Kante: v adjazent zu w w adjazent zu v
v w
Zwischen v1 und v4 existieren 2 Kanten, eine Hin- und Rckkante (auch Doppelkante).
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen
E. Schikuta
413
414
6.3.1 Adjazenzmatrix Bei der Adjazenzmatrix-Darstellung reprsentieren die Knoten Indexwerte einer 2-dimensionalen Matrix A
Wenn der Knoten v adjazent zum Knoten w ist, wird das Feld A[v,w] in der Matrix gesetzt (z.B. 1, true, Wert, etc.)
v w
v1 v1 v2 1 v3 1
v2 1 1
v3 1 1
v3
Gerichteter Graph
v1 v2 v4
v1 v1 v2 1 v3 v4 1 v5 v6
v2
v3 1 1
v4 v5 1
v6
1 1
v6
E. Schikuta
415
416
Eigenschaften + gut fr kleine Graphen oder Graphen mit vielen Kanten + berprfung von Adjazenzeigenschaft O(1) + manche Algorithmen einfacher - dfs schlecht, Rechenaufwand O(|V|2) - quadratischer Speicheraufwand O(|V| 2)
6.3.2 Adjazenzliste Bei der Adjazenzlistendarstellung werden fr jeden Knoten alle adjazenten Knoten in einer linearen Liste gespeichert
Somit werden nur die auftretenden Kanten vermerkt
v w w v w v
v w
v w
E. Schikuta
E. Schikuta
417
418
Adjazenzliste-Beispiele
Ungerichteter Graph
v1 v2 v1 v2 v3 v3 v3 V1 v1 v2 v3 v2
Code, Eigenschaften
C-Code
struct node { int v; struct node *next; }; struct node *adjliste[maxV];
Gerichteter Graph
v1 v4 v2 v1 v2 v3 v4 v5 v3 v6 v5 v6 v4 v3 v1 v6 v3 v1 v5
Eigenschaften:
+ gut fr Graphen mit wenigen Kanten + linearer Speicheraufwand O(n) + dfs gut, Rechenaufwand O(|V|+|E|) - berprfung Adjazenzeigenschaft O(|V|) - manche Algorithmen komplexer
E. Schikuta
E. Schikuta
419
420
6.4 Topologisches Sortieren Problem: Ausgehend von einer binren Beziehung (z.B. mu erledigt sein, bevor man weitermachen kann mit) von Elementen ist zu klren, ob es eine Reihenfolge der Elemente gibt, ohne eine der Beziehungen zu verletzen. Beispiel:
Professor Bumstead kleidet sich an Kleidungsstcke sind: Unterhose, Socken, Schuhe, Hosen, Grtel, Hemd, Krawatte, Sakko, Uhr Beziehung: Kleidungsstck A muss vor B angezogen werden Problem: Finde eine Ankleidereihenfolge damit sich Prof. Bumstead anziehen kann.
VO Algorithmen und Datenstrukturen E. Schikuta
Interpretation durch gerichteten Graphen Binre Beziehung zwischen Elementen ist gerichtete Kante zwischen entsprechenden Knoten
Prof. Bumstead
Unterhose Hose Hemd Grtel Krawatte Sakko
VO Algorithmen und Datenstrukturen E. Schikuta
421
422
Topologische Ordnung eines DAG Eine Topologische Ordnung eines gerichteten azyklischen Graphs G (directed acyclic graph, DAG) ist eine lineare Anordnung aller Knoten, sodass wenn G eine Kante <u, v> enthlt, u vor v in der Anordnung steht
Falls der Graph nicht azyklisch ist, gibt es keine topologische Ordnung Lsung Professor Bumstead
Socken Unterhose Hose Schuhe Uhr Hemd Grtel Krawatte Sakko
Eine mgliche Vorgangsweise 1. Suche einen Knoten aus dem nur Kanten hinausfhren 2. Ordne ihn in der topologischen Ordnung an 3. Lsche ihn aus dem Graphen 4. Weiter bei 1.
E. Schikuta
E. Schikuta
423
424
Knotengrad Eingangs- und Ausgangsgrad eines Knoten indegree(v) mit v aus V: | { v' | <v', v> aus E} |
d.h. Anzahl der in v einmndenden Kanten
induzierter Teilgraph Ein Graph G(V, E) heit induzierter Teilgraph (Untergraph) von G(V, E), wenn V V und E=E{VxV}.
V={v1, v2, v3, v4, v5, v6}
v1 v2 v4 v2 v5 v3 v6 v3 v6 v5
Hose
Hemd
indegree: 1, outdegree: 2
indegree: 0, outdegree: 2
E. Schikuta
E. Schikuta
425
426
ber diese beiden Anstzen lassen sich fast alle wichtigen Problemstellungen auf Graphen lsen, z.B.
Suche einen Weg vom Knoten v nach w? Besitzt der Graph einen Zyklus? Finde alle Komponenten? ...
E. Schikuta
E. Schikuta
427
428
Abstraktion
Frage: Gibt es einen Kreis im Graphen der alle Kanten genau einmal enthlt? A
Frage: Gibt es einen Weg auf dem ich die Stadt besuchen kann, alle Brcken genau einmal berquere und an den Anfangspunkt zurckkehre?
VO Algorithmen und Datenstrukturen E. Schikuta
Euler lste das Problem, indem er bewies, dass so ein Kreis genau dann mglich ist, wenn der Graph zusammenhngend und der Knotengrad aller Knoten gerade ist Eulersche Graphen
Solche Graphen werden Eulersche Graphen genannt.
E. Schikuta
429
430
Beweisskizze
Satz: Damit so ein Kreis existieren kann, mssen alle Knoten geraden Knotengrad haben
Knoten muss einmal betreten und einmal verlassen werden
Beweisskizze (2)
Graph erfllt Bedingung, d.h. Kreis muss existieren
Laut Beweis entferne einen Kreis nach dem anderen, bis alle Kanten entfernt sind, Kombination der Kreise liefert Lsung A C C B B Aus der Regel fr die Kombination der Kreise lsst sich ein entsprechender Algorithmus zum Finden eines Eulerschen Kreises ableiten fhrt zur Problemstellung des Traversieren eines Graphen
VO Algorithmen und Datenstrukturen E. Schikuta
A A C C B D B A D
1 5
A
4 7
C
6
D
3
431
432
Ansatz
Algorithmus
rekursiver Ansatz, zu besuchende Knoten werden am Stack (Rekursion) vermerkt. Zuerst in die Tiefe , danach in die Breite gehen
void besuche-dfs ( Knoten x ) { markiere Knoten x mit besucht; for ( alle zu x adjazente nicht besuchte Knoten v ) besuche-dfs ( v ); Rekursiver Ansatz }
Markierung: Ein Feld mit den Knotenbezeichnungen als Index, initialisiert mit unbesucht (keine Steine).
Analogie
Buch lesen, Detailinformation suchen, Sukkzessiver Lernansatz, Entscheidungsbaum, Auswahlkriterien, etc.
VO Algorithmen und Datenstrukturen E. Schikuta
433
434
Beispiel, dfs
v1 v4 Markierung Adjazenzliste v2 v4 v3 v5 v1 v2 v3 v4 v6 v5 v6 v5 v6 v5 v1 v4 v1 v3 v2 v1 v1 v3 v2 v1 u v2 u v3 u v4 u v5 u v6 u
Methode dfs
dfs-Traversierung eines Graphen
Ausgehend vom Knoten v1 wird der Graph mit dem dfs-Ansatz traversiert. Besuchte Knoten werden auf einem Stack (Rekursion) vermerkt.
1.
v1 v4
2.
6.
v2
5.
v3
3.
v5
v4 v3 v2
Reihenfolge der Knoten eigentlich beliebig, abh. von der physischen Speicherung des Graphen 2. v4 v3 v2 Push v4 v5 3. v5 v3 v2 Pop v5 v6 4. v6 v3 v2 v6
4.
v6 5. v3 v2 v3 6. v2
v2
E. Schikuta
E. Schikuta
435
436
C++ - Code
#define besucht 1 #define unbesucht 0 // maxV defined elsewhere class node { public: int v; node *next;} node *adjliste[maxV]; // Adjazenzliste int mark[maxV]; // Knotenmarkierung void traversiere() { int k; for(k = 0; k <= maxV; ++k) mark[k] = unbesucht; for(k = 0; k <= maxV; ++k) if(mark[k]==unbesucht) besuche-dfs(k); } void besuche-dfs(int k) { node *t; mark[k] = besucht; for(t = adjliste[k]; t != NULL; t = t->next) if(mark[t->v] == unbesucht) dfs(t->v); }
E. Schikuta
E. Schikuta
437
438
Algorithmus
zu besuchende Knoten werden in einer Queue gemerkt
Analogie
berblick ber Buch verschaffen, Generelle Information suchen, Hierarchischer Lernansatz, Auswahlberblick, etc.
VO Algorithmen und Datenstrukturen E. Schikuta
void besuche-bfs(Knoten x) { stelle (Enqueue) Knoten x in Queue; markiere Knoten x besucht; while(Queue nicht leer) { hole (Dequeue) ersten Knoten y von der Queue; for(alle zu y adjazente nicht besuchte Knoten v) { stelle (Enqueue) v in die Queue; markiere Knoten v besucht; } // for Iterativer } // while Ansatz }
VO Algorithmen und Datenstrukturen E. Schikuta
Achtung: Da kein Stack automatisch zur Verfgung steht, muss eine geeignete Datenstruktur zum Merken der zu besuchenden Knoten vorgesehen werden: Queue
439
440
Beispiel, bfs
v1 v4 Markierung Adjazenzliste v2 v4 v3 v5 v1 v2 v3 v4 v6 v5 v6 v5 v6 v5 v1 v4 v1 v1 v3 v2 v1 v1 Schritt 1. v1 v2 v3 v4 2. v5 v2 v3 v4 v4 Enqueue
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen
Methode bfs
bfs-Traversierung eines Graphen
Ausgehend vom Knoten v1 wird der Graph mit dem bfs-Ansatz traversiert Besuchte Knoten werden in einer Queue vermerkt
1. 4.
v1 u
v2 u
v3 u
v4 u
v5 u
v6 u
v1 v4
2.
v2
3.
v3
5.
v5
v3
v2
3. v5 v2 v3 v3
4.
v6 5. v6
6.
v5 v2 v2 Dequeue
v5 v5
v6 v6
E. Schikuta
441
442
C++ - Code
#define besucht 1 #define unbesucht 0 // maxV defined elsewhere ,mark initialized unbesucht class node { public: int v; node *next;} node *adjliste[maxV]; // Adjazenzliste int mark[maxV]; // Knotenmarkierung Queue queue(maxV); void besuche-bfs(int k) { node *t; queue.Enqueue(k); mark[k]= besucht; while(!queue.IsQueueEmpty()) { k = queue.Dequeue(); for(t = adjliste[k]; t != NULL; t = t->next) if(mark[t->v] == unbesucht) { queue.Enqueue(t->v); mark[t->v] = besucht; } } } }
besuche-bfs(1) Enqueue(1), Dequeue(1) Enqueue(4,3,2) Dequeue(4) Enqueue(5) check 1 besucht Dequeue(3) check 2,1 besucht Dequeue(2) check 3,1 besucht Dequeue(5) Enqueue(6) check 4 besucht Dequeue(6) check 5 besucht
v1 b b b b b b
v2 u u u b b b
v3 u u b b b b
v4 u b b b b b
v5 u u u u b b
v6 u u u u u b
E. Schikuta
E. Schikuta
443
444
Aufwand von dfs und bfs Aufwandsabschtzung abhngig von der Speicherungsform des Graphen
Bestimmend Aufwand fr das Finden der adjazenten Knoten
Adjazenzliste
dfs und bfs: O (|V| + |E|) Jeder Knoten wird einmal besucht, Adjazenzlisten werden iterativ abgearbeitet
Bei vollstndig verbundenen Graphen O ( |V2| ), da jeder Knoten |V|-1 Kanten besitzt, d.h. |E| |V2|
Werkzeugebene:
Beispiele - Graphdurchquerung von v1 nach v2 - Topologische Anordnung
Adjazenzmatrix
dfs und bfs: O ( |V|2 ) Aufwand zum Finden der adj. Nachfolger eines Knoten O( |V| )
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen
Implementationsebene:
Beispiele - Rekursive Traversierung - Iterative Traversierung
E. Schikuta
445
446
Lsungsskizzen Beispiele
Weg von Knoten x nach y finden
Von x ausgehend Graph traversieren bis man zu y kommt (d.h. y markiert wird).
E. Schikuta
447
448
Bauer
Ziege
Wolf L
Kohlkopf L
Ziege R
E. Schikuta
E. Schikuta
449
450
Problemreprsentation
Der gesamte Problembereich lsst sich somit durch einen Graphen darstellen, wobei die Positionen durch die Knoten und die Bootsfahrten durch die Kanten reprsentiert werden, z.B. (Ausschnitt)
L L L L R L L R R R R L R L R R L R L L L R R L L L L R R L L R R R L R R L L R R L R
Lsung Lsungsweg
L L L L Startposition Kodierung: (Bauer, Wolf, Kohlkopf, Ziege)
Die Lsung wird somit durch einen Weg bestimmt, der von der Anfangsposition (alle 4 auf dem linken Ufer = LLLL ) zu der Endposition (alle 4 auf dem rechten Ufer = RRRR ) fhrt. Dies lsst sich durch eine simple Traversierung des Graphen lsen.
VO Algorithmen und Datenstrukturen E. Schikuta VO Algorithmen und Datenstrukturen
Endposition R L R R L
E. Schikuta
451
452
C-Programm
Wir whlen einen bfs-Ansatz (iterativ, mit Hilfe einer Queue)
Die Position wird in einer integer Variable binr (stellenwertig) kodiert
Bauer 3. Bit, Wolf 2. Bit, Kohlkopf 1. Bit, Ziege 0.Bit, wobei 0 linkes Ufer und 1 rechtes Ufer bedeutet int int int int
Hilfsfunktionen
Bauer(int Ort) {return 0 != (Ort & 0x08);} Wolf(int Ort) {return 0 != (Ort & 0x04);} Ziege(int Ort) {return 0 != (Ort & 0x02);} Kohl(int Ort) {return 0 != (Ort & 0x01);}
Die Funktionen Bauer, Wolf, Kohl und Ziege liefern die aktuelle Position zurck. Die Funktion sicher bestimmt, ob eine Position sinnvoll ist, d.h. niemand wird gefressen. DruckeOrt dient zur verstndlichen Ausgabe der Positionen. In der Queue Zug werden die zu besuchenden Knoten vermerkt. Der beschrittene Weg (Traversierung) wird im Feld Weg gespeichert (max. 16 Positionen).
C-Spezialitten 0x08 ^ << Hexadezimaldarstellung einer Zahl bitweise exklusives Oder, XOR Linksshift Operator
int sicher(int Ort) { if((Ziege(Ort) == Kohl(Ort)) && (Ziege(Ort) != Bauer(Ort))) return 0; if((Wolf(Ort) == Ziege(Ort)) && (Wolf(Ort) != Bauer(Ort))) return 0; return 1; } void DruckeOrt(int Ort) { cout << ((Ort & 0x08) ? cout << ((Ort & 0x04) ? cout << ((Ort & 0x02) ? cout << ((Ort & 0x01) ? cout << endl; } "R "R "R "R " " " " : : : : "L "L "L "L "); "); "); ");
E. Schikuta
E. Schikuta
453
454
Traversierung
void main() { Queue<int> Zug; int Weg[16]; for(int i = 0; i < 16; i++) Weg[i] = -1; Zug.Enqueue(0x00); while(!Zug.IsEmpty()) { int Ort = Zug.Dequeue(); for (int Pers = 1; Pers <= 8; Pers <<= 1) { int nOrt = Ort ^ (0x08 | Pers); if(sicher(nOrt) && (Weg[nOrt] == -1)) {
Beispiel:
Verdrahtungsproblem in einem elektronischen Schaltplan Alle Pins mssen untereinander verdrahtet werden, wobei die Drahtlnge minimal sein soll
d.h. V ist die Menge der Pins, E die Menge der mglichen Verbindungen zwischen Pin-Paaren, w(u,v) Drahtlnge zwischen Pin u und v
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
455
456
B 4 11 7 8 H
8 2 I 6
7 C D 9
14
E 10
1. Algorithmus verwaltet eine Menge A von Kanten, die immer eine Teilmenge eines mglichen MSB sind 2. MSB wird schrittweise erzeugt, Kante fr Kante, wobei fr jede Kante berprft wird, ob sie zu A hinzugefgt werden kann, ohne Bedingung 1 zu verletzen So eine Kante heit sichere Kante (safe edge)
Generic-MSB(G, w) { eine sichere A = {}; Kante? while (A bildet keinen MSB) { finde eine Kante [u,v] die fr A "sicher" ist A = A { [u,v] } } }
VO Algorithmen und Datenstrukturen
G 1 2
Gewicht des MSB: 37 MSB ist nicht eindeutig, Kante [B, C] knnte durch [A, H] ersetzt werden
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
457
458
6.6.1 Kruskal Algorithmus Grundidee: 1. Die Menge der Knoten reprsentiert einen Wald bestehend aus |V| Komponenten
an Beginn keine Kante
2. Die sichere Kante, die hinzugefgt wird, ist immer die Kante mit dem niedrigsten Gewicht, die zwei unterschiedliche Komponenten verbindet Greedy Ansatz
in jedem Schritt wird die Kante mit niedrigstem Gewicht zum Wald hinzugefgt
E. Schikuta
E. Schikuta
459
460
Mengenoperationen fr Kruskal
make-set(x) { p[x] = x; rank[x] = 0; } link(x,y) { if (rank[x] > else { p[x] = y; if (rank[x] rank[y] = } } find-set(x) { if(x != p[x]) return p[x]; } union(x, y) { link(find-set(x), find-set(y)); } p[x] enthlt den Elternknoten von x (Vertreter der Teilmenge) rank[] ist eine obere Grenze der Hhe von x (Anzahl der Kanten zwischen x und einem Nachfolger-Blatt a find-set(v) sucht die Wurzel und trgt sie danach jedem Knoten als Elternknoten ein
5
4 11
8 2 I 7 1 8 2 6
D 9
9
4 E 10 A 8 11
8 2 I 7 6
D 9
14
14 10
G C 7
1 8 2
G C 7
2
4 A
D 9 E
6
4 A 11
D 9
10
4 E 10 A 8 11
D 9
rank[y]) p[y] = x;
I 7 1 8 2 6 G C
14
I 7 H 1 8 2 6
14 10
3
4 A
2 7
G C 7
D 9 E
7
4 A 11
D 9
11
4 E 10 A 8 11
D 9
= rank[y]) rank[y] + 1;
I 7 1 8 2 6 G C
14
I 7 H 1 8 2 6
14 10
2 7
G C 7
4
4 A
D 9 E
8
4 A 11
D 9
12
4 E 10 A 8 11
D 9
p[x] = find-set(p[x]);
I 7 1 6 G
14
I 7 H 1 6
14 10
E. Schikuta
E. Schikuta
461
462
6.6.2 Prim Algorithmus Grundidee: 1. Die Menge A bildet einen einzelnen Baum 2. Die sichere Kante, die hinzugefgt wird, ist immer die Kante mit dem niedrigsten Gewicht, die den Baum mit einem Knoten verbindet, der noch nicht im Baum ist Greedy Ansatz
Prim Algorithmus
MSB-Prim(G(V,E), w, r) { Q ist eine Priority Queue die alle Knoten Q = V; entsprechend ihres key Wertes speichert for(jeden Knoten u Q) key[v] ist das minimale Gewicht der key[u] = ; Kante die v mit einem Knoten im Baum key[r] = 0; verbindet pred[r] = NIL; r ist die Wurzel (Startknoten) des MSB while(Q != {}) { pred(v) speichert den Vorgnger von v u = Extract-Min(Q) for(jeden Knoten v adjazent zu u) if(v Q && w(u,v) < key[v]) { pred[v] = u; key[v] = w(u,v); } } }
VO Algorithmen und Datenstrukturen E. Schikuta
E. Schikuta
463
464
Aufwand
Aufwand der Algorithmen stark abhngig von der Implementation der Mengenoperationen bzw. der Datenstrukturen fr die Mengenverwaltung (Priority Queue, ...) Kruskal: Im gnstigsten Fall O(E log E)
Initialisierung O(V) Kanten sortieren O(E log E) O(E) mal disjunkte Teilmengen finden O(E log E)
1
4 A 8 11
8 2 I 7 6
D 9
4
4 E 10 A 8 11
8 2 I 7 6
D 9
7
4 E 10 A 8 11
8 2 I 7 6
D 9
14
14
14 10
1 8 2
G C 7
1 8 2
G C 7
1 8 2
G C 7
2
4 A 8 11
D 9
5
4 E 10 A 8 11
D 9
8
4 E 10 A 8 11
D 9
I 7 H 1 8 2 6 G C
14
I 7 H 1 8 2 6 G C
14
I 7 H 1 8 2 6
14 10
3
4 A 8 11
2 7
2 7
G C 7
D 9
6
4 E 10 A 8 11
D 9
9
4 E 10 A 8 11
D 9
I 7 H 1 6 G
14
I 7 H 1 6 G
14
I 7 H 1 6
14 10
PQ als Heap, d.h. Aufbau O(V log V) while Schleife |V| mal, Extract-Min O(log V), d.h. O(V log V) For Schleife O(E) mal, key verndern in PQ O(log V), d.h. O(E log V) Summe beider Schleifen O(E log V + V log V) = O(E log V)
E. Schikuta
E. Schikuta
465
466
6.7 Krzeste Wege Gewichte zwischen Knoten knnen als Weglngen oder Kosten angesehen werden Es ergibt sich oft die Fragestellung nach dem (der) krzesten Weg(e) zwischen Einem Knoten und allen anderen Knoten Zwei Knoten Zwischen allen Knoten Annahme: alle Kosten sind gespeichert in der Kostenmatrix C (C[u,v] enthlt Kosten von u nach v)
10 4
E. Schikuta
E. Schikuta
467
468
Dijkstra Algorithmus
S = { 1 }; for ( i = 2; i <= |V|; i++ ) MinC[i] = C[1, i]; while ( | V \ S | ) > 1) { Akt = Knoten aus V \ S, soda MinC[Akt] = Minimum; S = S { Akt }; for (jeden Knoten v1 aus V \ S) MinC[ v1 ] = MIN (MinC[ v1 ], MinC[Akt] + w[Akt, v1]); } S Menge der bereits bearbeiteten Knoten Akt Knoten, der gerade bearbeitete wird C Kostenmatrix MinC bisher bekanntester krzester Weg
1
10
30
4
20 50 100
3
10
5 3
10 60
5
VO Algorithmen und Datenstrukturen
5
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
469
470
Berechnung
1 10 30 2 50 S {1} {1,2} {1,2,4} {1,2,3,4} Akt 2 4 3 MinC [/, 10, , 30, 100] [/, 10, 60, 30, 100] [/, 10, 50, 30, 90] [/, 10, 50, 30, 60] 3 20 60
6.7.2 All Pairs Shortest Paths Bevor wir die Fragestellung der krzesten Wege zwischen allen Knoten klren, wollen wir zuerst die (einfachere) Frage behandeln, zwischen welchen Knoten existieren berhaupt Wege Fhrt zu 2 Algorithmen
Warshall: welche Knoten sind durch Wege verbunden Floyd: alle krzesten Wege zwischen den Knoten
100 5
10 4
E. Schikuta
E. Schikuta
471
472
Transitive Hlle Fragestellung welche Knoten durch Wege verbunden (erreichbar) sind fhrt zur Frage nach der Transitiven Hlle Ein gerichteter Graph G(V, E) wird transitive (und reflexive) Hlle eines Graphen G(V, E) genannt, genau dann wenn: (v, w) E es existiert ein Pfad von v nach w in G Ausgangspunkt: Adjazenzmatrix von G Idee
Warshall Algorithmus
a a a
E. Schikuta
E. Schikuta
473
474
0 1 2 3 4
0 0 0 0 0 0
1 0 0 0 1 0
2 0 0 0 0 1
3 0 0 1 0 0
4 1 0 0 0 0
0 1 2 3 4
0 0 0 0 0 0
1 1 0 1 1 1
2 1 0 0 0 1
3 1 0 1 0 1
4 1 0 0 0 0
E. Schikuta
E. Schikuta
475
476
Floyd Algorithmus Berechnung der krzesten Wege zwischen allen Knoten ist simpel aus dem Warshall Algorithmus ableitbar
Wird wie Treesort Floyd zugeschrieben
Unterschied
Adjazenzmatrix speichert die Weglngen zwischen den Knoten (entspricht der Kostenmatrix)
0 0 1 2 3 4 0 0 0 0 0
1 0 0 0 1 0
2 0 0 0 0 1
3 0 0 1 0 1
4 1 0 0 0 0 0 1 2 3 4
0 0 0 0 0 0
1 0 0 1 1 1
2 0 0 0 0 1
3 0 0 1 0 1
4 1 0 0 0 0 0 1 2 3 4
0 0 0 0 0 0
1 1 0 1 1 1
2 1 0 0 0 1
3 1 0 1 0 1
4 1 0 0 0 0
E. Schikuta
Beim Feststellen eines Pfades ber 2 Kanten einfache Berechnung der Weglnge dieser neuen Kante und Vergleich mit aktueller Weglnge (falls schon vorhanden)
Statt logisches AND die Berechnung der Kostensumme
VO Algorithmen und Datenstrukturen E. Schikuta
477
478
Beispiel: Floyd
8 0 3 5 1
0 1 2
E. Schikuta
0 0 3
1 8 0 2
2 5
0 1 2
0 0 3 5
1 7 0 2
2 5 8 0
E. Schikuta
479
480
6.8 Genereller iterativer Ansatz Genereller iterativer Ansatz zur Traversierung eines Graphen mit Hilfe 2 (simpler) Listen
2 5 8 0
0 1
0 3
8 3
2 8
1 8 0 2
2
0 1 2 0 3
OpenList
Speichert bekannte aber noch nicht besuchte Knoten
CloseList
Speichert alle schon besuchten Knoten
1 8
7 3
1 8 5 5
1 7 0 2
2 5 8 0
2
0 1 2 0 3 5
5
VO Algorithmen und Datenstrukturen
E. Schikuta
481
482
Unsystematische Traversierung
Search(Knoten v) { OpenList = [v]; CloseList = []; while (OpenList != []) { Akt = beliebigerKnotenAusOpenList; // ??? OpenList = OpenList \ [Akt]; CloseList = CloseList + [Akt]; process(Akt); // whatever to do for(alle zu Akt adjazente Knoten v1){ if (v1 OpenList && v1 CloseList) OpenList = OpenList + [v1]; } } }
VO Algorithmen und Datenstrukturen E. Schikuta
Beispiel (F)
0 1 5 3
2
Es werden alle Knoten besucht, die vom Startknoten aus erreichbar sind. Unterschied gerichteter ungerichtetere Graph?
E. Schikuta
483
484
6.8.1 Zusammenhangskomponente im ungerichteten Graphen Erweiterung von Search Feld zum Vermerken der Komponenten K[ |V| ]
int Vanz = |V|; int Knum = 0; for (int i = 0; i < Vanz; i++) if(K[i] == 0) { Knum = Knum + 1; SearchAndMark(i, Knum); } SearchAndMark(Knoten v; int Knum) { neue Version von Search wobei process(Akt); entspricht K[Akt] = Knum; }
VO Algorithmen und Datenstrukturen E. Schikuta
Zusammenhangskomponente
SearchAndMark(Knoten v; int Knum) { OpenList = [v]; CloseList = []; while (OpenList != []) { Akt = beliebigerKnotenAusOpenList; OpenList = OpenList \ [Akt]; CloseList = CloseList + [Akt]; K[Akt] = Knum; for(alle zu Akt adjazente Knoten v1){ if (v1 OpenList && v1 CloseList) OpenList = OpenList + [v1]; } } }
VO Algorithmen und Datenstrukturen E. Schikuta
485
486
Beispiel (F)
0 1 5 3
Unklarer Programmteil
beliebigerKnotenAusOpenList
E. Schikuta
487
488
Systematische Traversierung
Search(Knoten v) { OpenList = [v]; CloseList = []; while (OpenList != []) { Akt = First(OpenList); OpenList = OpenList \ [Akt]; CloseList = CloseList + [Akt]; process(Akt); for(alle zu Akt adjazente Knoten v1){ if (v1 OpenList && v1 CloseList) dfs: OpenList = [v1] + OpenList; bfs: OpenList = OpenList + [v1]; } } }
VO Algorithmen und Datenstrukturen E. Schikuta
Beispiel (F)
0 1 5 3
z.B.: Search(5) mit dfs OpenList: 5|3,4|0,4|4|2,8|8| CloseList: 5,3,0,4,2,8 Akt: 5|3|0|4|2|8
VO Algorithmen und Datenstrukturen
z.B.: Search(5) mit bfs OpenList: 5|3,4|4,0|0,2,8|2,8|8| CloseList: 5,3,4,0,2,8 Akt: 5|3|4|0|2|8
E. Schikuta
489
490
Noch ein kleines Problem Systematisierung noch nicht ganz vollstndig Anweisung
for(alle zu Akt adjazente nicht besuchte Knoten v1){
E. Schikuta
491
492
Beispiel (F)
Gesucht: krzester Weg von 1 nach 5 OpenList: 1|2,4,5|5,3|5| CloseList: 1,2,4,3 Akt: 1|2|4|3|5 c: 1 2 3 4 0 1 10 30 2 50 3 20 60
Beweisskizze
Satz: Falls ein Knoten v bereits in der CloseList ist, kann es keinen gnstigeren Pfad vom Startknoten nach v geben als jenen, der bereits berechnet wurde
100 5
d.h. nochmals besucht Knoten, die schon in der CloseList sind, knnen einen Pfad nicht verkrzen
Annahme: K in CloseList und Akt.c + C(Akt, K) < K.c Akt In dem Schritt, als K aus der OpenList in die CloseList gebracht wurde, galt offenbar C(Akt,K) S K.c Akt.c K.c pred(Akt).c
pred(Akt) bezeichnet einen Vorgnger von Akt K
10 4
10 60 30 100 50 90 60
Es gilt aber auch pred(Akt).c < Akt.c, somit also K.c Akt.c K.c pred(Akt).c < Akt.c K.c Akt.c Widerspruch: es gibt keine positiven Akt.c, C(Akt, K), K.c, sodass diese Ungleichung gilt
E. Schikuta VO Algorithmen und Datenstrukturen E. Schikuta
493