Pro Informatik 2009 - OOP - Tag 11 - Institut für Informatik

Werbung
Pro Informatik 2009: Objektorientierte Programmierung
Tag 11
Marco Block-Berlitz, Miao Wang
Freie Universität Berlin, Institut für Informatik
31.08.2009
Agenda
Tag 11 – Berechenbarkeit
Programmiersprachen, Algorithmus, Berechenbarkeit, Registermaschinen, Turingmaschine, Halteproblem,
Laufzeitanalyse, O-Notation
Java-Dokumentation, Einführung in Eclipse
Tag 12 – Objektorientierung II
Wiederholung OOP, Innere Klassen, Anonyme Klassen, Vererbung, Typverträglichkeit, Verdecken, Ersetzen,
Identifizieren, Überladen, Die Klasse Object
Generizität
Tag 13 – Spezifikation und Verifikation
Formale Verfahren zur Spezifikation und Verifikation imperativer Programme, Assertions, partielle und totale
Korrektheit, Hoare-Kalkül, Umwandlung von Rekursion zu Iteration
Verschiedene Übungen zum Hoare-Kalkül
Tag 14 – Software-Engineering
Iterative Softwareentwicklung, UML, Softwareentwicklung im Team
Entwicklungswerkzeuge, Entwurfsmuster
Tag 15 – Programmiertechniken
Top-Down, Bottom-Up, Rekursion, Brute Force, Greedy, Teile und Herrsche,
Dynamisches Programmieren, Memoisation
Klausurvorbereitung
Pro Informatik 2009: Objektorientierte Programmierung
2
Agenda
Tag 16 – Datenstrukturen
Abstrakte Datentypen, ADT Folge: Stack, Queue, Liste, ADT Menge: Bäume: Binärbäume, Suchbäume, AVL-Bäume,
Prioritätswarteschlangen, Heap, Graphen
ADTs in Java
Tag 17 – Sortieralgorithmen
InsertionSort, BubbleSort, SelectionSort, ShellSort, MergeSort, QuickSort, Binary Tree Sort, HeapSort
Untere Schranke für vergleichsbasierte Sortierverfahren, BucketSort, CountingSort, RadixSort
Tag 18 – Suchalgorithmen
Binärsuche, Breitensuche, Tiefensuche, Backtracking
Klausurvorbereitung
Tag 19 – Klausur
Tag 20 – Letzter Tag
Weitere Projekte am Fachbereich, Klausurnachbesprechung, Grillen?
Pro Informatik 2009: Objektorientierte Programmierung
3
Organisatorisches
Kontakt:
Miao Wang
Email: [email protected]
Büro: R 136
Tutorien:
SR 005, 006, 049 (Laptops)
RR K38, K44, K46 (Pool-Rechner)
Achtung: Am 04.09 ist SR 005 besetzt
Übungen:
Übungszettel mit Abgabe
Programmierprojekt in Gruppen (2er, 3er)
Klausur:
Vorletzter Vorlesungstag: Do, 10.09.2009
Voraussetzung: Bearbeitung der Übungen, 20 € Kursgebühr
Scheinnote entspricht Klausurnote
Pro Informatik 2009: Objektorientierte Programmierung
4
BERECHENBARKEIT
Pro Informatik 2009: Objektorientierte Programmierung
5
Programmiersprachen
Pro Informatik 2009: Objektorientierte Programmierung
6
Programmiersprachen
Pro Informatik 2009: Objektorientierte Programmierung
7
Programmiersprachen
Programmierparadigma
deklarativ
imperativ
(beschreibend, logisch)
(befehls-, problemorientiert, prozedural)
funktional
relational
prozedural
objektorientiert
(z.B. Haskell)
(z.B. Prolog)
(z.B. Pascal)
(z.B. Java)
f 0 = 1
f x = x*f(x-1)
member(X,L):concat(L1,[X|L2],L)
Keine Zuweisungen, keine Kontrollstrukturen,
oftmals Rekursion.
„ausführbare Spezifikation“
Pro Informatik 2009: Objektorientierte Programmierung
y = 1;
while (x>1) {
y = x * y;
x = x – 1;
}
Person p =
new Person(“Hans”, 41);
Zur Lösung eines Problems müssen die verfügbaren
Operationen des Rechners durch geschickte
Kombinationen verbunden werden.
„rechnernahe Implementierung“
8
Relevante Programmiersprachen
im Studium an der FU
1959 Lisp
relational
1965 Basic
prozedural
1971 Pascal
prozedural
1972 C
prozedural
1975 Prolog
relational
1985 C++
objektorientiert
1987 Perl
objektorientiert
1990 Haskell
funktional
1995 Delphi
objektorientiert
1995 Java
objektorientiert
2000 C#
objektorientiert
Pro Informatik 2009: Objektorientierte Programmierung
Hohe Relevanz für Studium am
Fachbereich Mathematik/Informatik
an der FU-Berlin
9
Funktionale vs. Imperative Programmierung
Funktionale Programme:
Definition von Ausdrücken
(expressions)
Berechnung:
Auswertung von Ausdrücken (liefern
Wert)
Variablen:
Namen für Ausdrücke oder Werte
f 0 = 1
f x = x*f(x-1)
Pro Informatik 2009: Objektorientierte Programmierung
Imperative Programme:
Anweisungsfolgen (Befehle, statements)
a1, a2, a3, …
imperare (lat.) = befehlen
Berechnung/Programmausführung:
Ausführung der Anweisungen, bewirkt Effekte
durch
Änderung von Zuständen von Variablen (u.a.)
Variablen:
Namen von Behältern für Werte (d.h.
Speicherzellen), enthalten einen Wert, der
durch einen anderen Wert ersetzt werden
kann.
y = 1;
while (x>1) {
y = x * y;
x = x – 1;
}
10
Funktionale vs. Imperative Programmierung
f 0 = 1
f x = x*f(x-1)
y = 1;
while (x>1) {
y = x * y;
x = x – 1;
}
x=3
f (x-1)
x=2
f (x-1)
x=1
f (x-1)
x=3;
x=0
f (0)=1
1*1
y = 1;
while (x>1) {
y = x * y;
x = x – 1;
}
X
1
Y
6
2*1
3*2
f 3 hat den Wert 6 (und f 2 = 2 )
vier unterschiedliche Werte
mit dem Namen x, es wird
kein y benötigt
Pro Informatik 2009: Objektorientierte Programmierung
systematische
Veränderung von
zwei Speicherzellen
11
Haskell
Oft sehen Programme in Haskell sehr elegant aus und dienen der Spezifikation von höheren
Programmiersprachen.
In Haskell wird die Unterscheidung von Datentypen geschult.
Als Beispiel sehen wir die member-Funktion
member :: Int -> [Int] -> Bool
member b
[] = False
member b (a:x) = (a==b) || member b x
und die Fakultäts-Funktion
fac :: Int -> Int
fac 0 = 1
fac n = n * fac (n-1)
Der QuickSort-Algorithmus läßt sich sehr kurz formulieren:
qSort []
= []
qSort (a:x) = qSort[y|y<-x,y<=a] ++ [a] ++ qSort[y|y<-x,y>a]
Literaturhinweis:
Haskell – The Craft of Functional Programming, 2. Auflage, Simon Thompson, Addison-Wesley, 1999
Pro Informatik 2009: Objektorientierte Programmierung
12
Haskell
Spezifikation einer Funktion
Mathematik: Spezifikation einer Funktion
{
f(x) =
1
x * f(x-1)
, für x=0
, für x>0
undefiniert für x<0
Informatik: funktionales Programm
f 0 = 1
f x = x*f(x-1)
Informatik: imperativer Algorithmus und imperatives Programm
setze y=1;
solange x>1, wiederhole:
setze y auf x*y
und x auf x-1
Pro Informatik 2009: Objektorientierte Programmierung
y = 1;
while (x>1) {
y = x * y;
x = x – 1;
}
13
Prolog
Logische Programmierung mit Prolog
Prolog ist die „Sprache der KI“. Wir können Regeln definieren und automatisch schlussfolgern. Prolog
ist eine sehr mächtige Sprache, da eine automatische, optimierte Suche hinter den Kulissen arbeitet.
Es folgen ein paar Beispiele.
Ist X Element einer Liste L?
?member (c, [a,b,c]).
yes
?member (X, [a,b]).
X=a;
X=b;
Definition des member-Prädikats:
member(X, [X|T]).
member(X, [Y|T]) :- member (X, T).
Literaturhinweis:
PROLOG - Programming for Artificial Intelligence", 3.Auflage, Pearson Verlag, 2001
Pro Informatik 2009: Objektorientierte Programmierung
14
Prolog
Logische Programmierung mit Prolog
Die Konkatenation von Listen lässt sich elegant formulieren
concat ([], L, L).
concat ([X|L1], L2, [X|L3]) :- concat(L1, L2, L3).
Mit Hilfe des concat-Prädikats, können wir member ausdrücken
member(X, L) :- concat(_, [X|_], L).
Wir können Elemente von Listen entfernen und neue Listen beschreiben
del(X, [X|Tail], Tail).
del(X, [Y|Tail], [Y|Tail2]) :- del(X, Tail, Tail2).
Mit del können wir sogar insert ausdrücken
insert(X, List, List_with_X) :- del(X, List_with_X, List).
Oder kurz mal alle Permutationen
perm([],[]).
perm([X|L],P) :- perm(L, L1), insert(X,L1,P).
Mehr dazu in Vorlesung: „Künstliche Intelligenz“
Pro Informatik 2009: Objektorientierte Programmierung
15
C/C++
C als Implementierungsprache für UNIX entwickelt (Kernighan, Ritchie, ATT Labs, 1970)
ursprünglich reine Systemimplementierungssprache, Bedeutung erst durch Verbreitung UNIX
Heute noch oft benutzt für Betriebssyteme, Echtzeitsysteme, hardwarenahe Systeme
#include <stdio.h>
int main(void) {
printf("Hallo Welt!\n");
return 0;
}
Später (Bjarne Stroustrup, 1979) weiterentwickelt zu C++ mit Objektorientierung
#include <iostream>
#include <ostream>
int main() {
std::cout << "Hallo Welt!" << std::endl;
}
Liste von Hello-World Programmen:
http://de.wikipedia.org/wiki/Liste_von_Hallo-Welt-Programmen/Programmiersprachen
Pro Informatik 2009: Objektorientierte Programmierung
16
Skriptsprachen
Skriptsprachen sind Programmiersprachen, die vor allem für kleine, überschaubare Programmieraufgaben gedacht sind. Sie sind meist wenig restriktiv, was die Sprachelemente angeht.
Eigenschaften
• oft interpretiert
• liberale Typen, oft kein Zwang zur Deklaration von Variablen
• implizite Typwandlung
• automatische Speicherverwaltung
Anwendungen
• einfache Aufgaben
• Prototyp erstellen (rapid prototyping)
• Betriebssystemkommandosprache
Beispiele
• Python, PHP, Perl, Ruby, Javascript ( ≠ Java !), Tcl, Bash, C-Shell, Basic, …, Lisp (?)
Pro Informatik 2009: Objektorientierte Programmierung
17
Traditioneller Algorithmusbegriff
Algorithmus (algorithm) benannt nach AlKhwarizmi (arab. Mathematiker, 9.Jhd.)
Ein Algorithmus abstrahiert von Rechnerhardware und konkreter Programmiersprache und ist
imperativ (!). Ein Algorithmus ist ein schrittweises Verfahren zur Lösung einer Klasse gleichartiger
Problemen mit folgenden Eigenschaften:
1.
2.
3.
4.
5.
6.
Jeder Einzelschritt ist für ausführenden Instanz eindeutig verständlich und ausführbar
Das Verfahren ist endlich beschreibbar
Optional: Der nächste auszuführende Schritt ist eindeutig bestimmt
Optional: Das Verfahren terminiert
Optional: Das Verfahren ist determiniert
Optional: Das Verfahren ist deterministisch
Gilt Punkt 3, so ist der Algorithmus sequentiell, ansonsten nichtsequentiell (concurrent).
Gilt Punkt 4, so ist der Algorithmus terminierend, ansonsten nichtterminierend.
Gilt Punkt 5, so ist der Algorithmus determiniert, ansonsten nicht determiniert.
Gilt Punkt 6, so ist der Algorithmus deterministisch, ansonsten nichtdeterministisch.
Pro Informatik 2009: Objektorientierte Programmierung
18
Traditioneller Algorithmusbegriff
Sequentiell?
y=11;
x=3;
m=0;
while (y>=x) {
y=y-x || m=m+1;
}
Reihenfolge beliebig
Termination?
y=0;
x=3;
while (x>1) {
y=y*x
}
Determiniert?
Der Algorithmus liefert stets das gleiche Ergebnis bei gleichen Startbedingungen und Eingaben
Deterministisch?
Während des Algorithmus ist der nächste Handlungsschritt eindeutig definiert.
Pro Informatik 2009: Objektorientierte Programmierung
19
Vom Algorithmus zum ausführbaren Programm
Compiler (z.B. C, C++)
Idee/Algorithmus
Programmieren (Coding)
Programm als Quellcode in
höherer Programmiersprache
Übersetzung (Compiler)
Ausführbares
Programm
Binden mit anderen (Hilfs-)Programmen
(Linker)
Pro Informatik 2009: Objektorientierte Programmierung
Programm in
Maschinensprache
20
Vom Algorithmus zum ausführbaren Programm
Interpreter (z.B. Prolog, C#, Java)
Idee/Algorithmus
Programmieren (Coding)
Programm als Quellcode in
höherer Programmiersprache
Interpretation
Interpretierer
Heute: Keine klare Trennung mehr zwischen Übersetzung und Interpretation, meist erst Übersetzung
in Byte-Code / Intermediate Language
Pro Informatik 2009: Objektorientierte Programmierung
21
Vom Algorithmus zum ausführbaren Programm
Java:
Übersetzung (Compiler)
Java-Quellcode
class xyz {
…
}
javac
Java Bytecode
bnc 0xE..
sto 0xF..
Interpretation
plattformunabhängiger
Maschinencode
plattformabhängiger
Maschinencode
JVM
Intel, Sun, Sparc
Win / Mac / Solaris / Linux
Pro Informatik 2009: Objektorientierte Programmierung
22
Berechenbarkeit
Definition:
„Eine Funktion ist berechenbar, wenn es einen Algorithmus gibt, der die Funktion berechnet“
Eingabe n
Funktion f
Ausgabe f(n)
Algorithmus A
Sei T der Definitionsbereich von f
A berechnet f, wenn Eingabe n in T liegt und A nach einer endlichen Zahl von Schritten f(n) liefert
Liegt n nicht in T, so terminiert A nicht
f ist somit eine partielle Funktion
Frage: Welche Funktionen sind berechenbar? Gibt es Funktionen, die überhaupt nicht berechenbar sind?
Literaturhinweis:
Theoretische Informatik – kurzgefaßt, 3. Auflage, Uwe Schöning, Spektrum Akademischer Verlag, 2001
Pro Informatik 2009: Objektorientierte Programmierung
23
Entscheidbarkeit
Definition:
„Eine Funktion ist entscheidbar, wenn sie eine charakteristische Funktion repräsentiert und diese
entscheidbar ist“
Eingabe n
Funktion f
ja wenn n in T
nein sonst
Algorithmus A
Entscheidbar:
f gibt ja aus, wenn n in T - ansonsten nein
Semi-entscheidbar:
f gibt ja aus, wenn n in T – ansonsten undefiniert
Unentscheidbar
Pro Informatik 2009: Objektorientierte Programmierung
24
Turingmaschine
Die Turingmaschine dient als einfaches Rechnermodell:
• Ein unendlich langes Speicherband mit Feldern, auf dem jeweils ein Zeichen gespeichert werden kann
• Ein programmierbaren Schreib-Lesekopf, der sich auf dem Band feldweise bewegen kann und die
Zeichen lesen oder ändern kann
Pro Informatik 2009: Objektorientierte Programmierung
25
Nicht entscheidbare Probleme: Halteproblem
Das Halteproblem von Turingmaschinen ist ein Standardbeispiel für ein nicht entscheidbares Problem
[Alan Turing, 1936]:
Kann man ein Programm A entwickeln, das als Eingabe ein anderes Programm B und einen
Eingabewert n erhält und entscheiden kann, ob das andere Programm B terminiert?
Antwort: Nein
Pro Informatik 2009: Objektorientierte Programmierung
26
Nicht entscheidbare Probleme: Halteproblem
Beweis
Angenommen es gibt ein Programm A, welches folgendes tut:
A(Programm B, Eingabe n):
if A(n) terminiert return Ja
else return Nein
Und ein Programm T:
T(Programm X):
while A(X,X) == Ja continue
else return Ja
Was passiert, wenn eine Turingmaschine T(T) aufruft?
Dann liefert T(T) entweder Ja oder bleibt in einer Endlosschleife
Terminiert T(T) und liefert Ja, dann lieferte A(T,T) Nein. Das bedeutet wiederum, dass T(T) nicht
terminiert.
 Widerspruch!
Terminiert T(T) nicht, dann lieferte A(T,T) Ja. Das bedeutet wiederum, das T(T) terminiert.
 Widerspruch!
Es gibt keine Turingmaschine, die das Halteproblem entscheiden kann!
Pro Informatik 2009: Objektorientierte Programmierung
27
Registermaschine
Die Registermaschine (RAM-Modell) ist ein weiteres Rechnermodell, das etwas ähnlicher ist zu heutigen
Rechnern als die Turingmaschinen:
• Ein Befehlszeiger p
• Eine Eingabe n
• Eine Ausgabe o
• Ein unendlich großer, durchnummerierter Registerspeicher: r1, r2, r3, etc..
Operationen werden durch den Befehlssatz einer Programmiersprache festgelegt.
Pro Informatik 2009: Objektorientierte Programmierung
28
LOOP-Registermaschine
Befehlssatz einer LOOP-Registermaschine
xi = xj + c
xi = xj – c
LOOP xi {<Befehlsfolge>}
c: konstante natürliche Zahl
Addition wie üblich
Subtraktion:
xi erhält den Wert
xj – c, wenn xj – c ≥ 0
sonst 0
Beispiel: Multiplikation xi = xj * xk
LOOP xi {xi = xi - 1}
LOOP xj {xi = xi + xk}
Mit LOOP-Programmen kann man genau die primitiv rekursiven Funktionen fk :: Nk → N
berechnen.
Aber das sind bekanntlich nicht alle berechenbaren Funktionen.
Pro Informatik 2009: Objektorientierte Programmierung
29
Primitiv Rekursive Funktionen
1.
Die k-stellige Nullfunktion, die immer 0 ausgibt:
2.
Die Nachfolgerfunktion
3.
Die k-stellige Projektionen
4.
Die Komposition
m-stellige Funktion g
m n-stellige Funktionen h
5.
Die primitive Rekursion zweier Funktionen
Alle primitiv-rekursiven Funktionen sind im intuitiven Sinn berechenbar. Sie schöpfen aber nicht alle
intuitiv berechenbaren Funktionen aus. Beispiel: Die Ackermannfunktion.
Pro Informatik 2009: Objektorientierte Programmierung
30
Ackermannfunktion
Die Ackermannfunktion (Ackermann 1926) ist eine extrem schnell wachsende mathematische Funktion,
die berechenbar ist, aber nicht primitiv rekursiv:
Literaturhinweis:
Theoretische Informatik – kurzgefaßt, 3. Auflage, Uwe Schöning, Spektrum Akademischer Verlag, 2001
Pro Informatik 2009: Objektorientierte Programmierung
31
WHILE-Registermaschine
Damit die Registermaschine, alle intuitiv berechenbaren Funktionen realisieren kann, ist eine
Spracherweiterung nötig.
xi = xj + c
xi = xj – c
WHILE (xi ≠ 0) {<Befehlsfolge>}
Führe <Befehlsfolge> solange
aus bis xi den Wert 0 hat
Die WHILE-Registermaschine kann alle berechenbaren Funktionen realisieren und somit auch alle
LOOP-Programme.
Pro Informatik 2009: Objektorientierte Programmierung
32
GOTO-Registermaschine
Alternativ gibt es den GOTO-Befehlssatz.
xi = xj + c
xi = xj – c
if xi=c then GOTO Mj
GOTO Mj
HALT
Die Klasse der GOTO-Programme ist gleich der Klasse der WHILE-Programme
Literaturhinweis:
Go To Statement Considered Harmful, E. W. Dijkstra, Communications of the ACM, Vol.11, No.3, 1968, pp. 147–148
Pro Informatik 2009: Objektorientierte Programmierung
33
LAUFZEITANALYSE
Pro Informatik 2009: Objektorientierte Programmierung
35
Laufzeitanalyse
Die Laufzeit T(n) eines Algorithmus ist die maximale Anzahl der Schritte bei einer Eingabegröße n.
Wie man die Größe einer Eingabe misst, muss konkret festgelegt werden, z.B. für Sortieralgorithmen
wählt man sinnvollerweise die Anzahl der zu sortierenden Objekte.
Welche Schritte dabei gezählt werden (z.B. arithmetische Operationen, Vergleiche, Speicherzugriffe,
Wertzuweisungen) hängt sehr stark von dem verwendeten Modell oder der verwendeten
Programmiersprache ab. Sogar ein Compiler kann Einfluss auf die Anzahl der Schritte haben.
Oft unterscheiden sich die Laufzeiten des gleichen Algorithmus’ unter Zugrundelegung verschiedener
Modelle um konstante Faktoren. Das Ziel der Laufzeitanalyse besteht darin, den Einfluss solcher
modell- und implementierungsabhängiger Faktoren auszublenden und damit einen davon
unabhängigen Vergleich von Laufzeiten zu ermöglichen.
Literaturhinweis:
Algorithmen – kurz gefasst, Uwe Schöning, Spektrum Akademischer Verlag, 1997
Pro Informatik 2009: Objektorientierte Programmierung
36
Konstante Laufzeit
Einfaches Beispiel:
int constFunction (int[] n) {
int i = 2*12+2;
// 2 Schritte
return i;
}
Die Funktion constFunction benötigt in Bezug auf die Eingabegröße n 2 Arbeitsschritte.
Unabhängig von der Eingabe benötigt die Funktion konstant viele Arbeitsschritte. Wir sprechen dann
von konstanter Laufzeit.
int constFunction2 (int[] n) {
int i = 0;
// 1 Schritt
while(i < 10) {
// 10 mal
i++;
// 1 Schritt
}
return i;
}
Auch constFunction2 benötigt eine konstante Anzahl an Arbeitsschritten. Von der asymptotischen
Laufzeit her unterscheiden sich die beiden Funktionen nicht.
Pro Informatik 2009: Objektorientierte Programmierung
37
Lineare Laufzeit
Einfaches Beispiel:
int sumFunction (int[] n) {
int sum = 0;
for (int i=0; i<n.length; i++)
sum = sum + n[i];
// 1 Schritt
// n-mal
// 1 Schritt
return sum;
}
Die Funktion sumFunction benötigt in Bezug auf die Eingabegröße n folgende Arbeitsschritte:
sumFunction(n) = 1 + n * 1 = n+1
Für diese Fälle wollen wir konstante Werte, die keinen signifikanten Einfluss haben, weglassen. Für
dieses Beispiel ergebe sich sumFunction(n) = n, dann sprechen wir von linearer Laufzeit.
Pro Informatik 2009: Objektorientierte Programmierung
38
Asymptotische Betrachtung
Vergleich von Laufzeiten bezieht sich auf das langfristige Verhalten.
Konstanten können daher ignoriert werden.
Bei der asymptotischen Betrachtung interessieren wir uns für den höchsten Term,
z.B. O(n4 + 7000n3 + 900n2 + 10000n + 1000000) = O(n4)
Pro Informatik 2009: Objektorientierte Programmierung
39
O-Notation
Die Landau-Symbole werden verwendet, um Laufzeiten für Algorithmen anzugeben und vergleichen
zu können:
Asymptotische Schranken in O-Notation:
Pro Informatik 2009: Objektorientierte Programmierung
40
O-Notation
Pro Informatik 2009: Objektorientierte Programmierung
41
Asymptotische Laufzeitklassen
int constFunction (int[] n) {
int i = 2*12+2;
return i;
}
// 2 Schritte
Unsere constFunction liegt also in O(2) = O(1)
int sumFunction (int[] n) {
int sum = 0;
for (int i=0; i<n.length; i++)
sum = sum + n[i];
// 1 Schritt
// n-mal
// 1 Schritt
return sum;
}
Unsere sumFunction liegt in O(n+2) = O(n)
Welche Laufzeiten haben folgende Funktionen?
• Finden des Maximums aus einem Array mit n natürlichen Zahlen
• Finden des Minimums aus einem Array mit n reellen Zahlen
• Multiplikation einer mxn Matrix mit einer nxk Matrix
Pro Informatik 2009: Objektorientierte Programmierung
42
Asymptotische Laufzeitklassen
Übliche Laufzeiten:
Kannst du diese Laufzeiten der Größe nach sortieren?
Pro Informatik 2009: Objektorientierte Programmierung
43
Speicherbedarfanalyse
Genauso wie über die Laufzeit eine asymptotische Analyse geführt werden kann, so geht das auch
mit dem Speicherbedarf.
int sumFunction (int[] n) {
int sum = 0;
for (int i=0; i<n.length; i++)
sum = sum + n[i];
// 1 Schritt
// n-mal
// 1 Schritt
return sum;
}
Die Summe eines Zahlenarrays: Laufzeit liegt in O(n), Speicherbedarf in O(n).
int potenz (int b, int n) {
int p = 1;
for (int i=0; i<n; i++)
p *= b;
// 1 Schritt
// n-mal
// 1 Schritt
return p;
}
Berechnung der n-ten Potenz (naiv): Laufzeit liegt in O(n), Speicherbedarf bei O(1)
Pro Informatik 2009: Objektorientierte Programmierung
44
PAUSE
Pro Informatik 2009: Objektorientierte Programmierung
45
Java Dokumentation
Die wichtigsten Anlaufstellen:
• Java 2 Platform, Standard Edition, v 1.4.2 API Specification
http://java.sun.com/j2se/1.4.2/docs/api/
• Java 2 Platform Standard Edition 5.0 API Specification
http://java.sun.com/j2se/1.5.0/docs/api/
• Java™ Platform, Standard Edition 6 API Specification
http://java.sun.com/javase/6/docs/api/
• Galileo Computing Openbook: Java ist auch eine Insel (8. Auflage)
http://openbook.galileocomputing.de/javainsel8/
• B. Eckel: Thinking in Java , Prentice Hall, 2006
http://www.codeguru.com/java/tij/
• Java-Tutorial von Sun
http://java.sun.com/docs/books/tutorial/
Bei Fragen:
• unser Forum: http://www.java-uni.de/forum/
Pro Informatik 2009: Objektorientierte Programmierung
46
Eclipse
Eclipse ist eine integrierte Entwicklungsumgebung (IDE) für Java
www.eclipse.org
Pro Informatik 2009: Objektorientierte Programmierung
47
Eclipse
Roadmap:
•
•
•
•
•
•
•
•
•
•
•
•
•
Eclipse installieren
Eclipse starten und kennenlernen
Einstellungen
Workspace und Projekte
Views und Perspektiven
Klasse erstellen
Interface erstellen
In Eclipse Methodendokumentation anschauen
Auto-Generator
Refactoring
Shortcuts
Jar erstellen
Debuggen
Pro Informatik 2009: Objektorientierte Programmierung
48
Herunterladen