Einführung in die Informatik 2

Ähnliche Dokumente
Einführung in die Informatik 2

Hashing. Hash-Tabelle (hash table) Speichert Objekte unter ihrem hash code ab Implementierung: setze array index = hash code

Hashing. Hash-Tabellen und -Funktionen Hash-Tabellen in Java

Einführung in die Informatik 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Teil VII. Hashverfahren

Themen. Hashverfahren. Stefan Szalowski Programmierung II Hashverfahren

Einführung in die Informatik 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Was ist ein assoziativer Speicher?

Einführung in die Informatik 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Einführung in die Informatik 2

Software Entwicklung 1

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

12 Abstrakte Klassen, finale Klassen und Interfaces

8. Hashing Lernziele. 8. Hashing

6/23/06. Universelles Hashing. Nutzen des Universellen Hashing. Problem: h fest gewählt es gibt ein S U mit vielen Kollisionen

Beuth Hochschule Hash-Tabellen WS17/18, S. 1

Einführung in die Informatik 1

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

Einführung in die Informatik 2

Die abstrakte Klasse Expression:

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 17/18. Kapitel 14. Bäume. Bäume 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 4 ArrayList, PriorityQueue, HashSet und HashMap

17. Hashing. Hash Tabellen, Geburtstagsparadoxon, Hashfunktionen, Kollisionsauflösung durch Verketten, offenes Hashing, Sondieren

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 13. Bäume. Bäume 1

Bäume. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

Programmiertechnik II

18. Natürliche Suchbäume

Physikalisch Technische Lehranstalt Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure

Eine universelle Klasse von Hash-Funktionen

Satz 23 In einer Hashtabelle der Größe n mit m Objekten tritt mit Wahrscheinlichkeit

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Bäume. Martin Wirsing. Ziele. Implementierung von Knoten. Bäume (abstrakt) Standardimplementierungen für Bäume kennen lernen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Datenstrukturen und Algorithmen. Vorlesung 10

1 Hashing und die Klasse String

Kapitel 4: Bäume i. 1. Einleitung. 2. Ein Datenmodell für Listen. 3. Doppelt-verkettete Listen. 4. Bäume. 5. Das Collections-Framework in Java

Informatik II, SS 2014

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Geordnete Binärbäume

4. Vererbung Die Klasse Object. Die Klasse Object

Hashmap: Video Erklärung

Algorithmen und Datenstrukturen 11

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B6.1 Einführung. B6.2 Symboltabellen. B6.3 Einfache Implementationen

Algorithmen und Datenstrukturen (für ET/IT)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Informatik II - Übung 07

13. Hashing. AVL-Bäume: Frage: Suche, Minimum, Maximum, Nachfolger in O(log n) Einfügen, Löschen in O(log n)

EADS 3.3 Gewichtsbalancierte Bäume 95/598 ľernst W. Mayr

Maps Software Entwicklung 1

Algorithmen und Datenstrukturen

Informatik II Prüfungsvorbereitungskurs

ADT: Java Collections und ArrayList

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Software Entwicklung 1

Fachhochschule Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Teil 1: Suchen. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Suchen 1-1

Programmiertechnik II

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

9. Natürliche Suchbäume

B6.1 Introduction. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B6.1 Introduction. B6.3 Analyse. B6.4 Ordnungsbasierte Methoden

Informatik II Vorlesung am D-BAUG der ETH Zürich

Übung Algorithmen und Datenstrukturen

Hashing. Algorithmen und Datenstrukturen II 1

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

5.8.2 Erweiterungen Dynamische Hash-Funktionen (mit variabler Tabellengröße)?

Informatik II Hashing

Informatik II Hashing

Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Sommersemester Dr. Tobias Lasser

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete.

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Tutoraufgabe 1 (Implementierung eines ADTs):

Bäume, Suchbäume und Hash-Tabellen

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

2. Suchen mit Hashverfahren

Transkript:

Einführung in die Informatik 2 Wörterbücher und Hashing Sven Kosub AG Algorithmik/Theorie komplexer Systeme Universität Konstanz E 202 Sven.Kosub@uni-konstanz.de Sprechstunde: Freitag, 12:30-14:00 Uhr, o.n.v. Sommersemester 2009 Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 1 / 31

