【问题标题】:What is the time complexity of this in-place array reversal?这种就地数组反转的时间复杂度是多少?
【发布时间】:2016-12-08 19:15:10
【问题描述】:

这个函数的时间复杂度是 O(n) 还是 O(log(n))。

function reverse(array) {
  for (var i = 0, j = array.length - 1; i < j; i++, j--) {
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }

  return array;
}

乍一看,它似乎对输入进行了 n/2 次迭代。不过仔细想想,低层操作的实际数量接近2n。

【问题讨论】:

  • n/2 和 2n 都不是 O(log(n))。
  • 仍然是 O(n)。 (它随着 n 线性增长)
  • 请解释为什么要答题
  • 它是o(n/2)
  • 关于您的最后一句话:就上限复杂度(big-O)而言,循环内的这些操作将始终需要恒定的时间来执行(O(1)),因此您可以忽略这些并减少到 O(n/2)

标签: javascript algorithm time-complexity


【解决方案1】:

所以假设你有一个长度为n的字符串 然后你有指标i=0j = n-1 循环一直持续到i&gt;=jj 递减 1,i 递增 1 这将为您提供总共n/2 次迭代。 在循环内,您总共有 3 个语句,这意味着循环将完成总共 3(n/2)。除此之外,您在循环外还有 1 个操作,让我们留下

f(n) = 3(n/2)+1 which is O(n)

编辑:这假设循环维护操作(i++,j--)是微不足道的,这是处理 Big Oh 符号时的常见做法

【讨论】:

  • 嗯,为什么我们假设 i++(或 i = i - 1)是“微不足道的”,但 data[i] = data[j] 有“成本”。这个解释对我来说仍然没有意义。
  • 只要这些操作每次都花费相同的时间,它们花费多少时间并不重要。这就是我们在这里所说的“微不足道”的意思。如果您选择包含循环操作的成本,它只会改变常数因子(3、/2 和 +1),根据定义,它们对最终答案没有影响。
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2020-12-03
  • 2017-09-11
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多