Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Algorithmen und Datenstrukturen Übungsmodul 11

Ähnliche Präsentationen


Präsentation zum Thema: "Algorithmen und Datenstrukturen Übungsmodul 11"—  Präsentation transkript:

1 Algorithmen und Datenstrukturen Übungsmodul 11
Dr. W.Narzt u. Dr. A.Stritzinger 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 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 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;

5 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)

6 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

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 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 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 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];

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) { if (hTable[pos].key.equals(x.key)) return; iColl++; //collision pos = (pos + i*h2) % tSize; i++; } if (iColl>=tSize) { Error…} hTable[pos] = x;

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) { if (hTable[pos].key.equals(key)) return hTable[pos]; sColl++; //collision pos = (pos + i*h2) % tSize; i++; } if (sColl>=tSize) { Error… } return null;

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 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 "Algorithmen und Datenstrukturen Übungsmodul 11"

Ähnliche Präsentationen


Google-Anzeigen