Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

G.Heyer Algorithmen und Datenstrukturen 1 13. Kapitel: Hashfunktionen 1) Divisionsrest-Verfahren ( kurz: Divisionsverfahren) h(K i ) = K i mod q, (q ~

Ähnliche Präsentationen


Präsentation zum Thema: "G.Heyer Algorithmen und Datenstrukturen 1 13. Kapitel: Hashfunktionen 1) Divisionsrest-Verfahren ( kurz: Divisionsverfahren) h(K i ) = K i mod q, (q ~"—  Präsentation transkript:

1 G.Heyer Algorithmen und Datenstrukturen Kapitel: Hashfunktionen 1) Divisionsrest-Verfahren ( kurz: Divisionsverfahren) h(K i ) = K i mod q, (q ~ m) Der entstehende Rest ergibt die relative Adresse in HT. Beispiel: Die Funktion nat wandle Namen in natürliche Zahlen um: nat(Name) = ord (1. Buchstabe von Name ) - ord (A) h (Name) = nat (Name) mod m

2 G.Heyer Algorithmen und Datenstrukturen 2 Hash-Tabelle: m = 10 SchlüsselDaten BOHRD1 CURIED2 DIRACD3 EINSTEIND4 PLANCKD5 HEISENBERGD7 SCHRÖDINGERD8

3 G.Heyer Algorithmen und Datenstrukturen 3 Divisionsrest- Verfahren: Forderungen an Divisor q 1) m > n Belegungsfaktor von HT: Verhältnis von aktuell belegten Speicherplätzen (n) zur gesamten Anzahl der Speicherplätze (m) = n a / m Für 0.85 erzeugen alle Hash-Funktionen viele Kollisionen und damit einen hohen Zusatzaufwand. 2) q gerade Zahl sonst bleibt h (K i ) bei geradem K i gerade und bei ungeradem K i ungerade. 3) q b k b sei die Basis der Schlüsseldarstellung. Wenn q = b k ist, dann liefert h (K i ) die letzten k Stellen von K i. h(K i ) = K i mod q

4 G.Heyer Algorithmen und Datenstrukturen 4 4) q a * b k c a und c seien kleine ganze Zahlen. Der Divisor q soll nicht benachbart zu einer Potenz des Zahlensystems (in dem die Division durchgeführt wird) liegen, da sonst (x + a * b k c ) mod q ~ x mod q ist, d. h., bei gleichen Endziffern wiederholt sich fast die gleiche Menge von Adressen in verschiedenen Zahlenbereichen. 5) q = Primzahl ( größte Primzahl <= m) Die Hash-Funktion muss etwaige Regelmäßigkeiten in der Schlüsselverteilung eliminieren, damit nicht ständig die gleichen Plätze der HT getroffen werden. Bei äquidistantem Abstand der Schlüssel K i + j * K, j = 0, 1, 2,,... maximiert eine Primzahl die Distanz, nach der eine Kollision auftritt.

5 G.Heyer Algorithmen und Datenstrukturen 5 Eine Kollision ergibt sich, wenn K i mod q = (K i + j * K) mod q oder j * K = k * q,k = 1, 2, 3,... Eine Primzahl kann keine gemeinsamen Faktoren mit K besitzen, die den Kollisionsabstand verkürzen würden. ==> wichtigste Forderung an q ! 2) Faltung Schlüssel wird in Teile zerlegt, die bis auf das letzte die Länge einer Adresse für HT besitzen. Schlüsselteile werden dann übereinander gefaltet und addiert.

6 G.Heyer Algorithmen und Datenstrukturen 6 3) Mid-Square-Methode Schlüssel K i wird quadriert, t aufeinanderfolgende Stellen werden aus der Mitte des Ergebnisses für die Adressierung ausgewählt. Es muss also b t = m gelten. Mittlere Stellen lassen beste Gleichverteilung der Werte erwarten. Beispiel für b = 2, t = 4, m = 16 :K i = K i 2 = h (K i ) = 1000 t

