Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW."—  Präsentation transkript:

1

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


Herunterladen ppt "Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW."

Ähnliche Präsentationen


Google-Anzeigen