n / 2时间复杂度值得吗?

时间:2018-05-31 03:27:17

标签: algorithm time-complexity

假设我的任务是将两个给定点之间的所有奇数整数推入一个数组。大多数人会想到的第一件事就是使用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
}

2 个答案:

答案 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是开始和结束之间的差异。