Grundlagen der Programmierung Algorithmen und Datenstrukturen Die Inhalte der Vorlesung wurden primär auf Basis der angegebenen Literatur erstellt. Darüber hinaus sind viele Teile direkt aus der Vorlesung von Prof. Dr.-Ing. Faustmann (ebenfalls FHW Berlin) übernommen worden. Für die Bereitstellung dieses Vorlesungsmaterials möchte ich mich an dieser Stelle noch einmal recht herzlich bedanken. 26.11.2009 Prof. Dr. Andreas Schmietendorf 1
Übersicht zur Vorlesung und Literaturempfehlungen 26.11.2009 Prof. Dr. Andreas Schmietendorf 2
Übersicht zur Vorlesung I Komplexität und Aufwand eines Algorithmus - Analyse von Algorithmen - Die O-Notation - Weiterführende Aspekte Arbeiten mit Dateien (Files) - Verzeichnis- und Dateizugriff - Sequentieller Zugriff auf Dateien - Beliebiger (wahlfreier Zugriff auf Dateien) 26.11.2009 Prof. Dr. Andreas Schmietendorf 3
Übersicht zur Vorlesung II Verkettete Listen und Bäume - Verkettete Listen in Java - Manipulieren verketteter Listen - Verwendung von Bäumen Rekursive Algorithmen - Rekursion vs. Iteration - Rekursive Lösungen (z.b. Türme von Hanoi) 26.11.2009 Prof. Dr. Andreas Schmietendorf 4
Übersicht zur Vorlesung III Such- und Sortieralgorithmen - Sequenzielle Suche - Binäre Suche - Hashfunktion - Vergleich von Sortieralgorithmen Zusammenfassung und Ausblick - Wiederholdung ausgewählter Themenstellungen - Objektorientierte Softwareentwicklung - Die Idee der J2EE Architektur 26.11.2009 Prof. Dr. Andreas Schmietendorf 5
Literatur Sedgewick, R.: Algorithmen in Java: Pearson Studium Addison Wesley, 2003 (ISBN 3-8273-7072-8) Krüger, G.: Handbuch der Java-Programmierung 3. Auflage, Addison Wesley (ISBN 3-8273-2120-4) Dumke, R.: Java-Tutorial, Webauftritt der AG Softwaretechnik am Institut für verteilte Systeme, Universität Magdeburg, (ivs.cs.unimagdeburg.de) 26.11.2009 Prof. Dr. Andreas Schmietendorf 6
Komplexität und Aufwand 26.11.2009 Prof. Dr. Andreas Schmietendorf 7
Die Komplexität eines Algorithmus sei die Abschätzung des Aufwandes seiner Realisierung bzw. Berechnung auf einem Computer. Sie wird daher auch als rechnerische Komplexität bezeichnet. Die Form der Abschätzung beruht zumeist auf dem Zählen, wie häufig bestimmte Operationen des Algorithmus ausgeführt werden. 26.11.2009 Prof. Dr. Andreas Schmietendorf 8
// liefert Summe der Zahlen von 1 bis n */ public static long summe(long n){ long erg = 0; for (int i = 1; i<=n; i++){ erg += i; } return erg; } - Wie gut ist der Algorithmus summe? - Wie viel Zeit braucht summe in Abhängigkeit von n? 26.11.2009 Prof. Dr. Andreas Schmietendorf 9
n 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 Zeit in ms 0 0 0 0 0 0 0 63 609 6172 Summe 1 55 5050 500500 50005000 5000050000 500000500000 50000005000000 5000000050000000 500000000500000000 Vermessung der dargestellten Methode zur Berechnung der Summe auf einem Rechnersystem mit 1,73 GHz, 512 MByte RAM unter WindowsXP. Für die Vermessung wurde die Methode System.currentTimeMillis()verwendet. 26.11.2009 Prof. Dr. Andreas Schmietendorf 10
- Schrittanzahl ist 3+3*n, wobei die Schrittdauer unklar ist. Wir nennen die Angabe der (realen) Schrittanzahl analytische Betrachtung der Komplexität. - Die Größenordnung der Schrittanzahl bei diesem Algorithmus steigt linear mit dem Eingabewert n, d.h. O(n) (=linear). 26.11.2009 Prof. Dr. Andreas Schmietendorf 11
Die Aufwandsschätzung unterscheidet folgende Fälle: - Der günstigste Fall best case - Den schlechtesten Fall worst case - Den durchschnittlichen Fall average case Häufig interessiert man sich für den asymptotischen Aufwand eines Algorithmus (d.h. was passiert wenn n läuft) Ggf. kann ein Algorithmus mit schlechteren asymptotischen Aufwand für kleine n besser sein (sog. break even points berücksichtigen) 26.11.2009 Prof. Dr. Andreas Schmietendorf 12
O-Notation -gebräuchliche Komplexitätsklassen: O(2 n ) > O(n 2 ) > O(n*log n) > O(n) > O(log n) > O(1) - O(1) konstanter Aufwand (z.b. Ausdrucksberechnungen) - O(log n) logarithmischer Aufwand (z.b. allg. Suchverfahren) - O(n) linearer Aufwand (z.b. syntaktische Programmanalyse) - O(n log n) quasilinearer Aufwand (z.b. Sortierung) - O(n 2 ) quadratischer Aufwand (z.b. Vektormultiplikation) - O(2 n ) exponentieller Aufwand (z.b. rekursive Algorithmen) 26.11.2009 Prof. Dr. Andreas Schmietendorf 13
Anweisung Ausführunganzahl (Schritte) x = x +1; for(int i=1; i<n; i++){ x = x +1; } einmal (n-1)-mal d.h. O(1) d.h. O(n) for(int i=1; i<n; i++){ for(int k=1; k<n; k++){ x = x +1; } } for(int i=n; i>0; i/=10){ x = x +1; } (n-1) 2 -mal d.h. O(n 2 ) (1+log n) mal d.h. O(log n) 26.11.2009 Prof. Dr. Andreas Schmietendorf 14
Primitive Operationen gehen nicht in die Aufwandsschätzung ein! Wertzuweisung zu einer Variablen Aufruf einer Klassenmethode Berechnung von arithmetischen Termen Indexberechnung von Feldelementen Auflösung einer Objektreferenz Rückkehr von einer Klassenmethode 26.11.2009 Prof. Dr. Andreas Schmietendorf 15
Übung: Für die folgenden Algorithmen (Aufgabe 1-7) sind: - die analytische Schrittanzahl in Bezug auf die Elementaranweisung s, - und die Größenordnung der Komplexität an (O-Notation) zu bestimmen! - Analysieren Sie die Algorithmen zuerst ohne Verwendung von Eclipse. - Testen Sie die Anzahl der Schritte mit Hilfe eines Java-Programms Bem: Komplexität als Funktion der Eingabe von n 26.11.2009 Prof. Dr. Andreas Schmietendorf 16
1. for(int i=2*n; i>=0; i--){s;} 2. for(int i=1; i<n; i++){s; s; s; s;} 3. for(int i=1; i<=n; i++){s;} for(int j=1; j<=n; j++){s;} 4. for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ s;}} 26.11.2009 Prof. Dr. Andreas Schmietendorf 17
5. for(int i=n; i>0; i/=10){s;} 6. for(int i=1; i<=n; i++){ s; for(int j=1; j<=n; j++){ s; } s;} 7. long f10(long n){ s; if (n>1) { f10(n-1); f10(n-1); } } 26.11.2009 Prof. Dr. Andreas Schmietendorf 18
Ein für eine Schrittanzahl analytisch ermitteltes Polynom a m n m + a m-1 n m-1 +... + a 2 n 2 + a 1 n + a 0 hat die Komplexitätsklasse O(n m ). Für Anwendungssysteme ist die Verwendung von Algorithmen mit einem Aufwand größer als n*log n (also quadratisch oder sogar exponentiell) nicht erwünscht. Bestimmte Probleme sind jedoch nicht mit geringerem Aufwand lösbar (bzw. wurde bis heute noch kein Algorithmus einer besseren Aufwandsklasse gefunden). 26.11.2009 Prof. Dr. Andreas Schmietendorf 19
n log n n log n n 2 2 n 2 0.301 0.602 4 4 4 0.602 2.408 16 16 8 0.903 7.224 64 256 16 1.204 19.265 256 65536 32 1.505 48.165 1024 4294967296 26.11.2009 Prof. Dr. Andreas Schmietendorf 20
Übung (optional): Welchen Aufwand hat das Suchen nach einem Eintrag im Telefonbuch? Gehen Sie zur Beantwortung der Frage wie folgt vor: Versuchen Sie, für diese Suche einen Algorithmus in Pseudocode zu formulieren. Ermitteln Sie den Aufwand dieses Algorithmus. Welcher Datenstruktur entspricht ein Telefonbuch? Warum ist eine (sortierte) verkettete Liste gar nicht und ein (sortiertes) Array nur eingeschränkt geeignet zur Speicherung? 26.11.2009 Prof. Dr. Andreas Schmietendorf 21
Übung: Analysieren Sie das Zeitverhalten der Aufgabe 7 (rekursive Funktion) - Messen Sie Dauer der Ausführung - Verwenden Sie für die Messung folgende Java-Methode: long startmesswert = System.currentTimeMillis(); - Nehmen Sie eine entsprechende Kennlinie bis 50000 ms auf - Beobachten Sie die Systemauslastung mit Hilfe des Windows Task-Manager Auflösung orientiert sich meist an der Auflösung des System-Timers Mögliche Auflösung lässt sich bestimmen siehe dazu Krüger, G. S. 366 26.11.2009 Prof. Dr. Andreas Schmietendorf 22
Weitere Komplexitätsformen: Die Raumkomplexität bezieht sich auf die Aufwandsabschätzung für die Speicherung der Daten bzw. Informationen zu einem Algorithmus hinsichtlich seiner Realisierung. Die psychologische Komplexität ist der Aufwand für das Verständnis bzw. die Handhabung eines Algorithmus speziell in einer Realisierungsform als Programm. 26.11.2009 Prof. Dr. Andreas Schmietendorf 23
Übung - Optional: Der Kurs einer Aktie hat an zehn aufeinander folgenden Tagen die folgenden Werte gewonnen bzw. verloren: Frage: Wie viel Gewinn hätte man innerhalb dieser Zeitspanne maximal machen können? Problem: Es ist mühevoll für längere Zeitabschnitte einen günstigsten Kauf- bzw. Verkaufstermin zu finden! 26.11.2009 Prof. Dr. Andreas Schmietendorf 24