数据结构/哈希函数将Ints的集合链接到值

时间:2012-11-07 16:06:32

标签: data-structures hash hashmap

鉴于 n 整数id,我希望将所有可能的至k id的集合链接到一个常量值。我正在寻找的是一种将集合(例如{1,5},{1,3,5}和{1,2,3,4,5,6,7})转换为唯一值的方法。

担保:

  • n&lt; 100和k <100。 10(再次:设定尺寸将在[1,k]中)。
  • id的顺序无关紧要:{1,5} == {5,1}。
  • 所有组合都是可能的,但有些可能被排除在外。
  • 所有集合和值都是常量,只进行一次。没有删除或插入,没有值更新。
  • 一旦生成,唯一的操作就是查找。
  • 查找将是频繁且单向的(给定设置,查找值)。
  • 无需对进行排序(或以其他方式组织)。

此外,如果“相邻”集合(删除一个id,添加一个id,交换一个id等)很容易达到,那么这将是很好的(但不是强制性的),以及“至少包含此内容的所有集合”集”。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用素数产品进行枚举。

  • a - &gt; 2
  • b - &gt; 3
  • c - &gt; 5
  • d - &gt; 7
  • 等等

现在哈希(ab):= 6,哈希(abc):= 30

一个好的副作用是,如果&#34; ab&#34;是&#34; abc&#34;的子集,然后是:

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。 对于像你这样设置的固定小(它需要&lt;&lt; ~70位),可以调整zobrist表以完全避免冲突(产生完美的哈希)。

最后(也是最简单的)方法是使用(100位)位图,并将其视为哈希值(可能在模数表大小之后)

完全不相关的方法是在位图的位上构建决策树。 (树的最大深度为k)a related kD tree on bit values

答案 1 :(得分:0)

可能不是最佳解决方案,但您可以执行以下操作:

  1. 使用简单的IntegerComparator
  2. 将集合从最低到最高排序
  3. 将该组的每个项目添加到字符串
  4. 所以如果你有{2,5,9,4}第一步 - &gt; {2,4,5,9};二线&GT;&#34; 2459&#34;

    这样,您将从唯一的集合中获取唯一的字符串。如果您确实需要将它们映射到整数值,则可以在此之后对字符串进行哈希处理。

    我能想到的另一种方法是将它们存储在java Set中,然后将其映射到HashMap并将set作为键

答案 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位......)