unordered_map 哈希函數 / 如何防止 unordered_map 被卡


reference : CF上neal的博客

總所周知,setmap 由於樹的結構,的單次操作是 \(O(\log n)\) 的。

有沒有更快的 STL 可以代替它們呢?

在 c++11 里面,unordered_setunordered_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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM