我正在寻找可用于从整数流生成批次的哈希函数。具体来说,我想将整数xi
从集合或流(比如X
)映射到另一组整数或字符串(比如Y
),以便映射许多xi
一个yj
。在执行此操作时,我希望确保最多n
xi
映射到单个yj
。与散列一样,我需要能够可靠地找到给定y
的{{1}}。
我希望确保大多数x
都有yj
个n
个映射到它们的xi
(以避免从X
到{{1}的稀疏映射}})。
我能想到的一个功能是商:
Y
对于顺序整数流,它可以很好地工作。例如流1..9将映射到
int BATCH_SIZE = 3;
public int map(int x) {
return x / BATCH_SIZE;
}
等等。但是,对于非连续的大整数和小批量(我的用例),这可以生成超稀疏映射(每个批次在大多数情况下只有1个元素)。
是否有任何标准方法可以生成这样的映射(批处理)
答案 0 :(得分:0)
在这些假设下,没有办法让它发挥作用。
您需要知道流中有多少项及其分布,或者您需要放松精确映射项目的能力。
我们假设你有来自流的项目a和b。 你打算把它们放在同一批次中吗?除非您知道是否要获得更多物品来填充2批次或更多批次(如果您决定将它们分成不同批次),否则您无法回答这个问题。
如果您知道将有多少(甚至大约),您可以根据它进行分配和构建批次。假设你有字符串哈希(均匀分布超过32位)。如果您知道自己获得的是1M项,并且希望批量为100,则可以生成2 ^ 32 /(1.000.000/100)的间隔,并将其用作批次ID(yj
)。这并不能保证您获得完全批量化的批次,但它们应该大致是batch_size。如果分布不均匀,事情就更难了,但仍然可以做到。
如果您放松了将项目映射到批处理的功能,那么只需将每个batch_size分组,因为它们来自流。如果您有空间,可以将蒸汽项目的地图保留为批。