查找数据字符串中的最大/最小值

时间:2014-02-25 22:44:02

标签: javascript jquery

我有一串数据,这是一对x,y对的字符串,如下所示:

[
    [0.519999980926514, 0.0900000035762787],
    [0.529999971389771, 0.689999997615814],
    [0.519999980926514, 2.25],
    [0.850000023841858, 2.96000003814697],
    [1.70000004768372, 3.13000011444092],
    [1.91999995708466, 3.33999991416931],
    [0.839999973773956, 3.5],
    [1.57000005245209, 3.38000011444092],
    [0.819999992847443, 3.00999999046326],
    [1.69000005722046, 2.99000000953674],
    [2.98000001907349, 3.23000001907349],
    [0.509999990463257, 1.11000001430511],
    [0.670000016689301, 1.35000002384186],
    [0.660000026226044, 1.26999998092651],
    [0.689999997615814, 0.0500000007450581],
    [1.30999994277954, 0.0599999986588955],
    [0.569999992847443, 0.0299999993294477],
    [0.629999995231628, 0.0399999991059303],
    [0.720000028610229, 0.0399999991059303],
    [0.639999985694885, 0.0399999991059303],
    [0.540000021457672, 0.0399999991059303],
    [0.550000011920929, 0.0500000007450581],
    [0.850000023841858, 0.0399999991059303],
    [0.610000014305115, 0.0199999995529652],
    [0.509999990463257, 0.0500000007450581],
    [0.610000014305115, 0.0599999986588955],
    [0.5, 0.0599999986588955],
    [0.639999985694885, 0.0599999986588955]
]

我想要做的是找到每对中的最大值和最小值。

有没有办法在不经过整个字符串并检查对中的每个元素的情况下这样做?

1 个答案:

答案 0 :(得分:1)

在这个问题上,没有办法超越O(n)操作(其中n是对的数量)。

在某些情况下,可以在更短的时间内找到最大值,但是所有算法都需要至少1次比较(这是确定一对最大值所需的比较次数)。

要做你想做的事,你应该转向JavaScript的精彩mapapply函数:

function maxOfSubArrays(input) {
    // assumes `input` is an array of n-element arrays
    return input.map(function(el) { return Math.max.apply(Math, el); });
}

map返回一个新数组,每个元素设置为应用于原始数组中元素的函数的返回值(即mapped[i] = f(input[i]))。 apply调用一个函数,将提供的数组解压缩为参数(因此Math.max.apply(Math, [1, 2])Math.max(1, 2)相同)。

要查找最小值而不是最大值,请使用Math.min。要获得两者,最简单的方法是返回[Math.min..., Math.max...]

编辑:如果我理解你的评论,你想把它当作一个nx2矩阵,其中n是对的数量(也就是:行数)。然后,您想要找到每列的最大值。使用applymap

相对容易
function maxOfColumns(input) {
    return [Math.max.apply(Math, input.map(function(el) { return el[0]; })),
            Math.max.apply(Math, input.map(function(el) { return el[1] }))];
}

细心的读者会注意到,这会创建整个数据集的副本。对于大型数据集,这可能是一个问题。在这种情况下,使用map构造列将不是理想的。但是,对于大多数用例而言,性能差异不会很大。

这是一个演示两种变体的JSFiddle:http://jsfiddle.net/utX53/查看JS控制台以查看结果(在Win / Lin中Chrome上的Ctrl-Shift-J)

似乎没有任何特定的结构可以用来加速这个过程,这意味着O(n)仍然是最快的。

最后一句话:maxOfColumns可以简单地扩展到处理任意数量的列。我将它留给读者来弄清楚如何(主要是因为它比上面的可读性差得多)。