我试图找出一个快速数据类型来存储整数对,其中API只是add, remove and isMember
。考虑isMember
必须快,显而易见的想法是使用哈希映射。散列函数主要用于无界字符串,因此,我的问题是:考虑我想要散列的内容只是一对整数,什么是具有良好碰撞属性的快速散列函数?
答案 0 :(得分:1)
对于一对EndPoint
,您可以使用Szudzik's Function。它“优雅地”将两个自然数配对为一个唯一的数。
由于您提到了int
,因此它也可以是负数。在这种情况下,请对正,负,负,负负对使用不同的哈希图。
答案 1 :(得分:0)
您可以获得的最佳效果是使用long long
的哈希函数(例如,内置C++
)并使用(p.first * (INT_MAX + 1) + p.second)
。这在c++11
中可以很好地工作,并且hash_map
的大多数常见实现都有long long
的哈希函数,如果这不可用,您可以使用(((long long)p.first * prime1) + (long long)p.second) % prime2
其中prime1
1}}和prime2
是适合整数的素数。