chenfy27的刷题记录

导航

模板-整型哈希hval

可以考虑将单个int类型映射成3个uint64,再执行加减操作,从而实现将多个int的集合最终映射成3个uint64,通过比较这3个uint64是否相等来快速判断集合是否相同。

由于加法满足交换律,与顺序无法,因此上述做法天然支持多重集合。对于单重集合,可以考虑再加个set维护当前插入了哪些元素,已经有的元素就不需要再参与哈希了。

struct hval {
	u64 h1, h2, h3;
	u64 f1(u64 x) { return 1ULL * x * x * x * 1237123 + 19260817; }
	u64 f2(u64 x) { return 1ULL * x * x	    * 3217321 + 71806291; }
	u64 f3(u64 x) { return 1ULL * x		    * 1678931 + 74328249; }
	void set(int x) {
		h1 = f1(x & 0x7fffffff) + f1(x >> 31);
		h2 = f2(x & 0x07ffffff) + f2(x >> 27);
		h3 = f3(x & 0x00007fff) + f3(x >> 15);
	}
	hval(u64 a=0, u64 b=0, u64 c=0):h1(a), h2(b), h3(c) {}
	bool operator==(const hval &rhs) const {
		return h1 == rhs.h1 && h2 == rhs.h2 && h3 == rhs.h3;
	}
	friend hval operator+(const hval &a, const hval &b) {
		return hval(a.h1 + b.h1, a.h2 + b.h2, a.h3 + b.h3);
	}
	friend hval operator-(const hval &a, const hval &b) {
		return hval(a.h1 - b.h1, a.h2 - b.h2, a.h3 - c.h3);
	}
};

posted on 2024-10-17 12:37  chenfy27  阅读(11)  评论(0)    收藏  举报