Vorlesung Informatik 2 Algorithmen und Datenstrukturen (15 Hashverfahren: Verkettung der Überläufer) Prof. Th. Ottmann.

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Hash-Tabellen und -Funktionen Hash-Tabellen in Java
Eine dynamische Menge, die diese Operationen unterstützt,
Eine dynamische Menge, die diese Operationen unterstützt,
Vorlesung Programmieren II
Prof. Dr. S. Albers Prof.Dr.Th Ottmann
Christian Schindelhauer
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)
Claudio Moraga; Gisbert Dittrich
Kapitel 6: Klassifizierung von Sortiertechniken
<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.
5. Sortier-Algorithmen Vorbemerkungen:
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Listen Richard Göbel.
Sortierverfahren Richard Göbel.
Effizienz: Indexstrukturen
Algorithmentheorie 04 –Hashing
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (04 – Entwurfsverfahren) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (23 – Sortieren vorsortierter Daten) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (08 - Einfache Sortierverfahren) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Prof. Dr. S. Albers Prof. Dr. Th. Ottmann
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Halbzeit: Kurze Wiederholung
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen Halbzeit: Was haben wir bisher gelernt? Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
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 (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (11-3 –Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (11-1 –Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27-Selbstanordnende lineare Listen) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 – Dynamische Tabellen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (14 Amortisierte worst-case-Analyse Beispiel: Bitwechselkosten eines Dualzählers) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 13 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 16 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUTE University of Paderborn Algorithms and Complexity Algorithmen und Komplexität Teil 1: Grundlegende.
Operationen auf verketteten Listen
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Kapitel 2: Datenstrukturen
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Eine Implementierung einer effiziente externe geordnete (!) lineare Liste Operationen: Search(x) Insert(x) Delete(x)
Einführung in die Programmierung
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 Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Algorithmen und Datenstrukturen Übungsmodul 11
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Sammlungsklassen Array.
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Tutorium Software-Engineering SS14 Florian Manghofer.
 Präsentation transkript:

Vorlesung Informatik 2 Algorithmen und Datenstrukturen (15 Hashverfahren: Verkettung der Überläufer) Prof. Th. Ottmann

Möglichkeiten der Kollisionsbehandlung Die Behandlung von Kollisionen erfolgt bei verschiedenen Verfahren unterschiedlich. Ein Datensatz mit Schlüssel s ist ein Überläufer, wenn der Behälter h(s) schon durch einen anderen Satz belegt ist. Wie kann mit Überläufern verfahren werden? 1. Behälter werden durch verkettete Listen realisiert. Überläufer werden in diesen Listen abgespeichert. Chaining (Hashing mit Verkettung der Überläufer) 2. Überläufer werden in noch freien anderen Behältern abgespeichert. Diese werden beim Speichern und Suchen durch sogenanntes Sondieren gefunden. Open Addressing (Offene Hashverfahren)

Verkettung der Überläufer (1) Die Hash-Tabelle ist ein Array (Länge m) von Listen. Jeder Behälter wird durch eine Liste realisiert. class hashTable { Liste [] ht; // ein Listen-Array hashTable (int m){ // Konstruktor ht = new Liste[m]; for (int i = 0; i < m; i++) ht[i] = new Liste(); // Listen-Erzeugung } ... } Zwei verschiedene Möglichkeiten der Listen-Anlage: 1. Hash-Tabelle enthält nur Listen-Köpfe, Datensätze sind in Listen: Direkte Verkettung 2. Hash-Tabelle enthält pro Behälter maximal einen Datensatz sowie einen Listen-Kopf. Überläufer kommen in die Liste: Separate Verkettung

Hashing mit Verkettung der Überläufer Schlüssel werden in Überlauflisten gespeichert h(k) = k mod 7 0 1 2 3 4 5 6 Haschtabelle T Zeiger 53 12 15 2 43 5 Überläufer 19 Diese Art der Verkettung wird auch als direkte Verkettung bezeichnet.

Verkettung der Überläufer Suchen nach Schlüssel k - Berechne h(k) und Überlaufliste T[h(k)] - Suche nach k in der Überlaufliste Einfügen eines Schlüssels k - Suchen nach k (erfolglos) - Einfügen in die Überlaufliste Entfernen eines Schlüssels k - Suchen nach k (erfolgreich) - Entfernen aus Überlaufliste  Reine Listenoperationen

Implementierung in Java class TableEntry { private Object key,value; } abstract class HashTable { private TableEntry[] tableEntry; private int capacity; //Konstruktor HashTable (int capacity) { this.capacity = capacity; tableEntry = new TableEntry [capacity]; for (int i = 0; i <= capacity-1; i++) tableEntry[i] = null; } // die Hashfunktion protected abstract int h (Object key); // fuege Element mit Schluessel key und Wert value ein (falls nicht vorhanden) public abstract void insert (Object key Object value); // entferne Element mit Schluessel key (falls vorhanden) public abstract void delete (Object key); // suche Element mit Schluessel key public abstract Object search (Object key); } // class hashTable

Implementierung in Java class ChainedTableEntry extends TableEntry { // Konstruktor ChainedTableEntry(Object key, Object value) { super(key, value); this.next = null; } private ChainedTableEntry next; } class ChainedHashTable extends HashTable { // die Hashfunktion public int h(Object key) { return key.hashCode() % capacity ; } // suche key in der Hashtabelle public Object search (Object key) { ChainedTableEntry p; p = (ChainedTableEntry) tableEntry[h(key)]; // Gehe die Liste durch bis Ende erreicht oder key gefunden while (p != null && !p.key.equals(key)) { p = p.next; } // Gib Ergebnis zurueck if (p != null) return p.value; else return null; }

Implementierung in Java /* fuege ein Element mit Schluessel key und Wert value ein (falls nicht vorhanden) */ public void insert (Object key, Object value) { ChainedTableEntry entry = new ChainedTableEntry(key, value); // Hole den Tabelleneintrag fuer key int k = h (key); ChainedTableEntry p; p = (ChainedTableEntry) tableEntry [k]; if (p == null){ tableEntry[k] = entry; return ; } // Suche nach key while (!p.key.equals(key) && p.next != null) { p = p.next; } // Fuege das Element ein (falls nicht vorhanden) if (!p.key.equals(key)) p.next = entry; }

Implementierung in Java // entferne das Element mit Schluessel key (falls vorhanden) public void delete (Object key) { int k = h (key); ChainedTableEntry p; p = (ChainedTableEntry) TableEntry [k]; TableEntry[k] = recDelete(p, key); } // entferne das Element mit Schluessel key rekursiv (falls vorhanden) public ChainedTableEntry recDelete (ChainedTableEntry p, Object key) { /* recDelete gibt einen Zeiger auf den Beginn der Liste, auf die p zeigt, zurueck, in der key entfernt wurde */ if (p == null) return null; if (p.key.equals(key)) return p.getNext(); // ansonsten: p.next = recDelete(p.next, key); return p; } public void printTable () {...} } // class ChainedHashTable

Test-Programm public class ChainedHashingTest { public static void main(String args[]){ Integer[] t= new Integer[args.length]; for (int i = 0; i < args.length; i++) t[i] = Integer.valueOf(args[i]); ChainedHashTable h = new ChainedHashTable(7); for (int i = 0; i <= t.length - 1; i++) h.insert(t[i], null); h.printTable (); h.delete(t[0]); h.delete(t[1]); h.delete(t[6]); h.printTable(); } } Aufruf: java ChainedHashingTest 12 53 5 15 2 19 43 Ausgabe: 0: -| 0: -| 1: 15 -> 43 -| 1: 15 -| 2: 2 -| 2: 2 -| 3: -| 3: -| 4: 53 -| 4: -| 5: 12 -> 5 -> 19 -| 5: 5 -> 19 -| 6: -| 6: -|

Analyse der direkten Verkettung Uniform-Hashing Annahme: alle Hashadressen werden mit gleicher Wahrscheinlichkeit gewählt, d.h.: Pr(h(ki) = j) = 1/m unabhängig von Operation zu Operation Mittlere Kettenlänge bei n Einträgen: n/m = Definition C´n = Erwartungswert für die Anzahl betrachteter Einträge bei erfolgloser Suche Cn = Erwartungswert für die Anzahl betrachteter Einträge bei erfolgreicher Suche Analyse

Verkettung der Überläufer Vorteile: + Cn und C´n niedrig + > 1 möglich + echte Entfernungen + für Sekundärspeicher geeignet Effizienz der Suche Cn (erfolgreich) C´n (erfolglos) 0.50 1.250 0.50 0.90 1.450 0.90 0.95 1.457 0.95 1.00 1.500 1.00 2.00 2.000 2.00 3.00 2.500 3.00 Nachteile - Zusätzlicher Speicherplatz für Zeiger - Überläufer außerhalb der Hashtabelle

Zusammenfassung Analyse des Offenen Hashing: worst case: h(s) liefert immer den gleichen Wert, alle Datensätze sind in einer Liste. Verhalten wie bei Linearer Liste. average case: – Erfolgreiche Suche & Entfernen: Aufwand in Datenzugriffen 1 + 0.5 × BF – Erfolglose Suche & Einfügen: Aufwand BF Das gilt für direkte Verkettung, bei separater Verkettung ist der Aufwand jeweils etwas höher. best case: Die Suche hat sofort Erfolg. Aufwand O(1).