7. Übung zu Algorithmen und Datenstrukturen Dynamisches Programmieren Greedy Algorithms Exceptions 1
Dynamische Programmierung nutzt gezielt aus, dass man bei manchen Problemen den Rechenaufwand extrem veringern kann, indem man Zwischenergebnisse zwischenspeichert. 2
fib(10) fib(9) fib(8) fib(8) fib(7) *snip* *snip* fib(7) fib(6) *snip*... 3
Pseudocode: Funktion fib(zahl n) Falls n < 2, gebe n zurück. Berechne a = fib(n-1) Berechne b = fib(n-2) Gebe (a + b) zurück. 4
Pseudocode mit dynamischer Programmierung: Funktion fib(zahl n) Falls n < 2, gebe n zurück. Überprüfe, ob fib(n) schon einmal berechnet wurde. Wenn ja: Gebe das zwischengespeicherte Ergebnis zurück. Wenn nicht: Berechne a = fib(n-1) Berechne b = fib(n-2) Speichere (a+b) als Zwischenergebnis von fib(n) Gebe (a + b) zurück. 5
In Java: int fib(int n) { if(n < 2) return n; return fib(n-1) + fib(n-2); 6
In Java mit dynamischer Programmierung: Wir erkaufen uns Geschwindigkeit durch zusätzlichen Speicher. int[] cache = new int[1000]; int fib(int n) { if(n < 2) return n; else if(cache[n] > 0) return cache[n]; else { int x = fib(n-1) + fib(n-2); cache[n] = x; return x; 7
In Java mit dynamischer Programmierung: Aber: Neuer Ausnahmefall! Funktioniert nurnoch für n < 1000. int[] cache = new int[1000]; int fib(int n) { if(n >= 1000) throw new Exception("n >= 1000 not supported!"); else if(n < 2) return n; else if(cache[n] > 0) return cache[n]; else { int x = fib(n-1) + fib(n-2); cache[n] = x; return x; 8
Greedy Algorithms Ein gieriger Algorithmus wählt schrittweise den nächsten auszuführenden Schritt aus, der in diesem Moment den größten Gewinn verspricht. Das alte Beispiel: Objekte mit verschiedenen Größen: 1 3 4 5 sollen in Rucksack mit limitierter Größe gepackt werden. Optimale Lösung sehr aufwändig, aber durch gierigen Algorithmus gut approximierbar. Beispiel siehe Tafel. 9
Exceptions & Errors Selbst wenn man ein Programm zu 100% richtig programmiert hat, kann es trotzdem Ausnahmesituationen geben. z.b: Festplatte voll Netzwerkverbindung zusammengebrochen Division durch 0 Katze legt sich auf die Tastatur 10
Exceptions & Errors In Java gibt es dafür Exceptions und Errors. Wenn diese Auftreten werden sie geworfen. throw new InterruptedException( Ich will nicht aufgeweckt werden!); Und dann wieder gefangen: Die Funktion wirft eine SQLException try { executesql(string datenbankanfrage); catch(databaseexception e) { System.out.println( Fehler in DB: + e.getmessage()); Der Exceptionhandler (try/catch) fängt die Exception. Wenn keine Exception aufgetreten ist wird der catch-block ignoriert. 11
Exceptions & Errors Checked Exceptions: String[] readdatabase() throws SQLException { // hier kann eine SQLException geworfen werden Unchecked Exceptions: int getlen(string s) { return s.length(); Wenn s==null ist wird eine NullPointerException geworfen. NullPointerException erbt von RuntimeException. Diese dürfen auch geworfen werden OHNE throws-deklaration an der Methode. 12
Exceptions & Errors Throwable Exception Error RuntimeException InterruptedException VirtualMashineError StackOverflowError NullPointerException IndexOutOfBoundsException http://download.oracle.com/javase/1.4.2/docs/api/java/lang/throwable.html 13