C++ C++;散列限制
如中所述C++ C++;散列限制,c++,hash,probability,C++,Hash,Probability,如中所述 a的h(a)=h(b)概率=b应接近 1.0/std::numeric\u limits::max() 我想创建一个成对的哈希表(a,b),其中(a,b)==(b,a)(无序对),因此我的哈希函数是: struct hash_pair { template<class T> std::size_t operator()(std::pair<T, T> const& p) const { std::hash<T> h;
a的h(a)=h(b)
概率=b
应接近
1.0/std::numeric\u limits::max()
我想创建一个成对的哈希表(a,b)
,其中(a,b)==(b,a)
(无序对),因此我的哈希函数是:
struct hash_pair {
template<class T>
std::size_t operator()(std::pair<T, T> const& p) const
{
std::hash<T> h;
return std::hash<std::size_t>(h(p.first) + h(p.second));
}
};
因此,我的问题被简化为计算p(无公共)*p(n1+n2==n3+n4)
P(无公共)
是特定于用例的(在我的例子中,这种可能性可能很高),但是,P2
呢?有人帮忙吗
注意:我的问题不是这里其他类似问题的重复,因为我问的是我提出的散列函数的统计特性,而不是如何实现它。它没有填满该特性,因为最终的概率计算与散列概率无关。它必须独立计算,在我的理解中,你不能对它应用任何代数性质 四个不同的数字给出相同的散列的概率(我也是这么做的)是(
n
是每个数字的域):
它给出了大约3.61e-20
,这是非常完美的(比散列单个数字最差的1.5倍,但概率仍然可以忽略不计)。这必须乘以有两对完全不同的数字的概率
注意我的第一句话错了。由于模运算溢出,如果散列函数本身是相关的,则散列的总和是均匀分布的。:if
h(a)
的可能重复项沿std::size\t均匀分布,h(b)
也沿std::size\t
均匀分布,然后h(a)+h(b)
由于翻转,也沿std::size\u t均匀分布。“没有滚动,你是对的。”MooingDuck有趣的东西。谢谢
P1 = P(n1 + n2 == n1 + n3) = P(n2 == n3) = 0 // Because n2 != n3
P2 = P(n1 + n2 == n3 + n4) = ? // n1 != n3 and n2 != n4
(2 * n^2 + 4 * n + 3) / (3 * (n + 1) ^ 3)