6

我需要计算大数组的最小值/最大值。我知道Math.max.apply(),但是在大型数组上它会因堆栈溢出异常而失败。有什么简单的解决方案吗?

4

6 回答 6

7
  1. 使用sort()方法对数组进行排序 它使用快速排序算法对数组进行排序

  2. 由于数组按升序排序,因此最后一个元素是最大值

    var arr = [1,4,6,4, ...];
    arr.sort((a, b) => a - b);
    var max = arr[arr.length - 1];
    
于 2013-06-05T18:25:50.023 回答
3
Array.prototype.min = function() {
    var r = this[0];
    this.forEach(function(v,i,a){if (v<r) r=v;});
    return r;
};

来自JavaScript:最小和最大数组值?讨论此问题的其他解决方案的地方

仅供参考:我刚刚搜索了“最大最小大数组”并发现这是第一个结果......

于 2013-06-05T18:22:30.367 回答
2

为什么不直接遍历整个数组呢?

var max = Number.MIN_VALUE, min = Number.MAX_VALUE;
for (var i = 0, len=list.length; i < len; i++) {
   if (list[i] > max) max = list[i];
   if (list[i] < min) min = list[i];
}

编辑:

对于最大值:

if (typeof Array.prototype.GetMax === "undefined") {
    Array.prototype.GetMax = function() {
        var max = Number.MAX_VALUE;
        for (var i = 0, len=this.length; i < len; i++) {
           if (this[i] > max) max = this[i];
        }
        return max;
    }
}

分钟:

if (typeof Array.prototype.GetMin === "undefined") {
    Array.prototype.GetMin = function() {
        var min = Number.MIN_VALUE;
        for (var i = 0, len=this.length; i < len; i++) {
           if (this[i] < min) min = this[i];
        }
        return min;
    }
}

对彼此而言:

if (typeof Array.prototype.GetMaxMin === "undefined") {
    Array.prototype.GetMaxMin = function() {
        var max = Number.MIN_VALUE, min = Number.MAX_VALUE;
        for (var i = 0, len=this.length; i < len; i++) {
            if (this[i] > max) max = this[i];
            if (this[i] < min) min = this[i];
        }
        return { Max: max, Min: min};
    }
}
于 2013-06-05T18:20:58.170 回答
0

尝试这个

var arr = [];
for(var i=1000000;i>0;i--)
{
    arr.push(i);
}
//we create a copy of the original array through arr.concat() since we do not want to change the original sorting order of the array
//we pass a function in the sort method as by default it sorts alphabetically instead of numerically. So 99 will be smaller than 100.
var arrMaxMin = arr.concat().sort(function(a,b){return a-b});

arrMaxMin[0]; //min
arrMaxMin[arrMaxMin.length - 1]; //max
于 2013-06-05T18:28:39.293 回答
0

嘿,为什么不将数组切成更小的数组,然后在该数组上您可以轻松使用 Math.max.apply(Math,individual arrays)。但请记住将所有子数组重新初始化为 null,以便在需要的最大值后恢复内存获得

于 2013-06-05T18:33:23.330 回答
0

我是否应该假设您已经想到了这一点:

var maxSoFar = -9999999;
for (var i = 0; i < array.length ; ++i) {
    if (array[i] > maxSoFar) {
        maxSoFar = array[i];
    }
    ... similar for minSoFar ...
}
于 2013-06-05T18:21:19.873 回答