我有一个包含 10000 个随机数(mod 100)的向量,我想计算其中两个数字有多少对总和为 100。我写了以下内容:
auto noPairsSumTo100 = 0;
const auto itEnd = end(myNums);
for (auto it1 = begin(myNums); it1 != itEnd ; ++it1) {
for (auto it2 = it1; it2 != itEnd ; ++it2) {
if (*it1 + *it2 == 100) {
noPairsSumTo100 ++;
}
}
}
在我的机器上,这大约需要 21.6 秒才能在调试模式下运行。如果我设置 _ITERATOR_DEBUG_LEVEL=0(将 _SECURE_SCL 和 _HAS_ITERATOR_DEBUGGING 都设置为 0),则执行时间将减少到 ~9.5 秒。!=
将比较替换为<
可将时间进一步缩短至约 8.5 秒。
如果我通过像这样索引向量来实现相同的算法:
auto noPairsSumTo100 = 0;
const auto itEnd = end(myNums);
for (auto index1 = 0; index1 < noTerms; ++index1) {
for (auto index2 = index1; index2 < noTerms; ++index2) {
if (myNums[index1] + myNums[index2] == 100) {
noPairsSumTo100 ++;
}
}
}
在调试模式下运行大约需要 2.1 秒。我认为除了使用迭代器之外,我可以使算法尽可能接近。我的问题是,是什么让第一个实现比第二个长约 4 倍?
请注意,两个版本的算法在发布模式下运行大约需要 34 毫秒,因此差异已被优化。