我写了一个脚本,基本上可以找到另一个(更大)盒子中可以容纳多少个盒子。
我有一个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)
。
您能解释一下吗?
答案 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)