Haben 2 Teilnehmer am gleichen Tag Geburtstag?
Wahrscheinlichkeit: 59.8%
Es gibt tatsächlich 2 Personen.
Zahl hat fixe Grösse, z.B. 32 oder 64 Bit.
Wieso sind das keine Hash-Funktionen?
Falls jeder Hashwert gleich häufig:
Bits | 0.1% | 1% | 25% | 50% | 75% |
---|---|---|---|---|---|
32 | 2900 | 9300 | 50′000 | 77′000 | 110′000 |
64 | 1.9 ⋅ 108 | 6.1 ⋅ 108 | 3.3 ⋅ 109 | 5.1 ⋅ 109 | 7.2 ⋅ 109 |
Lese: Um bei 32-Bit-Hashes mit 50% Wahrscheinlichkeit herbeizurufen benötigt man etwa 77'000 Einträge.
Einfügen hat gleiche Laufzeit wie Suchen.
Falls k Kollisionen: O(k).
Falls beliebige Anzahl Einfügeoperationen ist C nicht im Voraus bekannt.
Einfach mit C = 2 beginnen und falls C = N verdoppeln.
#include <unordered_map>
unordered_map<string, int> words;
for (string s; cin >> s;)
words[s]++;
for (auto& w : words)
cout << w.first << ": " << w.second;
hp(c1c2c3…cn) = (c1 + pc2 + … + pn − 1cn) mod M
Vorteil vom Polynomial Hash: Einfach updaten.
hp(c1c2c3…cn) = (c1 + pc2 + … + pn − 1cn) mod M = (c1 mod M + (p(c2 + pc3 + … + pn − 2cn)) mod M) mod M = (c1 + p(c2c3…cn)) mod M
hp(c1c2c3…cn) = ((c1 + pc2 + … + pn − 1cn) + (pn − 1cn)) mod M = (hp(c1c2…cn − 1) + pn − 1cn) mod M
Sei hp(c1c2c3…cn) sowie p − 1 und pn bekannt.
Dann ist:
hp(c2c2c3…cncn + 1) = (p − 1(hp(c1c2c3…cn) − c1) + pn) mod M
Definiere den umgekehrten Polynomial Hash:
h′p(c1c2…cn − 1cn) = (pn − 1c1 + pn − 2c2 + … + pcn − 1 + cn) mod M
Dann ist:
h′p(c2c3…cncn + 1) = (h′p(c1c2…cn − 1cn) − pnc1 + cn + 1) mod M
Gegeben String str
und pat
, finde pat
in str
.
const uint64_t p, p_n, m; // bekannt
uint64_t pattern_hash = hash(pat);
uint64_t hash = 0;
queue<char> buffer;
for (char& c : s) {
if (buffer.size() >= p.size()) {
hash = (m - p_n*buffer.front())%m;
buffer.pop();
}
buffer.push(c);
hash = (hash + c)%m;
if (hash == pattern_hash && buffer.size() == p)
// found
}
str
?str
und Indices from1, to1, from2, to2
, ist der Substring von from1
bis to1
oder der von from2
bis to2
kleiner?0
und 1
. Ein String ist antisymmetrisch, wenn alle 0
mit 1
vertauscht wurden und er umgedreht ist. Wie viele antysymmetrische Substrings gibt es in str
?str
und das antisymmetrische str
ausrechnen. Dann von jedem Index aus Binary-Search über die Länge.