繁体   English   中英

Java Collections - 查找两个集合之间是否存在公共元素的最快方法

[英]Java Collections - Quickest way to find if there is a Common element between two Sets

我有两组来自 Guava HashMultimap.values()

我需要找出这两个非空集是否具有最佳时间复杂度的交集

我不需要知道共同元素,只要至少有一个共同元素。

我正在考虑使用Sets.intersection() ,但它具有时间复杂度O(m+n) 我们能否在不创建整个交集的情况下找出是否存在共同元素?

类似(伪代码):

set.intersection(set2).any()

数据集非常大,这个操作发生在一个循环中,因此性能是最重要的。

使用正常的JDK,这只是

!Collections.disjoint(set1, set2)

如果找到一个共同的元素,这会立即失败。

(虽然 - 为了它的价值 - Sets.intersection比你意识到的更Sets.intersection 。它以恒定时间返回一个视图,并且它的isEmpty()方法也会在找到第一个共同元素后立即保释,所以它会是同样有效率。)

您可以使用Collection#retainAll()

仅保留此集合中包含在指定集合中的元素(可选操作)。 换句话说,从此集合中删除未包含在指定集合中的所有元素。

可以使用 Stream API 以最佳情况时间复杂度Θ(1)来完成。

我们可以在第一个集合中的元素上创建一个stream ,并使用anyMatch()将每个元素与第二个集合进行检查。

boolean hasIntersection = set1.stream().anyMatch(set2::contains);

流是惰性的,并且anyMatch() - 是一个短路终端操作,这意味着在作为参数传递的谓词的第一个元素将被评估为true之后,stream 将终止产生结果值,并且所有剩余的元素将被处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM