首页 > 解决方案 > 以下函数的大 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。

标签: javascriptbig-o

解决方案


  1. 你是对的,它是O(n). 您有两个循环,它们每个都执行array.length迭代。您甚至可以将它们组合成一个循环以使其更加明显。

    for (let i = 0; i < array.length; i++) {
        sum += array[i];
        product *= array[i];
    }
    
  2. 你没看错,O(n^2)是 嵌套循环执行array.length * array.length迭代。
    编辑——见我上面的评论,询问这个问题是否被正确复制。

  3. 这也是O(n^2)。第三级嵌套循环不会改变复杂性,因为它执行固定次数的迭代。由于这不依赖于输入的大小,因此它被视为一个常数。所以就 Big-O 而言,这相当于问题 2。


推荐阅读