7 G.Heyer Algorithmen und Datenstrukturen 7 4) Weitere Verfahren Zufallsmethode: K i dient als Saat für Zufallszahlengenerator Ziffernanalyse: setzt Kenntnis der Schlüsselmenge K voraus. Die t Stellen mit der besten Gleichverteilung der Ziffern oder Zeichen in K werden von K i zur Adressierung ausgewählt. Bewertung Das Verhalten einer Hash-Funktion hängt von der gewählten Schlüsselmenge ab. Deshalb lassen sie sich auch nur unzureichend theoretisch oder mit Hilfe von analytischen Modellen untersuchen.

8 G.Heyer Algorithmen und Datenstrukturen 8 Über die Güte der verschiedenen Hash-Funktionen liegen jedoch eine Reihe von empirischen Untersuchungen vor. Das Divisionsrest-Verfahren ist im Mittel am leistungsfähigsten; für bestimmte Schlüsselmengen können jedoch andere Techniken besser abschneiden. Keine Hash-Funktion ist immer besser als alle anderen. Wenn die Schlüsselverteilung nicht bekannt ist, dann ist das Divisionsrest-Verfahren die bevorzugte Hash-Technik. ==> Wenn eine Hash-Funktion gegeben ist, lässt sich immer eine Schlüsselmenge finden, bei der sie besonders viele Kollisionen erzeugt.

9 G.Heyer Algorithmen und Datenstrukturen 9 Behandlung von Kollisionen Zwei Ansätze, wenn h (K q ) = h (K p ): Es wird für K p eine freier Platz in HT gesucht ; alle Überläufer werden im Primärbereich untergebracht (open adressing). K p wird in einem separaten Überlaufbereich zusammen mit allen anderen Überläufern gespeichert (separate overflow) Die Methode der Kollisions-Auflösung entscheidet darüber, welche Folge und wie viele relative Adressen zur Ermittlung eines freien Platzes aufgesucht werden.

10 G.Heyer Algorithmen und Datenstrukturen 10 Adressfolge bei Speicherung und Suche für Schlüssel K p sei h 0 (K p ), h 1 (K p ), h 2 (K p ),... Bei einer Folge der Länge n treten also n-1 Kollisionen auf Primärkollision:h (K p ) = h (K q ) Sekundärkollision: h i (K p ) = h j (K q ), i j Offene Hash-Verfahren Speicherung der Synonyme (Überläufer) im Primärbereich Das eingesetzte Hash-Verfahren muss in der Lage sein, eine Sondierungsfolge, d. h. eine Permutation aller Hash-Adressen, zu berechnen.

11 G.Heyer Algorithmen und Datenstrukturen 11 1) Lineares Sondieren (linear probing) Von der Hausadresse aus wird sequentiell (modulo) gesucht. Diese Vorgehensweise kann mit jedem Hash-Verfahren kombiniert werden. Offensichtlich werden dabei alle Plätze in HT erreicht: h 0 (K p ) = h (K p ) h i (K p ) = ( h 0 ( K p ) - i ) mod m, i = 1, 2,...

12 G.Heyer Algorithmen und Datenstrukturen 12 Beispiel: Einfüge-Reihenfolge: BECKETT, HESSE, BÖLL, HAUPTMANN, STEINBECK, SACHS, HAMSUN, SARTRE HT: m = Schlüssel Lösche

13 G.Heyer Algorithmen und Datenstrukturen 13 Irgendeine Primär- oder Sekundärkollision kann eine Häufung von Primär- oder Sekundärkollision auslösen. Löschen: implizit oft Verschiebungen. Entstehende Lücken in Suchsequenzen sind auszufüllen, da das Antreffen eines freien Platzes die Suche beendet.

14 G.Heyer Algorithmen und Datenstrukturen 14 Suche in einer Hash-Tabelle bei linearem Sondieren void Linsuche (Key X, Hashtab HT, Cardinal m, Cardinal j) {/* Suche in HT bei linearem Sondieren*/ /*Bei erfolgreicher Suche zeigt j auf Position von X in HT */ Cardinal i; i = H [X]; /* H sei global definierte Hash-Funktion */ j = i ; /* unbelegter Eintrag in HT sei durch */ /* - - Zeichen charakterisiert */ while ( (HT [ j ] != X) && (HT[ j ] != - ) ) {j = (j -1 ) % m; if ( i == j) {printf ( X ist nicht in HT \n); return ; } if ( HT [ j ] == - ) printf ( X ist nicht in HT \n); } return; }

15 G.Heyer Algorithmen und Datenstrukturen 15 Verbesserung: Modifikation der Überlauffolge (z.B. durch quadratisches Sondieren) h 0 ( K p ) = h ( K p ) h i+1 ( K p ) = ( h i ( K p ) + f ( i ) ) mod moder h i+1 (K p ) = (h i ( K p ) + f ( i, h ( K p ) ) ) mod m, i= 1, 2,... 2) Sondieren mit Zufallszahlen Mit Hilfe eines deterministischen Pseudo-Zufallszahlen- Generators wird die Folge der Adressen [1... m-1] mod m genau einmal erzeugt. Abhängig von k wird eine zufällige Hashadresse s(j, k) gewählt. h 0 (K p )= h (K p ) h i (K p ) = ( h 0 (K p ) + z i ) mod m,i = 1, 2,...

16 G.Heyer Algorithmen und Datenstrukturen 16 3) Double-Hashing Einsatz einer zweiten Funktion für die Sondierungsfolge h 0 (K p )= h (K p ) h i (K p ) = ( h 0 (K p ) + i * h (K p ) ) mod m, i = 1, 2,... Dabei ist h (K) so zu wählen, dass für alle Schlüssel K die resultierende Sondierungsfolge eine Permutation aller Hash-Adressen bildet. 4) Kettung von Synonymen Explizite Kettung aller Sätze einer Kollisionsklasse verringert nicht die Anzahl der Kollisionsklassen; verkürzt jedoch den Suchpfad beim Aufsuchen eines Synonyms. Bestimmung eines freien Überlaufplatzes (Kollisionsbehandlung) mit beliebiger Methode

17 G.Heyer Algorithmen und Datenstrukturen 17 Hash-Verfahren mit separatem Überlaufbereich Dynamische Speicherplatz-Belegung für Synonyme Alle Sätze, die nicht auf ihrer Hausadresse unterkommen, werden in einem separaten Bereich gespeichert. Die Bestimmung der Überlaufadresse kann entweder durch Double Hashing oder durch Kettung der Synonyme erfolgen. Die Synonym-Kettung erlaubt auch die Möglichkeit, den Speicherplatz für Überläufer dynamisch zu belegen. Suchen, Einfügen und Löschen sind auf Kollisionsklasse beschränkt. Unterscheidung nach Primär- und Sekundärbereich

18 G.Heyer Algorithmen und Datenstrukturen 18 Beispiel: HAYDN * HT: m = BEETHOVEN CORELLI SCHUBERT MOZART HÄNDEL * BACH BRAHMS * * * * * * * * LISZT * * VIVALDI Schlüssel

19 G.Heyer Algorithmen und Datenstrukturen 19 Analyse des Hashing Kostenmaße = n / m : Belegung von HT mit n Schlüsseln S n = # Suchschritte für das Auffinden eines Schlüssels - entspricht den Kosten für erfolgreiche Suche und Löschen (ohne Reorganisation) U n = # der Suchschritte für die erfolglose Suche - das Auffinden des ersten freien Platzes entspricht den Einfügekosten Grenzwerte:best caseworst case S n = 1S n = n U n = 1U n = n + 1

20 G.Heyer Algorithmen und Datenstrukturen 20 Modell für das lineare Sondieren sobald eine gewisse Größe überschreitet, verschlechtert sich das Zugriffsverhalten sehr stark Je länger eine Liste ist, um so schneller wird sie noch länger werden. Zwei Listen können zusammen wachsen (Platz 3 und 14), so dass durch neue Schlüssel eine Art Verdopplung der Listenlänge eintreten kann.

21 G.Heyer Algorithmen und Datenstrukturen 21 Ergebnisse für das lineare Sondieren nach Knuth S n mit 0 = ---< 1 nmnm U n ( 1 - ) 2 Abschätzung für offene Hash-Verfahren mit optimierter Kollisions-Behandlung (gleichmäßige HT-Verteilung von Kollisionen) S n ~ * ln ( 1 - ) U n ~

