我想拥有一个为一组整数分配值的字典。
例如keyis [1 2 3]并且value将具有一定的价值。
key
[1 2 3]
value
关键是,[3 2 1]在我的情况下,如果我采用哈希方法,则哈希必须相等。
[3 2 1]
该集合将有2到10个项目。
项目的总和通常是固定的,因此我们不能根据总和创建哈希码,这是第一个自然的想法。
这不是一项家庭作业,实际上在我的代码中遇到了这个问题。
这个集合基本上IEnumerable<int>在C#中,因此任何数据结构都可以存储它们。
IEnumerable<int>
任何帮助表示赞赏。性能在这里也很重要。
立即想到:我们可以总结一下,items^2并且已经获得了更好的哈希值,但是我仍然想听听一些想法。
items^2
编辑: 嗯, 非常抱歉 ,每个人都建议使用排序,但我没有想到我需要说实际上排序和哈希是我使用的当前解决方案,并且我正在考虑使用更快的替代方法。
基本上,这里的所有方法都是同一模板的实例。将x 1,…,x n映射到f(x 1)op…op f(x n),其中op是对某个集合X的交换交换操作,f是从项到X的映射。已使用此模板好几次都被证明是好的。
在[1,p-1]中选择一个随机的大质数p和一个随机残数b。令f(x)= b x mod p,令op为加法。我们本质上将集合解释为多项式,并使用Schwartz-Zippel引理来界定发生碰撞的概率(=非零多项式以b为根模p的概率)。
令op为XOR,令f为随机选择的表。这是Zobrist哈希,它通过直接的线性代数参数将期望的碰撞次数降至最低。
模幂运算很慢,因此请不要使用它。对于Zobrist散列(具有300万个项目),表f可能不适合L2,尽管它确实设置了一个主内存访问的上限。
相反,我将Zobrist散列作为出发点,并寻找行为像随机函数的廉价函数f。这本质上是非加密伪随机生成器的工作描述–我将尝试通过用x播种快速PRG并生成一个值来计算f。
编辑:鉴于所有集合都具有相同的总和,请不要将f选择为1阶多项式(例如,线性同余生成器的阶跃函数)。