Javascript 此就地阵列反转的时间复杂度是多少?

Javascript 此就地阵列反转的时间复杂度是多少?,javascript,algorithm,time-complexity,Javascript,Algorithm,Time Complexity,这个函数的时间复杂度是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; } 函数反转(数组){ 对于(var i=0,j=array.length-1;i=

这个函数的时间复杂度是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;
}
函数反转(数组){
对于(var i=0,j=array.length-1;i

乍一看,它似乎对输入进行了n/2次迭代。但是,如果您仔细想想,较低级别操作的实际数量接近2n。

因此假设您有一个长度为
n
然后是指示器
i=0
,和
j=n-1
循环一直持续到
i>=j
,其中
j
递减1,
i
递增1 这将为您提供总共
n/2
次迭代。 在循环中,您总共有3条语句,这意味着循环将总共完成
3(n/2)
。除此之外,你还有一个循环外的操作留给我们

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

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

n/2和2n都不是O(log(n))。它仍然是O(n)。(它与n成线性增长)请解释为什么答案是
o(n/2)
。关于你的最后一句话:就上界复杂度(big-o)而言,循环中的这些操作总是需要恒定的时间来执行(o(1)),所以你可以忽略这些,并将其简化为o(n/2)嗯,为什么我们假设i++(或i=i-1)是“微不足道的”但data[i]=data[j]有“成本”。这个解释对我来说仍然没有意义。只要这些操作每次花费相同的时间,它们花费多少时间都无关紧要。这就是我们这里所说的“琐碎”的意思。如果选择包含循环操作的成本,它只会更改常量因子(3、/2和+1),根据定义,这对最终答案没有影响。