算法/散列函数可生成多对一映射

时间:2017-07-19 06:40:47

标签: java algorithm hash batching

我正在寻找可用于从整数流生成批次的哈希函数。具体来说,我想将整数xi从集合或流(比如X)映射到另一组整数或字符串(比如Y),以便映射许多xi一个yj。在执行此操作时,我希望确保最多n xi映射到单个yj。与散列一样,我需要能够可靠地找到给定y的{​​{1}}。

我希望确保大多数x都有yjn个映射到它们的xi(以避免从X到{{1}的稀疏映射}})。

我能想到的一个功能是商:

Y

对于顺序整数流,它可以很好地工作。例如流1..9将映射到

int BATCH_SIZE = 3;
public int map(int x) {
  return x / BATCH_SIZE;
}

等等。但是,对于非连续的大整数和小批量(我的用例),这可以生成超稀疏映射(每个批次在大多数情况下只有1个元素)。

是否有任何标准方法可以生成这样的映射(批处理)

1 个答案:

答案 0 :(得分:0)

在这些假设下,没有办法让它发挥作用。

您需要知道流中有多少项及其分布,或者您需要放松精确映射项目的能力。

我们假设你有来自流的项目a和b。 你打算把它们放在同一批次中吗?除非您知道是否要获得更多物品来填充2批次或更多批次(如果您决定将它们分成不同批次),否则您无法回答这个问题。

如果您知道将有多少(甚至大约),您可以根据它进行分配和构建批次。假设你有字符串哈希(均匀分布超过32位)。如果您知道自己获得的是1M项,并且希望批量为100,则可以生成2 ^ 32 /(1.000.000/100)的间隔,并将其用作批次ID(yj)。这并不能保证您获得完全批量化的批次,但它们应该大致是batch_size。如果分布不均匀,事情就更难了,但仍然可以做到。

如果您放松了将项目映射到批处理的功能,那么只需将每个batch_size分组,因为它们来自流。如果您有空间,可以将蒸汽项目的地图保留为批。