我在 Big O Runtime 中计数 Math.max 吗?

Do I count Math.max in a Big O Runtime?

我无法理解天气或不使用 Math.max 应该算作一个循环,因此应该包含在计算 Big O 运行时中。

我假设 Math.max 找到它必须循环的最大值并比较它提供的所有值。因此它实际上是在循环。

我的 JS 代码:

function getWaterCapacityPerSurface(surface){
    let waterAmount = 0;

    // full loop
    for(let i = 1; i < surface.length - 1; i++){
        const current = surface[i];

        // I assume each slice is counted as a half of the full loop
        const leftSlice = surface.slice(0, (i - 1 < 0 ? 0 : i));
        const rightSlice = surface.slice(i + 1, surface.length);

        // I assume each Math.max is counted as a half of the full loop
        const leftBound = Math.max(...leftSlice);
        const rightBound = Math.max(...rightSlice);

        const canWaterStay = leftBound > current && rightBound > current;
        const currentBound = Math.min(leftBound, rightBound);
        const waterLevel = currentBound - current;

        if(canWaterStay) waterAmount += waterLevel;
    }

    return waterAmount;
}

console.log(getWaterCapacityPerSurface([4,2,1,3,0,1,2]));
// returns 6

Big O 运行时间是 O(N(N+N)) 还是 O(N(N))?

我假设在这种情况下它并不重要,因为我们删除常量,最后它将是 O(N(N+N)) = O(N(2N)) = O(N (N)) = O(N²) 但我只想知道天气我应该把 Math.max/Math.min 算作一个循环以供将来参考。

是的,如果将长度为 n 的参数列表传递给 Math.max(),那么它是一个 O(n) 操作。 Math.max() 遍历每个参数。在 specification.

中查看更多信息