Java 生成多对一映射的算法/哈希函数
我正在寻找可以用来从整数流中生成批处理的哈希函数。具体地说,我想将整数Java 生成多对一映射的算法/哈希函数,java,algorithm,hash,batching,Java,Algorithm,Hash,Batching,我正在寻找可以用来从整数流中生成批处理的哈希函数。具体地说,我想将整数xi从一个集合或流(比如X)映射到另一组整数或字符串(比如Y),这样许多xi被映射到一个yj。在执行此操作时,我希望确保至少有maxnxi映射到单个yj。与散列一样,我需要能够可靠地找到给定x的y 我想确保大多数yj映射到它们的n数量接近xi(以避免从X到Y的非常稀疏的映射) 我能想到的一个函数是商: int BATCH_SIZE = 3; public int map(int x) { return x / BATCH_
xi
从一个集合或流(比如X
)映射到另一组整数或字符串(比如Y
),这样许多xi
被映射到一个yj
。在执行此操作时,我希望确保至少有maxn
xi
映射到单个yj
。与散列一样,我需要能够可靠地找到给定x
的y
我想确保大多数yj
映射到它们的n
数量接近xi
(以避免从X
到Y
的非常稀疏的映射)
我能想到的一个函数是商:
int BATCH_SIZE = 3;
public int map(int x) {
return x / BATCH_SIZE;
}
对于序列整数流,它可以相当好地工作。e、 g.流1..9将映射到
1 -> 0
2 -> 0
3 -> 1
4 -> 1
5 -> 1
6 -> 2
7 -> 2
8 -> 2
9 -> 3
等等。然而,对于非连续的大整数和小批量(我的用例),这可以生成超级稀疏映射(每个批在大多数情况下只有1个元素)
是否有任何标准的方法来生成这样的映射(批处理)在这些假设下,无法让它工作 您需要知道流中有多少项及其分布,或者需要放松将项精确映射到批处理的能力 假设您拥有流中的项目a和b。 你打算把它们放在同一批里吗?除非您知道是否要获得更多的项目来填充2个或更多批次(如果您决定将它们分为不同批次),否则无法回答此问题 如果您知道将有多少(甚至大约),您可以获取他们的分发并基于此构建批处理。假设您有字符串散列(32位上的均匀分布)。如果您知道您将获得100万个项目,并且希望批次为100个,则可以生成2^32/(1.000.000/100)的间隔,并将其用作批次id(
yj
)。这并不能保证您得到的批次大小准确,但它们应该大约为批次大小。如果分布不均匀,事情就比较困难,但仍然可以做到
如果您放松了将项目映射到批次的能力,那么只需在每个批次从流中出来时对其进行分组即可。如果您有足够的空间,您可以为steam项目保留一个要批处理的映射。在这些假设下,无法让它工作 您需要知道流中有多少项及其分布,或者需要放松将项精确映射到批处理的能力 假设您拥有流中的项目a和b。 你打算把它们放在同一批里吗?除非您知道是否要获得更多的项目来填充2个或更多批次(如果您决定将它们分为不同批次),否则无法回答此问题 如果您知道将有多少(甚至大约),您可以获取他们的分发并基于此构建批处理。假设您有字符串散列(32位上的均匀分布)。如果您知道您将获得100万个项目,并且希望批次为100个,则可以生成2^32/(1.000.000/100)的间隔,并将其用作批次id(
yj
)。这并不能保证您得到的批次大小准确,但它们应该大约为批次大小。如果分布不均匀,事情就比较困难,但仍然可以做到
如果您放松了将项目映射到批次的能力,那么只需在每个批次从流中出来时对其进行分组即可。如果您有足够的空间,您可以为steam项保留一个批处理映射。使用
模运算作为散列函数如何?模生成的映射创建无限的批处理大小,但分区数量有限。我想要相反的结果。有界的批大小,对批数没有限制对于流来说效果不是很好,但如果将所有内容读入一个数组中,则可以对其进行排序,并生成n个索引的批。这也不起作用,因为在以后,如果给定一个x
,我需要能够找出它映射到了什么。使用模
操作作为散列函数如何?模生成的映射可以创建无限的批大小,但分区数量有限。我想要相反的结果。有界的批大小,对批数没有限制对于流来说效果不是很好,但是如果你将所有内容读入一个数组中,你可以对它进行排序,并生成n个索引的批。这也不起作用,因为在稍后,给定一个x
,我需要能够找出它映射到了什么。