2014-02-25 392 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