Hash-Tabellen und -Funktionen Hash-Tabellen in Java

Slides:



Advertisements
Ähnliche Präsentationen
Eine dynamische Menge, die diese Operationen unterstützt,
Advertisements

Eine dynamische Menge, die diese Operationen unterstützt,
Vorlesung Programmieren II
GIN 2 – Vorlesung zu Hashing, 31. Mai 2005 Prof. Dr. W. Conen FH Gelsenkirchen SS 2005.
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Informatik II – Kapitel 11
Prof. Dr. T. Kudraß1 Hash-Verfahren. Prof. Dr. T. Kudraß2 Einführung Drei Alternativen, wie Dateneinträge k* im Index aussehen können: 1. Datensatz mit.
M a r c – o l i v e r p a h l Informatik II – Kapitel 14 Hashing Zusammenfassung des Kapitel 14 Küchlin, Weber, Einführung in die Informatik, 2.Auflage.
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
FH-Hof Der B-Baum Richard Göbel. FH-Hof Wahl des Verzweigungsgrad Verzweigungsgrad kann größer als 2 sein v Nachfolger für einen Knoten v-1 Werte in einem.
Dr. Brigitte Mathiak Kapitel 9 Physische Datenorganisation (ganz kurz)
Foliensatz von A. Weber zur Vorlesung Informatik I, Bonn, 2002/03
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
„Such-Algorithmen“ Zusammenfassung des Kapitels 11
<d,a,s, ,i,s,t, ,e,i,n,e, ,L,i,s,t,e>
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Gliederung Motivation / Grundlagen Sortierverfahren
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Listen Richard Göbel.
Sortierverfahren Richard Göbel.
Effizienz: Indexstrukturen
Algorithmentheorie 04 –Hashing
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 Hashverfahren: Allgemeiner Rahmen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (15 Hashverfahren: Verkettung der Überläufer) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 16 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUTE University of Paderborn Algorithms and Complexity Algorithmen und Komplexität Teil 1: Grundlegende.
Vorlesung 4: Memory Universität Bielefeld – Technische Fakultät AG Rechnernetze und verteilte Systeme Peter B. Ladkin Wintersemester.
Informatik II: Algorithmen und Datenstrukturen SS 2013
Hashverfahren und digitale Signaturen
Beispielrelation Buchbestellungen H = Menge der bedeutenden Ziele = {a, d} Schwelle T = 4 Stichprobe S = {a, b, a, a, a, a} mit s = |S| = 6 N = Anzahl.
FH-Hof Algorithmen und Datenstrukturen - Einführung Richard Göbel.
Einführung in die Programmierung
4 Sortierverfahren 4.1 Einführung 4.2 Naive Sortierverfahren
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Diskrete Mathematik II
Referat von Kim Schröer – Intelligente Dateisysteme WS13/14
Effiziente Algorithmen
Information und Kommunikation
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Algorithmen und Datenstrukturen Übungsmodul 11
Kapitel 6: Suchbäume und weitere Sortierverfahren
Sortieralgorithmen Greedy Sortieren: Sortieren durch Auswahl, Einfügen und Austauschen Divide-and-Conquer-Sortieren: Quicksort und merge sort Foliensatz.
(Syntax, Strings/Zahlen, Variablen, Arrays)
Delphi Chars und Strings
Spatial Partition Game Programming Patterns / Optimization Patterns AM3: Softwaretechnologie II (Teil 2): Simulation und 3D Programmierung Dozent: Prof.
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
 Präsentation transkript:

Hash-Tabellen und -Funktionen Hash-Tabellen in Java Hashing Hash-Tabellen und -Funktionen Hash-Tabellen in Java Foliensatz von Prof. D. Saupe, Uni Konstanz, 2003. Überarbeitet und ergänzt von A. Weber, sowie von W. Küchlin zu Informatik II, Tübingen 2004 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -1- Springer-Verlag, ISBN 3-540-20958-1

