最近,我尝试解决 Project Euler 的第23道题。为此,我首先创建了一个名为abundants
的所有过剩数的列表。
接下来,我遍历这个列表,并构建另一个列表,其中包含在某个限制以下的所有过剩数之和。现在我注意到了一些奇怪的事情。我使用嵌套循环两次迭代列表。但如果我使用数组来存储总和,那么它只需要几秒钟,如果我将总和添加到 ArrayList 中,则需要几个小时。这是为什么呢?我认为昂贵的操作应该是两个嵌套循环,但似乎ArrayList#add才是代价高昂的操作。有没有任何提示说明这种情况?
这里是数组的代码:
for (int i = 0; i < abundants.size(); i++) {
for (int j = 0; j < abundants.size(); j++) {
int tot = abundants.get(i) + abundants.get(j);
if (tot <= limit)
isSum[tot] = true;
}
}
}
以下是ArrayList的代码:
ArrayList<Integer> sums = new ArrayList<Integer>();
for (int i = 0; i < abundants.size(); i++) {
for (int j = 0; j < abundants.size(); j++) {
int s = abundants.get(i) + abundants.get(j);
if (!sums.contains(s) && s < limit) {
sums.add(s);
}
}
}
contains()
无法执行二进制搜索,则可能会变得昂贵。 - BobbyBitSet
会更好。 - starblue