Algorithmen und Datenstrukturen Übungsmodul 11

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
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
GIN 2 – Vorlesung zu Hashing, 31. Mai 2005 Prof. Dr. W. Conen FH Gelsenkirchen SS 2005.
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)
Dr. Brigitte Mathiak Kapitel 9 Physische Datenorganisation (ganz kurz)
Kapitel 6. Suchverfahren
Synonyme: Stapel, Keller, LIFO-Liste usw.
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Referenzen und Zeichenketten
Algorithmentheorie 04 –Hashing
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Halbzeit: Kurze Wiederholung
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 (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.
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.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Informatik II: Algorithmen und Datenstrukturen SS 2013
- Schnittmengenbildung -
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Eine Implementierung einer effiziente externe geordnete (!) lineare Liste Operationen: Search(x) Insert(x) Delete(x)
Einführung in die Programmierung
Grundlagen der 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.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Christian Mansky Design - Fallstudien Christian Mansky
Algorithmen und Datenstrukturen Übungsmodul 10
Algorithmen und Datenstrukturen SS 2005
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 5 Dr. W. Narzt u. Dr. A. Stritzinger.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Algorithmen und Datenstrukturen Übungsmodul 8
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Algorithmen und Datenstrukturen SS 2005
Algorithmen und Datenstrukturen Übungsmodul 1
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 2 Dr. W. Narzt u. Dr. A. Stritzinger.
Algorithmen und Datenstrukturen Übungsmodul 3
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
(Syntax, Strings/Zahlen, Variablen, Arrays)
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Tutorium Software-Engineering SS14 Florian Manghofer.
 Präsentation transkript:

Algorithmen und Datenstrukturen Übungsmodul 11 Dr. W.Narzt u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz

Hashing - Allgemeines Was ist Hashing? Ein Verfahren zur Speicherung von Datensätzen (records), die sehr effektiv mittels Schlüsselattribut gesucht werden können. Hashtabelle (auch hashmap) Zuordnung (-tabelle) von Schlüssel(attribut) (z.B.: Name einer Person) zu Werten (z.B.: Adresse od. beliebige weitere Inhalte) Hashfunktion Abbildungsvorschrift eines Schlüssels (z.B.: Zeichenkette) auf einen Integer-Index.

Hashfunktion "Gute" Hashfunktionen sind wichtig um die verschiedenen Schlüsselwerte gleichmäßig (mit wenig Kollisionen) auf den Adressbereich (Wertebereich) des Hashindex abzubilden "Schlechte" Hashfunktionen führen zu Clustern (Anhäufungen von kollidierenden Datensätzen) und verschlechtern die Zugriffseffizienz Kollisionen (zwei unterschiedliche Schlüssel werden „zufällig“ auf gleichen Hashwert abgebildet) müssen irgendwie aufgelöst werden: Verkettung (dyn. Liste variabler Länge für kollidierende Elemente) Offene Adressierung (Ausweichplatz innerhalb der Hashtabelle)

Hashfunktionen - Verfahren Additive und logische Transformation Der Schlüssel wird in Gruppen von je n bit (8,16,32) zerlegt, die Gruppen werden durch exklusives Oder oder durch (gewichtete) Addition zusammengefaßt. Multiplikative Transformation Der Schlüssel wird multipliziert (mit konstantem Wert oder mit sich selbst). Einen Teil des Ergebnisses wird herausgeschnitten und als Hash-Adresse interpretiert. Um sicherzustellen, dass Adresse immer im gültigen Bereich liegt, wird nach jeder Transformation hash = result modulo tableSize angewandt Zeichenkettentransformation Im 7-bit ascii code kann jedes Zeichen um 128 (=27) höher gewichtet werden als sein Vorgänger. Anstelle des Gewichtungsfaktors 128 ist es besser die Primzahl 127 zu verwenden, da es sonst zu Anomalien bei Tabellengröße, die ein Vielfaches von 2, bzw. eine Zweierpotenz sind, kommt. int hash(String s, int tableSize) { int h = 0; int a = 127; for (int i = 0; i < s.length(); i++) h = (a * h + s.charAt(i)) % tableSize; } return h;

Kollisionsstrategien Verkettung Kollidierende Werte werden in einer verketteten Liste mit Anker in der Tabelle verwaltet (gute Lösung wenn sehr kurze Listen) Offene Adressierung Durch mathem. Sonderbehandlung wird neue Hashadresse berechnet: Lineares Sondieren (nächste freie Stelle häufig durch wiederh. +1 suchen) Quadratisches Sondieren (+1, +4, +9, …) Doppeltes Hashing (zweite verschiedene Hashfunktion anwenden, wiederholen bis freie Stelle gefunden)

Sondierungsverfahren Lineares Sondieren pos0 = h(k) posi = (pos0 + i) modulo tableSize Quadratisches Sondieren pos0 = h(k) posi = (pos0 + i2) modulo tableSize Doppeltes Hashing pos0 = h(k) posi = (posi-1 + i*h2(k)) modulo tableSize

Löschen von Elementen Offene Adressierung Problematisch bei allen Hashstrategien mit offener Adressierung ist das Löschen von Elementen. Die belegte Tabellenposition darf nicht ohne zusätzliche Vorkehrungen freigegeben werden! "Dahinterliegende" Elemente, die aufgrund einer Kollision auf die folgenden Plätze eingefügt wurden könnten dadurch nicht mehr erreicht werden. Lösung: Zusätzliches Flag, zur Kennzeichnung ob der Tabellenplatz frei ist oder bereits einen Wert enthielt, der inzwischen wieder gelöscht wurde. Verkettung Element aus Liste entfernen

Tabellenneuzuteilung - Rehashing Tabellenauslastung Ab 70-80% Auslastungsfaktor kann die Leistungsfähigkeit einer Hashtabelle dramatisch einbrechen. Rehashing Bei Erreichen eines Schwellwertes (z.B.: 75%) kann neue Tabelle mit z.B. doppelter Größe angelegt und alle Elemente umgespeichert werden Kosten für Rehashing sind im allgemeinen relativ hoch: O(n)

Hashtable (Hashdictionary) in Java class HashDictionary { static class Item { String key; int value; Item(String w) { key = w; value = 1; } public String toString() { String space = ""; int i=key.length(); while (i<25) {space=space+" ";i++;} return key+space+value; private Item[] hTable; private int tSize;

Zwei Hashfunktionen für doppeltes Hashing static int hash(String s, int tableSize) { int h = 0; int a = 127; for (int i=0; i<s.length(); i++) { h=(a*h + s.charAt(i))%tableSize; } return h; static int hash2(String s, int tableSize) { for (int i=s.length()-1; i>=0; i--) { HashDictionary(int max) { tSize = max; hTable = new Item[tSize];

Operation Einfügen void insert(Item x) { int pos = hash(x.key,tSize); int h2 = hash2(x.key,tSize); int i = 1; int iColl=0; while (hTable[pos] != null && iColl<tSize) { if (hTable[pos].key.equals(x.key)) return; iColl++; //collision pos = (pos + i*h2) % tSize; i++; } if (iColl>=tSize) { Error…} hTable[pos] = x;

Operation Suchen Item search(String key) { int pos = hash(key,tSize); int h2 = hash2(key,tSize); int i = 1; int sColl=0; while (hTable[pos] != null && sColl<tSize) { if (hTable[pos].key.equals(key)) return hTable[pos]; sColl++; //collision pos = (pos + i*h2) % tSize; i++; } if (sColl>=tSize) { Error… } return null;

Analyse Hashing Ermöglicht sehr schnelles Suchen von Elementen. Im optimalen Fall beträgt die asymptotische Laufzeitkomplexität O(1). Der größte Nachteil gegenüber Techniken mit dynamischer Speicherzuweisung ist die feste Größe der Tabelle, die dem momentanen Bedarf nicht angepaßt werden kann. Eine ziemlich gute a priori Abschätzung der Zahl der zu ordnenden Datenelemente ist daher Voraussetzung zur Vermeidung schlechter Speicherausnutzung oder schlechter Leistung. Möglichkeiten, um die Performance zu steigern: Erhöhung der Tabellengröße Empirische Untersuchungen haben gezeigt, daß die Tabellengröße ungefähr um einen Faktor 1 1/2 bis 2 größer sein soll, als die Anzahl der zu speichernden Elemente. Verwendung einer besseren Methode zur Behandlung von Kollisionen. Die Methoden des linearen und quadratischen Sondierens lösen zwar das Problem der Kollisionen, erhöhen aber gleichzeitig die Wahrscheinlichkeit von weiteren Kollisionen. Die Methode der direkten Verkettung ist eine wesentlich bessere Möglichkeit. Verwendung einer anderen (besseren) Hash-Funktionen. Anmerkung: Eine Hash-Funktion ist dann besser, wenn es ihr “gelingt”, die Elemente gleichförmiger über die Hash-Tabelle zu verteilen, d.h. “clustering” so weit als möglich unterbindet.

Vergleich mit Binärbäumen Gegenüber geordneten Binärbäumen folgende Vorteile: Unter guten Bedingungen bessere Effizienz! Nachteile: Fixe Größe der Tabelle (entw. Platzverschwendung oder zu klein) Effizienzverschlechterung durch Clusterbildung Keine geordnete (sortierte) Traversierung der Elemente möglich. Löschen eventuell problematisch Besonderheiten: Rehashing in größere Tabelle eventuell sinnvoll Zusätzliche Verkettung um Sortierreihenfolge zu pflegen