unordered_map 哈希函数 / 如何防止 unordered_map 被卡
Posted lskkkno1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unordered_map 哈希函数 / 如何防止 unordered_map 被卡相关的知识,希望对你有一定的参考价值。
reference : CF上neal的博客
总所周知,set
和 map
由于树的结构,的单次操作是 (O(log n)) 的。
有没有更快的 STL 可以代替它们呢?
在 c++11 里面,unordered_set
和 unordered_map
就可以做到单次操作 (O(1))(基于哈希)。
但在 Codeforces 的比赛上面,尽量别用 unoredered_set / unoredered_map
。
一是因为 unordered_map
本身自带大常数,有时候跑的甚至没有 map
快。
第二个原因也是最重要的原因是,很多 CF 上的大神直接根据 STL 的源代码来造出 hack 数据,导致单次复杂度劣化成 (O(n))。
如果你很勇直接用 unordered_map 那么你就等着 fst 吧。
那有没有防止被卡的方法呢?
当然有,那就是自己写哈希函数,然后让哈希函数与时间戳有关就行了。(难道还能预判一个时间来构造 hack 数据不成?
下面给出哈希函数的代码 :
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
return x;
}
size_t operator () (uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); // 时间戳
return splitmix64(x + FIXED_RANDOM);
}
};
然后再定义 unordered_map
的时候就可以像下面这样定义了 :
unordered_map<uint64_t, int, custom_hash> safe_map;
以上是关于unordered_map 哈希函数 / 如何防止 unordered_map 被卡的主要内容,如果未能解决你的问题,请参考以下文章
C++ std::unordered_map 中使用的默认哈希函数是啥?
unordered_map和unordered_set的模拟实现