Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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_Dictionary_Parallel Processing - Fatal编程技术网

Java 在地图中并行搜索多个关键点

Java 在地图中并行搜索多个关键点,java,dictionary,parallel-processing,Java,Dictionary,Parallel Processing,给定一个地图最多一百万个项目。我知道如何查询地图上的5K密钥,但我不确定它们是否在地图中 目前,我正在使用树形图,逐个搜索每个项目。这似乎是次优的。是否有一种已经实现的方法来查询地图中的X键 搜索的结果应该是在地图中找到的项目的子集,以便进一步查询-排序无关 我希望使用流,但显然,这只是用于收集 注意:根据我在地图上看到的,数字是印象,可能不是上限…没有比查询地图上的每个元素更好的方法了: List<V> vs = keysToSearch.stream()

给定一个
地图
最多一百万个项目。我知道如何查询地图上的5K密钥,但我不确定它们是否在地图中

目前,我正在使用树形图,逐个搜索每个项目。这似乎是次优的。是否有一种已经实现的方法来查询地图中的X键

搜索的结果应该是在地图中找到的项目的子集,以便进一步查询-排序无关

我希望使用
,但显然,这只是用于收集


注意:根据我在地图上看到的,数字是印象,可能不是上限…

没有比查询地图上的每个元素更好的方法了:

List<V> vs = keysToSearch.stream()
                         .map(k -> map.get(k))
                         .filter(Objects::nonNull)
                         .collect(Collectors.toList())
List vs=keystearch.stream()
.map(k->map.get(k))
.filter(对象::非空)
.collect(收集器.toList())

如果您的数据结构在并发环境中工作,您也可以尝试使用并行流。

没有比查询每个元素的映射更好的方法了:

List<V> vs = keysToSearch.stream()
                         .map(k -> map.get(k))
                         .filter(Objects::nonNull)
                         .collect(Collectors.toList())
List vs=keystearch.stream()
.map(k->map.get(k))
.filter(对象::非空)
.collect(收集器.toList())

如果您的数据结构在并发环境中工作,您也可以尝试使用并行流。

假设内存对您来说不是问题。这里有一种方法

使用
retainAll

Set<String> mapKeys = new HashSet<String>(myMap.keySet());

mapKeys.retainAll(my5kKeys);  //<--- all keys that match the my5kKeys...
Set-mapKeys=newhashset(myMap.keySet());

mapKeys.Retainal(my5kKeys)// 假设你的记忆力不是问题。这里有一种方法

使用
retainAll

Set<String> mapKeys = new HashSet<String>(myMap.keySet());

mapKeys.retainAll(my5kKeys);  //<--- all keys that match the my5kKeys...
Set-mapKeys=newhashset(myMap.keySet());

mapKeys.Retainal(my5kKeys)// 如果您的地图中有M个项目,并且您正在搜索K个键,那么您的最佳案例效率是O(min(M,K))。如果M非常大,那么最好检查每个K(可能是并行的,但必须逐个检查)


如果事实证明M比K小得多,那么只需检查所有M值,看看它们是否存在于K中,就可以做得更好。在任何情况下,您都希望检查较小集合的值与较大集合的值。

如果您的地图中有M个项目,并且正在搜索K个关键点,那么您的最佳案例效率是O(min(M,K))。如果M非常大,最好检查每个K(可能是并行的,但必须逐个检查)


如果事实证明M比K小得多,那么只需检查所有M值,看看它们是否存在于K中,就可以做得更好。在任何情况下,都需要检查较小集合的值与较大集合的值。

没有更好的方法来创建循环并单独搜索所有键。 像
retainAll
这样的方法只是其他人编写的循环的包装器

然而,重要的是使用
HashMap
而不是
TreeMap
。Hashmaps
包含的
是O(1),而
TreeMap
取O(log(n))


如果您需要用于其他内容的已排序集合,可以将数据放在
树映射和
哈希映射中,没有比创建循环和单独搜索所有键更好的方法了。
像
retainAll
这样的方法只是其他人编写的循环的包装器

然而,重要的是使用
HashMap
而不是
TreeMap
。Hashmaps
包含的
是O(1),而
TreeMap
取O(log(n))


如果您需要用于其他目的的已排序集合,您可以将数据放在
树映射和
哈希映射中

是否有不执行
并行流
的原因?(嗯,还有并行流)…还是没有给每个人带来真正的好处,我只是把它作为一种可能性添加了进去。你为什么不做并行流呢?(嗯,还有并行流)…仍然不是真正的优势,
foreach
我只是可能添加了它。我担心内存是个问题,因为代码将由1-20个线程执行。这是最快的方法。因此,如果你的映射是1M+和20个线程之间。这意味着你需要为20M字符串留出空间…好吧,你可以进行计算。无论如何。你可以试一试。它可能没有看上去那么糟糕。我会试一试……这种方法有它的优点,但不返回映射,而是返回一个集合。我担心内存是个问题,因为代码将由1到20个线程执行。这是最快的方法。因此,如果你的映射是1M+并且在20个线程之间。这意味着你需要配速为2000万个字符串…好的,你可以做数学运算。无论如何,你可以试试看。它可能没有看起来那么糟糕。我会尝试一下…这种方法有它的优点,但不会返回地图,而是一个集合,而不是像你那样的
O
comments…这个比率会像我说的那样开始,并且可能只会朝着更大的方向增长
O
comments…比率将开始像我所说的那样,并且可能只会朝着更大的MCrap增长,你是对的…我使用TreeMap是因为
log(n)
,但我认为我的推理是反向的(虽然存在:p)。但是,请解释一下,如果TreeMap中的排序是基于
compareTo()
,HashMap没有,那么为什么HashMap会更快,因为您知道如何在树映射中搜索值,而您不知道如何在HashMap中搜索值。因此,从逻辑上讲,O(1)和O(log(n))是插入时间,而TreeMapHashMap的搜索时间必须更快。对于插入,O(1)是插入,O(1)是包含。树映射是O(log(n)是插入,O(log(n))是插入)对于包含。如果您对排序值不感兴趣,
HashMap
的速度更快。我认为我无法在这篇文章中更好地解释HashMap