Algorithmen und Datenstrukturen 1 Sommersemester 2000 Prof. Dr. Gerhard Heyer Institut für Informatik Abt. Automatische Sprachverarbeitung Hauptgebäude, 1. Stock, Zi. 1-52 Vorlesung basierend u.a. auf: Ottmann/Wiedmayer, Algorithmen und Datenstrukturen, Spektrum Akademischer Verlag, Heidelberg: 21996 Foliensammlung Prof. Rahm und Prof. Brewka G.Heyer 1 Algorithmen und Datenstrukturen Organisatorisches Übungen ab 10.4.2000 (1 SWS) Übungsblatt ab 5.4.2000 vierzehntägig nur im Netz (Lernserver) Abgabe der Lösungen jeweils 2 Wochen später, 5 Minuten vor der Vorlesung (erste Abgabe 19.4.2000) Regelmäßige Abgabe der Lösungen Zulassungsbedingung zur Übungsklausur! (50% der Punkte) Übungsklausur 12. Juli 2000 Bestehen der Übungsklausur Zulassungsbedingung zu Prüfungsklausur im Wintersemester! Vorlesungsfolien ... werden wöchentlich ins Netz gestellt (Lernserver) G.Heyer 2 Algorithmen und Datenstrukturen Organisatorisches Übungsleiter: Dr. Gräbe (Zi 2-51), Dr. Lange (Zi 1-08) Termine für Übungsgruppen: Dr. Gräbe Fr. A 9.15-10.45 Uhr Fr. B 9.15-10.45 Uhr Mi. A 11.15-12.45 Uhr Mi. B 11.15-12.45 Uhr Dr. Lange Di. Di. Do. Do. A B A B 9.15-10.45 Uhr 9.15-10.45 Uhr 11.15-12.45 Uhr 11.15-12.45 Uhr SR 3-11 SR 3-11 SR 2-71 SR 2-71 SR 3-03 SR 3-03 SR 3-11 SR 3-11 Programmiersprache: C G.Heyer 3 Algorithmen und Datenstrukturen Inhalt der Vorlesung • Komplexität von Algorithmen • Listen und Listenorperationen • Suche in Listen • Sortieren • Natürliche Bäume und Binärbäume • Ausgeglichene Binärbäume • Blattsuchbäume (Digitalbäume) • Mehrwegbäume • Hashing Aktueller Vorlesungs- und Übungsplan auf dem LERNSERVER! G.Heyer 4 Algorithmen und Datenstrukturen Empfohlene Lehrbücher • T. Ottman, P. Widmayer, Algorithmen und Datenstrukturen, Spektrum 21996 • R. Sedgwick, Algorithmen in C, Addison Wesley 1993 • U. Schöning, Algorithmen - kurz gefasst, Spektrum 1997 Denenberg, Data Structures and their Algorithms, Harper/Collins 1991 Engesser/Claus/Schwill, Informatik Duden, BI 1993 Louden, Mastering Algorithms with C, O’Reilly 1999 Richter/Sander/Stucky, Problem-Algorithmus-Programm, Teubner 1993 Aho, Hopcroft, Ullman, Data Structures and Algorithms (1983) Knuth, The Art of Computer Programming Vol.3 (1973) G.Heyer 5 Algorithmen und Datenstrukturen Aufgabe: Maximum Subarray Problem gegeben: Folge X von ganzen Zahlen der Länge N gesucht: maximale Summe der Elemente einer zusammenhängenden Teilfolge maxtsumme := 0; for u := 1 to N do for o := u to N do begin {bestimme Summe der Elemente in Teilfolge X[u .. o]} summe := 0; for i := u to o do summe := summe + X[i]; maxtsumme := max(summe, maxtsumme) end G.Heyer 6 Algorithmen und Datenstrukturen Anzahl der Additionen in innerster for-Schleife: 1 + 2 + 3 + 4 + 5 + 6 ... + N 1 + 2 + 3 + 4 + 5 ... + N-1 1 + 2 + 3 + 4 ... + N-2 ... 1 N + (N-1)2 + (N-2)3 + ... + 1N Dieser Algorithmus benötigt Q(N3) Schritte (Zuweisungen) G.Heyer 7 Algorithmen und Datenstrukturen Bessere Lösung durch Divide and Conquer Methode: Allgemein: Divide and Conquer- Verfahren zur Lösung eines Problems der Größe N 1. Divide: Falls N > 1 teile Problem in annähernd gleich große Teilprobleme, sonst löse Problem direkt. 2. Conquer: Löse (rekursiv) Teilprobleme. 3. Merge: Kombiniere Teillösungen zu Gesamtlösung. G.Heyer 8 Algorithmen und Datenstrukturen Anwendung auf Maximum Subarray Problem: Beobachtung: wenn man Folge in 2 Teile A und B teilt, so ist die gesuchte Teilfolge entweder in A, oder in B, oder in beiden. Im letzten Fall sind die Randelemente in der gesuchten Teilfolge, und diese besteht aus 2 maximalen Teilstücken, die beim jeweiligen Rand beginnen (rechtes Randmaximum von A + linkes Randmaximum von B) . Die Randmaxima von X[l], ..., X[r] kann man in linearer Zeit berechnen: lmax := 0; summe := 0; for i := l to r do begin summe := summe + X[i]; lmax := max(lmax, summe) end rmax analog. G.Heyer 9 Algorithmen und Datenstrukturen Damit erhält man folgenden D&C-Algorithmus: Algorithmus maxtsum(X); {liefert maximale Teilsumme der Folge X ganzer Zahlen} begin if X enthält nur ein Element a then (if a > 0 then maxtsum := a else maxtsum := 0) else begin teile X in linke und rechte Teilfolgen A und B annähernd gleicher Größe; maxtinA := maxtsum(A); maxtinB := maxtsum(B); bestimme rechtes Randmaximum von A, rmax(A); bestimme linkes Randmaximum von B, lmax(B); maxtsum := max(maxtinA, maxtinB, rmax(A) + lmax(B)) end end G.Heyer 10 Algorithmen und Datenstrukturen Sei T(N) Anzahl der Schritte des Algorithmus bei Eingabe einer Folge der Länge N. Es gilt: T(N) = 2 T(N/2) + C . N Da T(1) konstant (T(1) = C1) erhält man T(N) = Q(N log N). Beispiele: T(1) T(2) T(4) T(8) T(16) T(32) = C1 = 2C1+ 2C = 4C1 + 8C = 8C1 + 24 C = 16C1 + 64 C = 32C1 + 160 C Gleichungen wie die obige nennt man Rekursionsgleichungen. (Sie treten bei Komplexitätsanalysen oft auf.) G.Heyer 11 Algorithmen und Datenstrukturen Noch besseres Verfahren: Scan-Line-Prinzip. wir durchlaufen Positionen 1,...,N, merken uns jeweils die maximale Summe bismax im bisher inspizierten Anfangsstück sowie rechtes Randmaximum scanmax. Bei Vorrücken um 1 Position ist neue maximale Teilfolge entweder gleich der alten, oder sie enthält neues Randelement und ist dann das neue rechte Randmaximum. Neues rechtes Randmaximum ist scanmax + a, a Wert der nächsten Position, falls diese Summe positiv, sonst 0. scanmax := 0; bismax := 0; for i := 1 to N do begin if scanmax + X[i] > 0 then scanmax := scanmax + X[i] else scanmax := 0; bismax := max(scanmax, bismax) end G.Heyer 12 Algorithmen und Datenstrukturen Algorithmus führt nur N (linear viele) Schritte aus. Optimale Komplexität, da jede Position ja mindestens einmal überprüft werden muß. Beispiel: ___maximale Teilsequenz_____ smax bmax G.Heyer 8 8 8 -17 0 8 -6 0 8 4 4 8 13 19 23 23 -5 18 23 -12 6 23 21 27 27 Algorithmen und Datenstrukturen Grundbegriffe: Komplexität einer Funktion ist untere Schranke für die Effizienz eines Algorithmus. Effizienz eines Algorithmus ist obere Schranke für die Komplexität der durch den Algorithmus realisierten Funktion. Ein A. heisst effizient, wenn er ein vorgegebenes Problem in möglichst kurzer Zeit und/oder möglichst geringem Aufwand an Betriebsmitteln (Laufzeit, Speicherplatz) löst. Unterschied zwischen Problemkomplexität und Algorithmuskomplexität. G.Heyer 14 Algorithmen und Datenstrukturen Üblicherweise verwendete Funktionen zum Messen des Wachstums: 1) logarithmische: 2) linear: 3) n log n: 4) quadratisch, kubisch, ... 5) exponentiell: log n n n log n n2, n3, ... 2n, 3n, ... Unterschied handhabbar (tractable) - nicht handhabbar wird zwischen (4) und (5) gemacht. G.Heyer 15 Algorithmen und Datenstrukturen Beispiel-Tabellen aus Garey/Johnson. Annahme: 1 Operation braucht 1 Nanosekunde (Millionstel Sekunde) s: Sekunden m: Minuten d: Tage (days) y: Jahre (years) c: Jahrhunderte (centuries) Größe / Wachstum G.Heyer 10 20 30 n .00001 s n2 n3 n5 2n .0001 s .001 s .1 s .001 s .0004 s .008 s 3.2 s 1.0 s .0009 s .027 s 24.3 s 17.9 m 3n .059 s 58 m 6.5 y .00002 s 40 .00003 s .00004 s 16 .0016 s .064 s 1.7 m 12.7 d 3855 c 50 60 .00005 s .00006 s .0025 s .125 s 5.2 m 35.7 y .0036 s .216 s 13.0 m 366c 2 á 108 c 1.3 á 1013 c Algorithmen und Datenstrukturen Wie wirken sich technologische Fortschritte (schnellere Computer) aus? Größe des größten Problems, das in 1 Stunde gelöst werden kann: größtes Problem/ Wachstum genwärtige Rechner Rechner 100 mal schneller Rechner 1000 mal schneller n n2 n3 n5 2n 3n N1 N2 N3 N4 N5 N6 100 N1 10 N2 4.64 N3 2.5 N4 N5 + 6.64 N6 + 4.19 1000 N1 31.6 N2 10 N3 3.98 N4 N5 + 9.97 N6 + 6.29 G.Heyer 17 Algorithmen und Datenstrukturen