我有一个搜索余数的紧密循环。列表primeFactors。它的第n个元素包含n的素数分解的排序列表。我正在使用c检查dcheckIfPrimes是否为互质

boolean checkIfPrimes(int c, int d, List<List<Integer>> primeFactors) {
    List<Integer>  common = new ArrayList<>(primeFactors.get(d)); //slow
    common.retainAll(primeFactors.get(c));
    return (common.isEmpty());
}
primeFactors.get(d).retainAll(primeFactors.get(c))看起来很有前途,但是它将改变我的可重用primeFactors对象。

创建一个新对象相对较慢。有没有办法加快这一步?我可以以某种方式利用列表已排序的事实吗?我应该改用数组吗?

最佳答案

设置操作应比数组操作快。
只是为了踢球,请考虑尝试一下,并将性能与流性能进行比较:

final Set<Integer> commonSet;
final Set<Integer> cSet = new HashSet<Integer>();
final Set<Integer> dSet = new HashSet<Integer>();

cSet.addAll(primeFactors.get(c));
dSet.addAll(primeFactors.get(d));

commonSet = dSet.retainAll(cSet);

return (commonSet.isEmpty());

还,
考虑使用List<Set<Integer>> primeFactors而不是List<List<Integer>> primeFactors,因为我怀疑您没有
确实有一个主要因素列表,但实际上有一组主要因素。

10-06 03:42