22 G.Heyer Algorithmen und Datenstrukturen 22 Anzahl der Suchschritte in HT S n, U n UnUn SnSn UnUn SnSn bei linearem Sondieren bei unabhängiger Kollisions- Auflösung S n, U n

23 G.Heyer Algorithmen und Datenstrukturen 23 Analyse des Hashing (2) Modell für separate Überlaufbereiche Annahme: n Schlüssel verteilen sich gleichförmig über die m möglichen Ketten. Jede Synonym-Kette hat also im Mittel n/m = Schlüssel. Wenn der i-te Schlüssel K i in HT eingefügt wird, sind in jeder Kette ( i -1 ) / m Schlüssel. Die Suche nach K i kostet also 1 + ( i -1 ) / m Schritte, da K i an das jeweilige Ende einer Kette angehängt wird. Erwartungswert für erfolgreiche Suche: S n = 1/n * = i = 1 n i - 1 m n * m 2

24 G.Heyer Algorithmen und Datenstrukturen 24 Bei der erfolglosen Suche muss immer die ganze Kette durchlaufen werden. Die Kostenformel hat somit folgende Struktur: U n = * WS ( zu einer Hausadresse existiert ein Überläufer) + 2 * WS (zu einer Hausadresse existieren zwei Überläufer) + 3 *..... U n - e S n U n

25 G.Heyer Algorithmen und Datenstrukturen 25 Separate Kettung ist auch der unabhängigen Kollisions- Auflösung überlegen. Hashing ist i. a. ein sehr leistungsstarkes Verfahren. Selbst bei starker Überbelegung ( > 1 ) erhält man bei separater Kettung noch günstige Werte.

26 G.Heyer Algorithmen und Datenstrukturen 26 Dynamische Hash-Verfahren Wachstumsprobleme bei statischen Verfahren Statische Allokation von Speicherbereichen: Speicherausnutzung ? Bei Erweiterung des Adressraumes: Rehashing ==> Kosten, Verfügbarkeit, Adressierbarkeit S h h A A ==> alle Sätze erhalten eine neue Adresse

27 G.Heyer Algorithmen und Datenstrukturen 27 Entwurfsziele Eine im Vergleich zu statischen Hashing dynamische Struktur erlaubt Wachstum und Schrumpfung des Hash-Bereichs ( Datei ) keine Überlauftechniken Zugriffsfaktor 2 für direkte Suche Viele konkurrierende Ansätze Extendible Hashing ( Fagin et al., 1978 ) Virtual Hashing und Linear Hashing ( Letwin, 1978, 1980 ) Dynamic Hashing (Larson, 1978 )

28 G.Heyer Algorithmen und Datenstrukturen 28 Zusammenfassung Hash-Funktion berechnet Speicheradresse des Satzes zielt auf bestmögliche Gleichverteilung der Sätze im Hash-Bereich Hashing bietet im Vergleich zu Bäumen eine eingeschränkte Funktionalität direkter Schlüsselzugriff i. a. kein sortiert sequentieller Zugriff ordnungserhaltendes Hashing nur in Sonderfällen anwendbar statisches Verfahren

29 G.Heyer Algorithmen und Datenstrukturen 29 Idealfall: Direkte Adressierung nur in Ausnahmefällen möglich ( dichte Schlüsselmenge) jeder Satz kann mit einem Zugriff referenziert, eingefügt oder gelöscht werden Hash-Verfahren im Hauptspeicher Standard: Divisions-Rest-Verfahren bei offenen Hash-Verfahren ist der Belegungsgrad 0.85 dringend zu empfehlen Kollisionsbehandlung mit separatem Überlaufbereich i. a. effizienter und einfacher zu realisieren

30 G.Heyer Algorithmen und Datenstrukturen 30 Erweiterungen: dynamische Hashing-Verfahren Reorganisationsfreiheit Viele Vorschläge: Erweiterbares Hashing, Lineares Hashing,... ( 2 Seitenzugriffe )


Herunterladen ppt "G.Heyer Algorithmen und Datenstrukturen 1 13. Kapitel: Hashfunktionen 1) Divisionsrest-Verfahren ( kurz: Divisionsverfahren) h(K i ) = K i mod q, (q ~"

Ähnliche Präsentationen


Google-Anzeigen