Lecture 17 Flashcards
(9 cards)
Vorraussetzungen für Hashing
Universum U von Schlüsseln mit |U| = N (sehr groß)
Teilmenge von U: V von tatsächlich genutzen schlüsseln mit |V| = n
–> n «_space;N
Idee für Hastabellen
Array T mit Platz für m Elemente (m «_space;N)
–> Hashtabelle
und erstellen einer Hash-funktion h
Anforderungen an die Hashfunktion
- Schneller Zugriff
- wenig speicherverbrauch (surjektiv)
- Gute Streuung bzw. Verteilung derr Elemente über die ganze Tabelle
- find, insert und remove in O(1)
Was sind Kollisionen und wie oft kommen Kollisionen vor?
Was ist dafür die Lösung?
- Schlüssel mit gleicher Adresse.
- Mit Geburtstagsparadoxon: 23 keys -> Hashtabelle mit Größe 356 = > 50%
- Chaining (Felder von Listen)
Wie kontruiert man gut Hashfunktionen
eine zufällige Hashfunktion hat bei remove und Find Laufzeit O(1+ n/m), aber daraus eine auzuwählern verbraucht zu viel speicher
man beschränkt sich auf bestimmte Familien (c- universell) -> c bei uns immer nur 1, also nur universell
Was ist die Wahrscheinlichkeit für dublikate im universellen hashing
Was ist dann die Laufezeit für insert und remove
PR[h(x) = h(y)] <= 1/m
–> O(1+c * n/m)
(c bei uns bekanntlich 1, also O(1+ n/m)
Beispiel für eine universelle Hashfunktion
h(x) = ax mod m
ax ist Skalarprodukt, weil a und x aufgeteilt wird wie ein Tupel
perfektes Hashing
O(1) find
O(n) Speicher mit dem Build (zumindest der Erwartungswert ist O(n)