鉴于 n 整数id,我希望将所有可能的至k id的集合链接到一个常量值。我正在寻找的是一种将集合(例如{1,5},{1,3,5}和{1,2,3,4,5,6,7})转换为唯一值的方法。
担保:
此外,如果“相邻”集合(删除一个id,添加一个id,交换一个id等)很容易达到,那么这将是很好的(但不是强制性的),以及“至少包含此内容的所有集合”集”。
有什么想法吗?
答案 0 :(得分:1)
使用素数产品进行枚举。
现在哈希(ab):= 6,哈希(abc):= 30
一个好的副作用是,如果" ab"是" abc"的子集,然后是:
hash(abc) % hash(ab) == 0
和
hash(abc) / hash(ab) == hash(c)
坏消息:你可能会遇到溢出,第100个素数可能会在1000左右,64位不能容纳1000 ** 10。这不会影响作为哈希函数的功能;只有子集thingy才能工作。 the same method applied to anagrams
另一种选择是Zobrist-hashing。它相当于primes方法,但是使用一组固定的(随机)数字代替素数,而不是乘以你使用XOR。 对于像你这样设置的固定小(它需要<< ~70位),可以调整zobrist表以完全避免冲突(产生完美的哈希)。
最后(也是最简单的)方法是使用(100位)位图,并将其视为哈希值(可能在模数表大小之后)
完全不相关的方法是在位图的位上构建决策树。 (树的最大深度为k)a related kD tree on bit values
答案 1 :(得分:0)
可能不是最佳解决方案,但您可以执行以下操作:
答案 2 :(得分:0)
从每个集{1,6,87,89}计算'diff'= {1,5,81,2,0,0,...} {1,2,3,4} = {1,1,1,1,0,0,0,0 ...};
然后用可变长度编码对每个数字进行二进制编码并连接这些位。
很难比较这些集合(除了前几个相等的位),但由于集合中不能有很多大的区间,所有可能的值都可能适合64位。 (至少松弛16位......)