Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Theodor Fürst Geändert vor über 8 Jahren
2
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW
3
-2- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen 3.4 Hash-Tables Ziel: Hashing ist eine Fortsetzung des Versuchs, Vorteile verschiedener schon behandelter Datenstrukturen zu "mischen" ohne die Nachteiler in Kauf zu nehmen. Hintergrund: Arrays liefern schnelle Zugriffe wenn der Index bekannt ist. Wegen der "Nicht-Erweiterbarkeit" eignen sie sich aber i.a. nicht für dynamische Mengen. Wenn die Keys nicht sortiert sind, dauert find() lange. Sind sie sortiert, gehen insert() und delete() schlecht.
4
-3- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Lösung: Hash Tables Eigenschaften (positiv und negativ) Hash-Tables erlauben sehr! schnelle (fast O(1)) Standard-Operationen (find(), insert(), delete()). Sie sind array-basiert mit (fast) allen Folgen. Sie eignen sich trotzdem für dynamische Mengen. Wenn sie zu "voll werden", kann die Performance katastrophal werden. Zugriffsfolgen nach irgendeiner Reihenfolge (z.B. vom kleinsten zum grössten) sind schwierig (ineffizient) zu realisieren
5
-4- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Das Grundprinzip: Die zu speichernden Daten-Items sind durch einen key identifiziert. Es gibt eine dynamische Folge von Einfüge- und Löschoperationen. Gespeichert wird in einem Array T der Länge N (die maximale Zahl der zu einem bestimmten Zeitpunkt zu speichernden Elemente sollte grob bekannt sein und nicht zu weit oberhalb von N liegen). Jedem key ist ein Index i, 0<=i<=N, zugeordnet, das zum key gehörende Daten-Item wird in T[i] gespeichert.
6
-5- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Probleme: Die Zuordnung von keys und Indizes. Eindeutigkeit der Zuordnung vs. Dynamik Eindeutigkeit der Zuordnung vs. Menge der keys Beispiele: Mitarbeitertabelle mit Personalnummer von 1 bis n Unrealistisch gut organisiert Keine delete(), sonst gibt es Speicherfressende Lücken Array wird bald zu klein
7
-6- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Dictionnary 50.000 deutsche Wörter in einer Hauptspeicher- Datenstruktur Für jedes eine Speicherzelle=>Zugriff über Index Welcher Index? Beispiel: Berechnung eines Index analog zu Dezimalzahlen auf Basis 27 (Grösse des Alphabets) Führt zu unrealistisch grossen Indizes, (wie gross für ein 10- Buchstabenwort?) warum?, welche falsche Annahme
8
-7- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Folge: Wir brauchen eine Funktion zum Abbilden von Keys (z.B. strings) auf Indizes. Anforderungen: Nur Werte in einem relativ kleinen Index-Bereich Eindeutigkeit Warum nur kleiner Indexbereich (kleines Array)? Sehr häufig ist zwar das zugrundeliegende Universum von keys riesig, die maximale Menge der zu einem bestimmten Zeitpunkt zu speichernden aber relativ gering. Aktueller „Füllgrad“ des Arrays: load factor ist das Verhältnis der aktuellen Anzahl von Daten-Items in relation zur Array- Grösse.
9
-8- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Am Beispiel Dictionnary: Abbildung des key-Universums, eines Bereichs von mehr als 7.000.000.000.000 (27 9 ), auf einen Bereich von 0.. 50.000 Kleineres Beispiel: Abbildung eines key-Universums von 0.. 199 auf einen Bereich von 0.. 9. Direkte Folge: Es gibt Kollisionen Mehreren Keys wird der gleiche Index zugeordnet.
10
-9- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Lösungen: Im Array weitersuchen linear (linear probing) quadratisch: der "Such-Schritt" ist das Quadrat der Schrittnummer double hashing: die Länge des nächsten Schritts wird mit einer neuen Hash-Funktion berechnet Chaining
11
-10- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen linear probing (am Applet-Beispiel) Bei Kollision wird mit Schrittweite 1 weitergesucht bis eine freie Zelle gefunden ist. Folge: Menge der Daten-Items darf nicht grösser sein als die Array-Grösse Es bilden sich „Cluster“. Für alle keys, deren Hashwert im Cluster-Bereich liegt, wird am Ende des Clusters eingefügt. Je grösser ein Cluster ist, um so schneller wächst es.
12
-11- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen quadratic probing Bei Kollision wird weitergesucht, wobei die Schrittweite das Quadrat der Schrittnummer ist. Kollision bei Hash-Index x: weiter suchen bei x+1, x+4, x+9, x+16 usw. Folge: Menge der Daten-Items darf nicht grösser sein als die Array- Grösse (wie vorher). Es bilden sich wieder „Cluster“. Auswirkungen nicht ganz so schnell sichtbar da verstreut (alle Kollisionen folgen der gleichen Schrittfolge!). Nicht so schlimm, aber es geht besser!
13
-12- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Double Hashing Bei Kollision wird weitergesucht, wobei die Schrittweite das Ergebnis eines zweiten Hashings ist. Folge: Menge der Daten-Items darf nicht grösser sein als die Array-Grösse (wie vorher). Die Schrittfolge hängt vom key ab! Werden zwei keys auf den gleichen Index abgebildet, so unterscheiden sich trotzdem die Schrittfolgen beim Weitersuchen.
14
-13- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Chaining Jedes Array-Element ist ein first-Pointer einer linearen Liste, Beispiel im Applet. 723333906122
15
-14- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Folgen: Bei Chaining kann der Load-Factor > 1 werden, ohne dass sofort die Performance ganz schlecht wird. Das Finden des Index geht auch in O(1), aber es muss noch im Mittel die halbe Liste durchsucht werden. Sortierte Liste? Suchen geht zwar nicht viel schneller, aber nicht erfolgreiches Suchen geht schneller. Die Einbussen beim insert() sind nicht dramatisch, wenn die Listen kurz sind. Auch wenn bei wachsendem load factor die Performance schlechter wird, so ist die Hash-Table immer noch benutzbar! Die Performance hängt entscheidend von der Güte der Hash- Funktion ab (deren „Verteilungsgrad“).
16
-15- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Hash Funktionen Anforderungen: Schnell zu berechnen Verteilen das key-Universum gleichmässig auf die Indexmenge, d.h. gleichmässige Listenlänge Generell: Den gesamten key nutzen! Einschränken auf die Indexmenge i.d.R. mit modulo- Operation, dabei eine Primzahl als modulo-Basis wählen.
17
-16- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Hash Funktionen für strings: Verwendung des ASCII-Codes A() und der Position i im string Mehrere Möglichkeiten für string c 1 c 2 c 3...c n Analog Dezimalzahlen (siehe vorher) (A(c 1 )*27 + A(c 2 )*27 2 + A(c 3 )*27 3 +...) % arraysize Problem: Integerüberlauf Lösung: Hornerschema evtl. statt 27 eine Primzahl nehmen Einfach mit Characterposition (A(c 1 )*1 + A(c 2 ) * 2 + A(c 3 ) * 3 +...) % arraysize auch mit Hornerschema
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.