我有一个搜索余数的紧密循环。列表primeFactors
。它的第n个元素包含n的素数分解的排序列表。我正在使用c
检查d
和checkIfPrimes
是否为互质
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
,因为我怀疑您没有确实有一个主要因素列表,但实际上有一组主要因素。