javascript - 以下函数的大 O 是什么:
问题描述
在确定每个函数的大 O 是什么时,我需要以下问题的帮助。
对于问题一,我尝试了 O(log(n)) 和 O(n)。我认为该函数是线性的,或者换句话说,对于 N 个元素,我们将需要 N 次迭代。
对于问题二,我尝试了 O(n^2)。我认为对于这种顺序,最坏情况时间(迭代)是输入数量的平方。时间随着输入的数量呈指数增长。
对于问题三,我尝试了 O(n^2) 和 O(1)。
问题一:
function foo(array){
let sum = 0;
let product = 1;
for (let i = 0; i < array.length; i++){
sum += array[i]
}
for(let i = 0; i < array.length; i++){
product *= array[i];
}
consle.log(sum + ", " + product);
}
问题二:
function printUnorderedParis(array){
for(let i = 0; i < array.length; i++){
for(let j = i + j; j < array.length; j++){
console.log(array[i] + ", " + array[j]);
}
}
}
问题三:
function printUnorderedPairs(arrayA, arrayB){
for(let i = 0; i < arrayA.length; i++){
for(let j = 0; i < arrayB.length; j++){
for(let k = 0; k < 100000; k++){
console.log(arrayA[i] + ", " + arrayB[j]);
}
}
}
}
我预计我最初的想法是正确的,但也许我很难掌握大 O。
解决方案
你是对的,它是
O(n)
. 您有两个循环,它们每个都执行array.length
迭代。您甚至可以将它们组合成一个循环以使其更加明显。for (let i = 0; i < array.length; i++) { sum += array[i]; product *= array[i]; }
你没看错,
O(n^2)
是 嵌套循环执行array.length * array.length
迭代。
编辑——见我上面的评论,询问这个问题是否被正确复制。这也是
O(n^2)
。第三级嵌套循环不会改变复杂性,因为它执行固定次数的迭代。由于这不依赖于输入的大小,因此它被视为一个常数。所以就 Big-O 而言,这相当于问题 2。