2014-02-25 180 views
-2

我有数据的字符串,是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] 
] 

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

有没有办法做到这一点,而不通过整个字符串,并检查对中的每个元素?

+3

你尝试过什么吗?你能告诉我们一些代码吗?这可能是一个重复的http://stackoverflow.com/questions/1379553/how-might-i-find-the-largest-number-contained-in-a-javascript-array –

+1

你是什么意思最小最大在每一双?你能打印样本输出吗?对于你的问题,我认为你可以从小问题开始。 – Mutant

+0

不,如果不通过每个字符串并单独比较它们,没有办法做到这一点,除非您通过另一个函数获取此信息,您可以在保存数组之前对其进行比较。 – Deviljho

回答

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 /林按Ctrl-Shift-J键在Chrome)的结果

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

最后一个单词:maxOfColumns可以平凡扩展以处理任意数量的列。我把它留给读者来弄清楚(主要是因为它比上面更不可读)。

+0

我很感谢你的帮助,而不是在你的答案中居高临下。我不得不查找如何在JSFiddle中编写变量。这就是我想要的:http://jsfiddle.net/HKhw8/99/我打电话给该函数,但它是空的。我不确定这是否会返回对中第一个元素的最大值。我正在查找第一个元素max和第二个元素max。 – Crimpy

+0

你的意思是说你想把它当作一个矩阵的两列,然后找到每列的最大值?在这种情况下,我会再次使用'map'和'apply',但顺序略有不同:'[Math.max.apply(Math,input.map(function(el){return el [0];} )),Math.max.apply(/ *相同的东西,但用el [1] * /)]' –

+0

非常感谢。我将它分解为两个函数,将X和Y作为单独的结果。没有你的帮助,我永远都不会得到这一点。非常感激。 – Crimpy