Probleme bei Implementierung durch schon bekannte Datenstrukturen Einleitung Anwendung von Hashing: Verfahren für dynamisch veränderliche Menge von Objekten mit effizienten Grundoperationen (aka. Wörterbuchoperationen) Suchen Einfügen Löschen Probleme bei Implementierung durch schon bekannte Datenstrukturen Listen Suche ist aufwändig (O(N)) und vor jedem Löschen und Einfügen (an sich effizient) ist eine Suche notwendig Bäume: Suche ist bei balancierten Such-Bäumen effizient (O(log(N)), aber nach jedem Löschen und Einfügen ist Ausbalancieren notwendig Reihungen: Suche schnell aber dynamisches Wachstum teuer, viel Speicher notwendig bei dünn besetzten Reihungen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -2- Springer-Verlag, ISBN 3-540-20958-1

Komponenten von Hashverfahren (Streuspeicherverfahren) Hash-Funktion (hash function) Bildet Objekte ab auf ganze Zahlen (int, hash codes) Hash codes dienen als Schlüssel (key) zur Identifikation der Objekte Es ist nicht ausgeschlossen, dass zwei verschiedene Objekte den selben Schlüssel haben Hash-Tabelle (hash table) Speichert Objekte unter ihrem hash code ab Implementierung: setze array index = hash code W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -3- Springer-Verlag, ISBN 3-540-20958-1

Verallgemeinerung von Hashing Nicht-numerische Schlüssel liefern Abbildungen von Objekten („Schlüsselobjekte“) auf Objekte („Wertobjekte“) Aka. „Übersetzungstabellen“, „Wörterbücher“ (dictionaries) Prinzip: Wertobjekt unter Schlüsselobjekt (z.B. string) wird als Paar <Schlüsselobjekt, Wertobjekt> in Hash-Tabelle unter Hash Code des Schlüsselobjekts gespeichert Java Implementierung ist so organisiert W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -4- Springer-Verlag, ISBN 3-540-20958-1

Einfachstes Beispiel Hash-Tabelle Numerische Schlüssel dienen als Index in ein Array Sinnvoll wenn: Hash-Funktion injektiv (verschiedene Objekte haben verschiedene Schlüssel) genügend Platz vorhanden, um alle möglichen Schlüssel als Index unterzubringen Das ist oft nicht der Fall: Schlüsselbereich typischerweise dünn besetzt In Praxis aber nicht injektive Hash-Funktionen Kollision: zwei Objekte haben denselben Schlüssel (spezielle Überlaufverfahren erforderlich) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -5- Springer-Verlag, ISBN 3-540-20958-1

Beispiel: Mitarbeiterdatenbank Objekte sind durch Namen der Mitarbeiter gegeben (strings) Hash-Funktion: f(s) = i g.d.w. der erste Buchstabe des Nachnamens der i-te Buchstabe im Alphabet ist Anton Wagner W  23 Doris Bach B  2 Doris May M  13 Friedrich Dörig D  4 Array der Länge 26 reicht aus für Hash-Tabelle Achtung: Keine Behandlung von Kollisionen! Schneller Zugriff in konstanter Zeit O(1) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -6- Springer-Verlag, ISBN 3-540-20958-1

h : Menge der Objekte  N (oder Nk) Hash-Funktionen Hash-Funktion allgemein: h : Menge der Objekte  N (oder Nk) Objekt s wird Speicherplatz HTh(s) zugewiesen Beispiel h (´´Doris Bach´´) = 2 führt zu HT[2]= ´´Doris Bach´´ Zur Vermeidung von Kollisionen: Tabelle hinreichend groß wählen Hash-Funktion sollte möglichst vom ganzen Objekt abhängen z.B. bei Zeichenketten abhängig von allen Zeichen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -7- Springer-Verlag, ISBN 3-540-20958-1

Hash-Funktionen für Strings h(s) = Konkatenation des ASCII-Codes der Zeichen in s, h (´´INFO´´) = 495E465F16 Zeichen  I N F O ASCII  4916 5E16 4616 5F16 Problem dabei: h(s) ergibt zu große Indizes (Adressraum hat nur 32 oder 64 Bit) Lösung: Reduktion von h(s) durch Rechnung modulo m Hash-Tabelle hat Länge von maximal m Einträgen Kollisionen nicht ausgeschlossen Bsp. Mit m = 83 ist h(´´INFO´´) = 1810, denn 495E465F16 modulo 8310 = 123091516710 modulo 8310 = 1810 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -8- Springer-Verlag, ISBN 3-540-20958-1

Horner Schema zu Modulo Rechnung Berechnung von h(s) mit modulo Rechnung nicht in CPU-Arithmetik (in long) durchführbar wenn s.length > 8 Zu berechnen ist mit Horner-Schema: sei z(i,s), i = 0, ..., n-1, der Integer ASCII Code des i-ten Zeichens des Strings s der Länge n (0-tes Zeichen steht vorne) Z(s) = Zn-1(s) ergibt sich aus Iteration Z0(s) = z(0,s) Zk(s) = 256 Zk-1(s) + z(k,s) für k = 1, 2, ..., n-1 h(s) = Z(s) mod m Z(s) ist i.d.R. zu groß für Zahlen im Format long W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -9- Springer-Verlag, ISBN 3-540-20958-1

Horner-Schema in Rechnerarithmetik Modulo Rechnung ist aber Komponentenweise machbar: (a + b) modulo m = ((a modulo m) + (b modulo m)) modulo m, (a * b) modulo m = ((a modulo m) * (b modulo m)) modulo m. Damit erhalten wir: h(s) = Z(s) modulo m = hn-1(s) ergibt sich aus Iteration h0(s) = z(0,s) hk(s) = (256 · hk-1(s) + z(k,s)) mod m für k = 1, 2, ..., n-1 JAVA Code Fragment dazu String s = "INFORMATIK"; int z = 0; for (int i=0; i<s.length(); i++) z=(z*256 + s.charAt(i)) % m; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -10- Springer-Verlag, ISBN 3-540-20958-1

Es gibt schlechte Wahlen für m Wahl der modulo Basis Es gibt schlechte Wahlen für m m = 256 führt dazu, daß h(s) nur vom letzten Zeichen abhängt. Primzahlen m führen i.d.R. zu guten Hash-Funktionen Alternative von Stroustrup Bitweises exklusives Oder Statt z = ((z<<8) + s.charAt(i)) % m berechne z = ((z<<1)ˆs.charAt(i)) modulo m ganz zum Schluss: z = z % m W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -11- Springer-Verlag, ISBN 3-540-20958-1

Kollisionsbehandlung I: Listenlösung Kollision besteht beim Einfügen zwei verschiedener Objekte mit demselben Schlüssel, h(s1) = h(s2), s1  s2 Verkettung von Überläufen: Objekte werden in Listen gehalten HT: W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -12- Springer-Verlag, ISBN 3-540-20958-1

Kollisionsbehandlung II: open hashing Offenes Adressieren (open hashing): Wenn HT[h(s)] schon besetzt ist, suche erste freie Stelle h(s)+k, k=1,2,3, ... Bei Suche nach Objekt s prüfe zuerst HT[h(s)]. Wenn dort ein Objekt ungleich s steht, suche weiter bei h(s)+k, k=1,2,3, ... Bis entweder s oder eine unbelegte Stelle gefunden wurde Es können in Tabelle Häufungen von belegten Positionen auftreten, die die Effizienz mindern Dazu gibt es komplexere open hashing Strategien W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -13- Springer-Verlag, ISBN 3-540-20958-1

Hash-Funktionen in JAVA Klasse Object ist Basisklasse jeder Klasse und enthält virtuelle Methode int hashCode() Durch Überschreiben der Methode in abgeleiteter Klasse ist Anpassung an Anwendung möglich Achtung: Objekte werden durch Referenz gespeichert, hashCode() benutzt nur diese Referenz (eine Kopie mit anderer Referenz ergibt anderen hashCode!) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -14- Springer-Verlag, ISBN 3-540-20958-1

Hashing Konzept in JAVA Paket java.util enthält Klasse Hashtable Klasse Hashtable greift auf die Methode hashCode zu und ist durch sie implizit parametrisiert Implementiert ist allgemeiner eine Abbildung (Interface map) einer Menge von Schlüssel-Objekten in eine Menge von Wertobjekten Entspricht einer endlichen, partiellen Funktion W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -15- Springer-Verlag, ISBN 3-540-20958-1

Die Klasse Hashtable implementiert Interface Map Das Interface Map I Die Klasse Hashtable implementiert Interface Map Spezifikationen für zu implementierende Methoden im Interface Map: Object put (Object key, Object value) Legt value in der Map unter key ab. Falls schon ein Element dem key in der Map zugeordnet war, so wird dieses überschrieben. Das Ergebnis ist dieses bisher dort abgelegte Element, oder null, falls es kein solches gab. Object get (Object key) Das Ergebnis ist das Element, das in der Map unter key gespeichert ist. Object remove(Object key) Löscht das unter key abgelegte Element und gibt es zurück. Falls es kein zu key gehörendes Element gab, wird null zurückgegeben. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -16- Springer-Verlag, ISBN 3-540-20958-1

Open hashing wird verwendet zur Behandlung von Kollisionen Das Interface Map II Realisierung Zum Schlüssel-Objekt wird ein numerischer hashCode berechnet In der Hash-Tabelle wird beim Index hashCode das Schlüsselobjekt und das Wertobjekt abgelegt Kollision: Open hashing wird verwendet zur Behandlung von Kollisionen Schlüssel werden verglichen mit virtueller Methode equals, die in Klasse Object definiert ist Achtung: nur die Referenz des Schlüsselobjektes wird hier verwendet W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -17- Springer-Verlag, ISBN 3-540-20958-1

Schlag nach bei www.sun.com Das Interface Map III Schlag nach bei www.sun.com Interface Map Klasse Hashtable W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -18- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 1: Mitarbeiterliste Wert-Objekte: Namen der Personen Schlüssel-Objekte: Hash-codes der Strings der Namen Table.put benötigt als Parameter Klassenobjekte, daher ist nicht int sondern Integer (Hüllklasse) für Schlüssel-Objekt zu verwenden import java.util.*; public class HashtableTestSimple { public static void main(String[] args) { Hashtable table = new Hashtable(); // Trage Mitarbeiter in // Hashtable table ein. String s; Integer k; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -19- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 1: Mitarbeiterliste (cont´d) s = "Anton Wagner"; k = new Integer(s.hashCode()); table.put(k, s); s = "Doris Bach"; s = "Doris May"; s = "Friedrich Dörig"; Achtung: Interner Index in Hash-Tabelle ergibt sich aus hashCode des Schlüsselobjektes k Also werden für ein s insgesamt zweimal Hash-Codes berechnet: s -> s.hashCode() -> (s.hashCode()).hashCode() W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -20- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 1: Mitarbeiterliste (cont´d) // Einige Tests Integer key; String s1, s2; s1 = "Doris May"; key = new Integer(s1.hashCode()); Object e; // get has return value of type object e = table.get(key); if (e == null) System.out.println("Kein zu " + key + " gehörendes Element vorhanden!"); else { s2= (String) e; System.out.println("Gefundenes Element zu " + key + ": " + s2); } W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -21- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 2: Personen/Geburtstage Wert-Objekte: Namen von Personen Schlüssel-Objekte: Geburtsdaten Annahme: keine zwei Personen am selben Tag geboren Ist das realistisch? Ab wieviel Personen ist die Chance 50:50, daß zwei von ihnen am selben Tag Geburtstag feiern können? Darstellung der Schlüsselobjekte in Klasse Date public class Date { private byte day, month; private short year; // Konstruktoren public Date(){day=1; month=1;} public Date(short y) {this(); year=y;} public Date(byte m, short y) {this(y); month = m;} public Date(byte d, byte m, short y) {this(m,y); day=d;} W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -22- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 2: Personen/Geburtstage (cont´d) // Zusätzlicher Konstruktor public Date(int d, int m, int y){ day = (byte) d; month = (byte) m; year = (short) y; } // Selektoren public byte getDay() { return day; } public byte getMonth(){ return month; } public short getYear(){ return year; } public void setDay(byte d) { day=d;} public void setMonth(byte m) { month=m;} public void setYear(short y) { year=y;} // Darsteller public String toString() { return (day + "." + month + "." + year); W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -23- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 2: Personen/Geburtstage (cont´d) Überschreiben von Methoden equals und hashCode nötig, da Klasse Date verschiedene Instanzierungen haben kann mit demselben Datum public class Date { //... // Attribute und Methoden wie zuvor // Überschreibe Methode equals aus Basisklasse Object /** * A Date is equal to an Object if it is * a Date representing the same date. */ public boolean equals(Object obj) { if (!(obj instanceof Date)) return false; return ( ((Date) obj).day == day && ((Date) obj).month==month && ((Date) obj).year==year ); } // Überschreibe Methode hashCode aus Basisklasse Object public int hashCode() { return day+month*32+year*1024; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -24- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 2: Personen/Geburtstage (cont´d) public class HashtableTest { public static void main(String[] args) { java.util.Hashtable table = new java.util.Hashtable(); String s; Date d; // Trage Daten in Tabelle ein s = "Anton Wagner"; d = new Date(12,2,1960); table.put(d, s); s = "Doris Bach"; d = new Date(27,4,1970); s = "Doris May"; d = new Date(24,12,1973); s = "Friedrich Dörig"; d = new Date(1,1,1953); W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -25- Springer-Verlag, ISBN 3-540-20958-1

Beispiel 2: Personen/Geburtstage (cont´d) // Suche einen Mitarbeiter mit Geburtstag 27.04.1970 Date sd = new Date(27,4,1970); String sr; Object e; // get has return value of type object e = table.get(sd); if (e == null) System.out.println("Kein zu " + sd + " gehörendes Element vorhanden!"); else { sr = (String) e; System.out.println("Gefundenes Element zu " + sd + ": " + sr); } } } Die Ausgabe des Hauptprogramms der Klasse HashtableTest ist dann: Gefundenes Element zu 27.4.1970: Doris Bach W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -26- Springer-Verlag, ISBN 3-540-20958-1