Javascript 此就地阵列反转的时间复杂度是多少?
这个函数的时间复杂度是O(n)还是O(log(n))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=
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),根据定义,这对最终答案没有影响。