Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成多对一映射的算法/哈希函数_Java_Algorithm_Hash_Batching - Fatal编程技术网

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
。在执行此操作时,我希望确保至少有max
n
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
,我需要能够找出它映射到了什么。