假设我的任务是将两个给定点之间的所有奇数整数推入一个数组。大多数人会想到的第一件事就是使用mod检查从点a迭代到点b以推入数组。 如果数据集足够大,以下实际上会提供优势还是完全没必要?
findOddNums(start, end){
let output = []
let iter = start
if(start%2 > 0) {
output.push(start)
iter+=2
}else iter++
while(iter<=end){
output.push(iter)
iter+=2
}
return output
}
答案 0 :(得分:0)
从技术上讲,它将是O(d / 2),其中d是端点之间的距离(end-start)。为什么d / 2?因为在一个范围(+ -1)中存在与奇数一样多的偶数,所以从你找到的第一个奇数开始并从那里以2的步长迭代。所以O(n / 2)不好,O(d / 2)是。
答案 1 :(得分:0)
嗯,是的,处理所有其他项目的工作量比处理每个项目要少。请考虑以下代码:
for (int x = start; x <= end; ++x)
{
if (x % 2 != 0)
{
// do whatever
}
}
相反:
start = (start + 1) - (start % 2);
for (int x = start; x <= end; x += 2)
{
// do whatever
}
第二个是循环迭代的一半,这意味着你不必执行那个讨厌的条件。由于那里没有条件,你将在现代处理器上获得分支预测的巨大胜利。
那就是说,我怀疑这将是一个巨大的整体胜利,因为最昂贵的部分是将元素推入另一个阵列,并且无论哪种方式都可以这样做。
然而,它仍然是O(n)复杂度:迭代次数随n的大小线性增加。在这种情况下,n是开始和结束之间的差异。