Worterbücher Wörterbuch (engl. dictionary): dynamisch veränderliche Objektmenge D aus einem Universum U möglicher Objekte mit den Grundoperationen: Suchen: Ist ein Objekt d in D enthalten? Falls Ja, gib es zurück Löschen: Entferne Objekt d aus D Einfügen: Füge Objekt d in D ein Probleme mit bekannten Wörterbuchimplementierungen: Reihungen: dynamische Anpassungen teuer, viel ungenutzter Speicher bei wenigen Objekten Listen: Suchen in O(n); Einfügen, Löschen zwar effizient, aber vorher immer Suche notwendig Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 2 / 31

Suchbäume Annahme: Universum U ist geordnet bezüglich U (binärer) Suchbaum für Wörterbuch D: voller Binärbaum T innere Knoten enthalten die Objekte von D in jedem inneren Knoten v gilt die Suchbaumeigenschaft: Objekte im linken Teilbaum von v U Objekt in v Objekte im rechten Teilbaum von v > U Objekt in v Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 3 / 31

Suchbäume: Beispiel 4 2 5 1 3 12 7 Suchbaumeigenschaft für alle Knoten erfüllt Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 4 / 31

Suchbäume: Beispiel 4 2 7 1 3 12 5 Suchbaumeigenschaft nur für Knoten mit Inhalt 7 nicht erfüllt Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 5 / 31

