效率:整数数组子集中两个项之间的最大差异

时间:2015-03-26 20:45:45

标签: javascript

我正在参加一项编程考试,该考试要求我为特定问题编写高效的代码。我相信我已经找到了正确的答案(它适用于5个测试场景中的3个),但剩下的两个测试场景(我没有详细说明)因为耗时超过2秒而失败。

我使用.slice.apply()克隆子数组并获取其中的最大/最小值。这是最慢的部分,我该怎么做才能改善它?

我的代码:

function find_deviation(v, d) {
    var maxMedian = 0;
    var i = 0;
    var len = v.length - d + 1;
    var sequence, min, max, median;
    for(;i < len; ++i) {
        sequence = v.slice(i, i+d);
        min = Math.min.apply(null, sequence);
        max = Math.max.apply(null, sequence);
        median = max - min;
        if(median > maxMedian) {
            maxMedian = median;
        }
    }
    console.log(maxMedian);
}

问题:

数组maxMedian的子集中两个项目之间的最大差异(v)是多少,长度为d项? v数组中的所有项都是整数,以及d

1 个答案:

答案 0 :(得分:1)

首先,我是否正确地假设你想找到所有大小为d的紧凑子阵列之间的最大差异?

如果是这样,那么从头顶我可以看到两个问题:

  • 阵列切片的开销,
  • Math.minMath.max的复杂程度为O(n),当您执行这两项操作时,它会生成O(2n)。

为解决这两个问题,我想出了以下内容:

function find_deviation(v, d) {
    var maxDifferenceGlobal = 0;
    var len = v.length - d + 1;
    for(var i = 0; i < len; ++i) {
        var min, max;
        if (v[i] <= v[i + 1]) {
            min = v[i]; max = v[i + 1];
        } else {
            max = v[i]; min = v[i + 1];
        }
        for(var j = i + 2; j < i + d; ++j) {
            if (min > v[j]) { min = v[j]; }
            if (max < v[j]) { max = v[j]; }
        }
        var maxDifferenceLocal = Math.abs(max - min);
        if(maxDifferenceLocal > maxDifferenceGlobal) {
            maxDifferenceGlobal = maxDifferenceLocal;
        }
    }
    console.log(maxDifferenceGlobal);
}

这消除了数组切片的开销,并在O(n)中找到maxmin,所以最好只用常量但使区别。另外,您不应该使用Math.abs来计算差异吗?