大O标记-这是O(n)还是O(n2)?

时间:2019-02-17 19:34:34

标签: javascript big-o

我写了一个脚本,基本上可以找到另一个(更大)盒子中可以容纳多少个盒子。

我有一个boxes数组和所有产品包装盒的尺寸。products数组和所有产品包装盒的尺寸。

let boxes = [
  {label:'box1', width: 4, height: 3, length: 12},
  {label:'box2', width: 6, height: 5, length: 14},
  {label:'box3', width: 8, height: 6, length: 24},
];

let products = [
    {name:'AudioBox3000 ',  width: 2, height:  1, length: 3},
    {name:'Canister1500 ', width: 5, height:  1, length: 11}
];

for(let j = 0; j < products.length; j++)  // O(n)
{
    createDiv('********' + products[j].name + '*********');
  
    for (let i = 0; i < boxes.length; i++)  // O(m)
    {
      let totalWidth  = Math.floor(boxes[i].width  / products[j].width);
      let totalHeight = Math.floor(boxes[i].height / products[j].height);
      let totalLenght = Math.floor(boxes[i].length / products[j].length);
      let totalBoxes  = totalWidth * totalHeight * totalLenght;
      createDiv(totalBoxes + ' boxes fits on ' + boxes[i].label); 
    }
}

function createDiv (value) {
    let div = document.createElement('div');
    div.setAttribute('class', 'app');
    div.innerHTML = value;
    document.body.appendChild(div);
}
 

很明显for(let j = 0; j < products.length; j++)O(n)

并且for (let i = 0; i < boxes.length; i++)也是O(n)

所以我很困惑,是O(n²)还是O(n)

您能解释一下吗?

2 个答案:

答案 0 :(得分:6)

既不是O(n)也不是O(n2)

让我们将N视为产品数量,然后将M视为箱数。

此算法的时间复杂度为O(N * M)

区分这2个点很重要,因为例如,让我们假设盒子的数量是一个固定的数量,例如100。那么M将是一个常数,因此算法的时间复杂度将是线性的。另一方面,如果可以将盒子的数量表示为产品数量的函数,例如,让我们假设盒子的数量是产品数量乘以2,那么在这种情况下,M等于N ^ 2,因此时间复杂度将为O(N^3)

如果产品的数量和盒子的数量根本不相关,并且它们的增长都可以不同,那么时间复杂度肯定是O(N * M)

答案 1 :(得分:1)

如果另一个循环中有一个循环,那么总复杂度将为O(n * n)