Suchbäume: Implementierung in Java package searchtree; public class Node { Comparable key; Node parent; Node leftchild; Node rightchild; boolean isexternal;. // Konstruktor Node() { key=null; parent=null; leftchild=null; rightchild=null; isexternal=true;. public class SearchTree { private Node root; // Konstruktor SearchTree() { root=new Node; Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 6 / 31

Suchbäume: Suchen package searchtree; public class SearchTree {. private Node TreeSearch(Node n, Comparable k) { if (n.isexternal) return(n); int c=n.key.compareto(k); if (c==0) return(n); if (c<0) return(treesearch(n.rightchild, k)); else return(treesearch(n.leftchild), k)); public Node finditem(comparable d) { return(treesearch(root,d));. Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 7 / 31

Suchbäume: Suchen 4 2 5 1 3 12 7 erfolgreiche Suche nach Schlüssel 3 Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 8 / 31

Suchbäume: Suchen 4 2 5 1 3 12 7 erfolglose Suche nach Schlüssel 8 Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 9 / 31

Suchbäume: Einfügen package searchtree; public class SearchTree {. public void insertitem(comparable k) {. // Suche Blatt zum Einfügen Node n=treesearch(root, k); while (!n.isexternal) n=treesearch(n.left, k); // Mache Blatt zu inneren Knoten mit neuem Inhalt k n.key=k; n.isexternal=false; n.leftchild=new Node; n.leftchild.parent=n; n.rightchild=new Node; n.rightchild.parent=n; Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 10 / 31

Suchbäume: Suchen 4 2 5 1 3 12 7 Finde Blatt zum Einfügen von Schlüssel 8 Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 11 / 31

Suchbäume: Suchen 4 2 5 1 3 12 7 8 Füge Schlüssel 8 ein Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 12 / 31

Suchbäume: Beurteilung Suchen: benötigt O(h) Vergleiche Einfügen: benötigt ebenfalls O(h) Vergleiche wegen Verwendung von TreeSearch; Einfügen selbst ist effizient, d.h. O(1) Löschen: benötigt O(h) Vergleiche wegen Restrukturierung zur Gewährleistung der Suchbaumeigenschaft (private Methode inordernext(node n)) Fazit: bei Höhenbalancierung ist O(log n) für alle Operationen realisierbar; nach Einfügen und Löschen Ausbalancierung notwendig Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 13 / 31

Komponenten von Hashverfahren (Streuspeicherverfahren) Hash-Funktion (engl. hash function) bildet Objekte auf natürliche Zahlen (Java-Typ int) ab jedes Objekt erhält somit Hash-Wert (engl. hash codes) Hash-Werte dienen als Schlüssel zur Identifizierung der Objekte Abbildung nicht notwendigerweise injektiv, d.h. zwei Objekte könnten gleichen Hash-Wert besitzen (Kollision) Hash-Tabelle (engl. hash table) speichert Objekte unter ihrem Hash-Wert ab Implementierung als Reihung mit Hash-Werten als Index Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 14 / 31

Verallgemeinerung von Hashing Verwendung nichtnummerischer Schlüssel: Abbildung von Objekten ( Schlüsselobjekte ) auf Objekte ( Wert-Objekte ) Prinzip: Wertobjekt wird unter Schlüsselobjekt (z.b. aus Klasse String) als Paar Schlüsselobjekt, Wertobjekt in Hash-Tabelle unter Hash-Wert von Schlüsselobjekt gespreichert Java-Implementierung ist so organisiert Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 15 / 31

Einfachste Version einer Hash-Tabelle nummerische Schlüssel als Indizes für Reihung sinnvoll falls: Hash-Funktion injektiv, d.h. verschiedene Objekte haben verschiedene Schlüssel genügend Speicherplatz vorhanden, um alle möglichen Schlüssel als Index unterzubringen (häufig problematisch, da typischerweise nur wenige Schlüssel verwendet werden) Kollisionen sind praktisch nicht vermeidbar, d.h. spezielle Strategien zur Kollisionsbehandlung notwendig Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 16 / 31

Einfachste Version einer Hash-Tabelle Objekte der Klasse String sind durch Personennamen gegeben Hash-Funktion h sei wie folgt definiert: h(s) = i def Anfangsbuchstabe des Nachnamens von s ist i-ter Buchstabe des Alphabets Beispielmenge: Anton Wagner W 23 Doris Bach B 2 Doris May M 13 Friedrich Dörig D 4 Reihung (Array) der Größe 26 reicht aus keine Kollisionen Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 17 / 31

Hash-Funktionen formale Hash-Funktion h: h : Menge der Objekte N (bzw. N k ) Objekt s wird Speichplatz HT[h(s)] zugewiesen Zugriff auf Objekt in konstanter Zeit, d.h. in O(1) (ohne Kollisionen) h( Doris Bach )= 2 führt zu HT[2]="Doris Bach" Entwurfsaspekte zur Kollisionsvorbeugung: Tabelle hinreichend groß wählen Hash-Funktion vom gesamten Objekt abhängen lassen (d.h. bei Objekten der Klasse String von allen Buchstaben) Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 18 / 31

Hash-Funktionen für Zeichenketten h(s) = def Konkatenation des ASCII-Codes der Buchstaben in s h( INFO ) = 494E464F 16 mit Symbol I N F O ASCII 49 16 4E 16 46 16 4F 16 Problem: h(s) ergibt zu große Indizes z.b. bei Zeichenketten bis zur Länge 20 nimmt benötigter Indexraum 2 21 Byte bzw. 2MB in Anspruch (1 Byte pro Symbol) Ausweg: Reduktion von h(s) durch Rechnung mod m Hash-Tabellen hat Kapazität für maximal m Einträge Kollisionen nicht ausgeschlossen Für m = 83 ist h( INFO ) = 48 10, denn 494E464F 16 mod 83 = 1229866575 10 mod 83 = 48 10 mod 83 Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 19 / 31

Modulo-Arithmetik Problem: explizite Berechnung von h(s) (ohne Modulus) nicht in CPU-Arithmetik möglich (in long) für s.length()> 8 Ausweg: berechnen h(s) mit Modulus m mittels folgender Regeln: (a + b) mod m = ( (a mod m) + (b mod m) ) mod m (a b) mod m = ( (a mod m) (b mod m) ) mod m Horner-Schema: z(i, s) sei (8-Bit-)ASCII-Wert des i-ten Symbols von s = s 0 s 1... s n 1 h(s) = h n 1 (s) ergibt sich rekursiv wie folgt: h 0 (s) = z(0, s) mod m h k (s) = ( 256 h k 1 + z(k, s) ) mod m für k = 1, 2,..., n 1 Wahl des Modulus: schlecht: z.b. m = 256, da h(s) nur vom letzten Buchstaben abhängt gut: Primzahlen Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 20 / 31

Kollisionsbehandlung: Verkettung Verkettung (engl. chaining): Objekte werden in Listen verwaltet Problem: lineare Suche in lange Listen notwendig (bei hohem Füllfaktor) Ausweg: offene Adressierung Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 21 / 31

Kollisionsbehandlung: Offene Adressierung Offene Adressierung (engl. open hashing): Einfügen: wenn HT[h(s)] bereits belegt, dann suche erste freie Stelle h(s) + k für k = 1, 2,... Suchen: solange Objekt in HT[h(s)+k] verschieden von s, inkrementiere k beginnend bei 0 Problem: Häufungen in bestimmten Bereichen der Hash-Tabelle möglich (Effizienzverminderung) Ausweg: Verwendung gut streuender Hash-Funktion (abhängig von Datencharakteristik) Verwendung komplexerer Hash-Verfahren (z.b. double hashing, cuckoo hashing, universal hashing etc.) Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 22 / 31

Das Hashing-Konzept von Java Hash-Funktionen: Klasse Object ist Basisklasse jeder Klasse und enthält virtuelle Methode int hashcode() durch Überschreiben der Methode in abgeleiteter Klasse Anpassung an Anwendung möglich Achtung: Objekte werden durch Referenz gespeichert, hashcode() benutzt nur diese Referenz, d.h. Kopie mit anderer Referenz ergibt anderen Rückgabewert von hashcode() Hash-Tabellen: Paket java.util enthält Klasse HashTable Klasse Hashtable greift auf Methode hashcode zu und ist durch sie impliziert parametrisiert implementiert ist allgemeiner eine Abbildung (Interface Map) von einer Menge von Schlüsselobjekten in einer Menge von Wertobjekten Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 23 / 31

Das Hashing-Konzept von Java Klasse Hashtable implementiert Interface Map mit folgenden Spezifikationen: Object put(object key, Object value) legt Objekt value in der Map unter key falls schon Objekt unter key abgelegt war, wird dieses Objekt überschrieben Ergebnis ist das bisher unter key abgelegte Objekt (oder null) Object get(object key) Ergebnis ist das unter key abgelegte Objekt (oder null) Object remove(object key) löscht das unter key abgelegte Objekt und gibt es zurück (oder null) Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 24 / 31

Das Hashing-Konzept von Java Realisierung von Hash-Tabellen: zum Schlüsselobjekt wird nummerischer Hash-Wert berechnet mittels hashcode() in der Hash-Tabelle wird beim Index hashcode() das Schlüsselobjekt und das Wertobjekt abgelegt Kollisionsbehandlung: offene Adressierung wird verwendet Vergleich von Schlüssel mittels virtueller Methode equals() eines Objektes beachte: nur Referenz von Schlüsselobjekten wird verwendet Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 25 / 31

Das Hashing-Konzept von Java: Beispiel 1 import java.util.* public class HashtableExample{ public static void main(string[] args){ Hashtable table=new Hashtable(); String s; Integer k; s="anton Wagner"; k=new Integer(s.hashCode()); table.put(k,s); s="doris Bach"; k=new Integer(s.hashCode()); table.put(k,s); s="doris May"; k=new Integer(s.hashCode()); table.put(k,s); s="friedrich Dörig"; k=new Integer(s.hashCode()); table.put(k,s);. Besonderheiten: Wert-Objekte: Personennamen Schlüssel-Objekte: Hash-Werte der Namen table.put benötigt Klassenobjekte als Parameter, deshalb Integer statt int interne Position (Hash-Wert) in table ergibt sich aus hashcode() des Objektes s: es werden also zweimal Hash-Werte berechnet Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 26 / 31

Das Hashing-Konzept von Java: Beispiel 1. Integer key; String s1, s2; s1="doris May"; key=new Integer(s1.hashCode()); Object e; e=table.get(key); if (e == null) System.out.println("Kein Element mit Schlüssel " + key + " vorhanden!"); else{ s2=(string) e; System.out.println("Gefundenes Element mit Schlüssel " + key + ": " + s2); Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 27 / 31

Das Hashing-Konzept von Java: Beispiel 2 import java.util.* public class HashtableExample{ public static void main(string[] args){ Hashtable table=new Hashtable(); String s; Date d; s="anton Wagner"; d=new Date(12,2,1960); table.put(d,s); s="doris Bach"; d=new Date(27,4,1970); table.put(d,s); s="doris May"; d=new Date(24,12,1973); table.put(d,s); s="friedrich Dörig"; d=new Date(1,1,1953); table.put(d,s);. Besonderheiten: Wert-Objekte: Personennamen Schlüssel-Objekte: Geburtsdaten Annahme: keine zwei Personen mit gleichen Geburtsdatum Klasse Date wird noch spezifiziert Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 28 / 31

Das Hashing-Konzept von Java: Beispiel 2. Date sd=new Date(27,4,1970); String rs; Object e; e=table.get(sd); if (e == null) System.out.println("Kein Element mit Geburtsdatum " + sd + " vorhanden!"); else { rs=(string) e; System.out.println("Gefundenes Element mit Geburtsdatum " + sd + ": " + rs); Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 29 / 31

Das Hashing-Konzept von Java: Beispiel 2 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; 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;. Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 30 / 31

Das Hashing-Konzept von Java: Beispiel 2. // Darsteller public String tostring(){ return(day + "." + month + "." + year); // Überschreibe virtuelle Methode equals aus Basisklasse Object 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 virtuelle Methode hashcode aus Basisklasse Object public int hashcode(){ return(day + month*32 + year*1024); Sven Kosub (Algorithmik/TKS) EI2: Wörterbücher und Hashing 31 / 31