Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 11 Dr. W.Narzt u. Dr. A.Stritzinger Institut."—  Präsentation transkript:

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

2 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 2 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.

3 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 3 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)

4 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 4 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 (=2 7 ) 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; }

5 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 5 Kollisionsstrategien l Verkettung Kollidierende Werte werden in einer verketteten Liste mit Anker in der Tabelle verwaltet (gute Lösung wenn sehr kurze Listen) l 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)

6 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 6 Sondierungsverfahren Lineares Sondieren pos 0 = h(k) pos i = (pos 0 + i) modulo tableSize Quadratisches Sondieren pos 0 = h(k) pos i = (pos 0 + i 2 ) modulo tableSize Doppeltes Hashing pos 0 = h(k) pos i = (pos i-1 + i*h2(k)) modulo tableSize

7 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 7 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

8 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 8 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)

9 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 9 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;

10 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 10 Zwei Hashfunktionen für doppeltes Hashing static int hash(String s, int tableSize) { int h = 0; int a = 127; for (int i=0; i=0; i--) { h=(a*h + s.charAt(i))%tableSize; } return h; } HashDictionary(int max) { tSize = max; hTable = new Item[tSize]; }

11 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 11 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) { Error…} hTable[pos] = x;

12 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 12 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) { Error…} return null; }

13 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 13 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.

14 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 14 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


Herunterladen ppt "Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 11 Dr. W.Narzt u. Dr. A.Stritzinger Institut."

Ähnliche Präsentationen


Google-Anzeigen