Gegeben:
Universum
Teilmenge
Ziel: Finde
$\forall ~ 0 \leq i < m: ~ \Big| { x \in S | h(x) = i } \Big| \leq \lfloor \tfrac {n} {m} \rfloor$
Bspw:
Gute Funktion h fpr
$h(x)=x mod5$
Gleiche Hachfunktion für:
Anwendungsbeispiele:
-
Telefonbuch:
Mit Name und Vorname die zugehörige Telefonnummer rausfinden
$U \widehat{=}$ Menge aller Zahlen die irgendeine Name und Vorname Kombination entsprechen
$S \subseteq U~\widehat{=}$ Name und Vorname in Stuttgart$|n|= 500000$
Wähle$m=500000$
Könnten wir eine Hashfunktion$h:U\rightarrow {0,...,m-1}$ abbildet mit:$\forall 0 \leq i < m: ~~|{x\in S | h(x) = i}|\leq \tfrac{n}{m}=1$
Das ist toll, wir können ein Array anlegen mit 500000 Einträgen. Die Telnr. einer "Name und Vorname" speichern wir an Position h(Name und Vorname), des Arrays. -
Stowasser (Latein-Deutsch Wörterbuch)
$U...$ Menge aller Wörter
$S...$ Menge aller Lateinwörter
... -
Beim randomisierten CP-Alg:
$U...$ Menge aller Paare$(i,j)$ ,$i \in \mathbb{Z}, j \in \mathbb{Z}$
$S...$ Menge der Paare$(i,j)$ , für die in enspr. Gitterzelle mind. 1 Punkt liegt. -
OpenStreetMapDaten
basiert auf Knoten & Kanten Anzahl der Knoten ungefähr 4-5Mrd.
$U...\mathbb{N}$
$S...$ Menge der Knoten IDs im aktuellen Kartenausschnitt.
Bei guter Hashfunktion$h$ könnte man in$\mathcal{O}(1)$ Information mit$S$ assoziieren oder auslesen.
Betrachten wir ein Wörterbuch als abstrakte Datenstruktur.
Diese sollte folgende Operationen unterstützen:
-
$S$ = MAKESET() ... (ein Wörterbuch erzeugen) - inSet(
$x,S$ ) ... fügt item$x$ in$S$ ein
item
$x$ : besteht aus ($K$ ,inf)
$K$ = Schlüssel; inf= Information
- delete(
$x,S$ ) ... löscht item$x$ aus Wörterbuch - lookup(
$K,S$ ) ... gibt item$x$ = ($K$ ,inf) aus, falls vorhanden
Naive Implementierungen
- Array/Feld für die Items, Zähler für Anzahl Items in
$S$
... | |||
---|---|---|---|
... |
- insert(
$x,S$ ) ... Überprüfe ob Schlüssel von$x$ schon enthalten, falls ja überschreiben des entschprechenden items, falls nein, Item hinten anhängen & Zähler eins erhöhen - delete(
$x,S$ ) ... item finden, austausch mit letztem Item, Zähler eins runter - lookup(
$k,S$ ) .. alle Items durchgehen, Item mit passendem Schlüssel zurüchgeben - MAKESET() ...
Vorteile: Einfach, platzsparend
- Verkettete Liste (einfach oder doppelt)
... ähnlich, aber braucht nicht unbedingt zusätzlichen Speicher - Direkte Adressierung
Annahme: Schlüsseluniversum endlich,$[0,...,n-1]$
Wir spendieren ein Array der Größe$K$ .
An Position$i$ des Arrays steht das Item mit Schlüssel$i$ (falls vorhanden) oder Sonderwert "NIL" falls keines vorhanden.
Insert/Delete/Lookup haben alle Zeitverbrauch$\mathcal{O}(1)$ .
Problem: Platzverbrauch ~Größe des Schlüsseluniversums
zB bei verketteter Liste war Platzverbrauch ~Anzahl zu verwaltender Elemente
Ziel: Datenstruktur für Wörterbuch, welches
-
$\mathcal{O}(1)$ Zugriffszeit für insert/delete/lookup -
$\mathcal{O}(n)$ Platzverbrauch
garantiert.
Achtung: er mixt Schlüssel und Item
Idealierweise hätten wir gerne für ein gegebenes
- lege Array mit n Einträgen für die Items an
- Item mit Schlüssel
$x$ wird an Position$h(x)$ gespeichert ( an keiner Stelle wird mehr als 1 Item gespeichert) - lookup(
$x,S$ ): Schaue an Position$h(x)$ nach:
Vorteile:
- Zugriffszeit
$\mathcal{O}(1)$ - Größe
$\mathcal{O}(|S|)$
-
$U$ ... Schlüsseluniversum -
$T[0,...t-1]$ ... Feld auch hashfeld genannt -
$S \subseteq U$ ... Teilmenge von Schlüsseluniversum, welche gehasht werden soll
Gesucht:
Idealierweise
Falls
Frage: Gibt es eine Superhashfunktion
Bsp:
$h(x)=xmod5$
TABELLE
Für
Für
Satz: Seien
Dann gibt es für alle n mit
ein
Schreibe auch
mit
Eventuell Prüfungsrelevant
Beweis:
Nach Schubfachprinzip existiert ein i
${x \in U| h(1)= i}$