2014-09-25 105 views
2

如何查找數字序列中的最低和最高值對?我想保存摺線圖的低/高值。查找序列中下一個最高和最低的數字

graph

你能幫我用一張僞代碼,使人們可以實現自己喜愛的前衛語言的答案。

我將使用它來生成一個D3.js的線圖。如果有人知道如何用D3做到這一點,我會非常樂意瞭解它。

數據樣本: [,10,11,,15%,,10,,15,17,,15,]

Desired Result: 
array[0][high] = 20 
array[0][low] = 5 
array[1][high] = 25 
array[1][low] = 5 
array[2][high] = 26 
array[2][low] = 7 

這就是我到目前爲止(使用Javascript)。你們是否看到我們可以優化這段代碼?

// data sample 
var data_sample = Array(5, 15, 20, 15, 6, 11, 21, 14, 9, 4, 15, 20, 15, 1, 10, 20, 4); 

// algo 
var low = high = k = 0; 
var log = []; 

for (var i = 0; i < data_sample.length; i++) { 

    var current = data_sample[i]; 
    var m = i+1; 
    var next = data_sample[m]; 

    if (typeof next == 'undefined') { 
     break; 
    } 

    if (current < next) { 
     if (low === 0) { 
      low = current; 
     } else if (current < low) { 
      low = current; 
     } 
    } else if (current > next && low !== 0) { 
     if (high === 0) { 
      high = current; 
     } else if (current > high) { 
      high = current; 
     } 
    } 

    if (low > 0 && high > 0){ 
     log[k] = []; 
     log[k]['low'] = low; 
     log[k]['high'] = high; 
     k++ 
     low = high = 0; 
    } 

}; 

預先感謝您

+0

是你數組初始化一樣,或者它只是一個錯字?這不是多維的。 – andrex 2014-09-25 06:55:37

+0

它是一個二維數組。這只是爲了說明結果數組將包含0維中序列的第一個高/低數字和第一個dim中的第二個低/高數值,依此類推。 – ndalpe 2014-09-25 07:20:41

+0

我發佈了一個答案,但刪除了它,因爲它依賴於選擇3個結果,是由你來選擇? – elclanrs 2014-09-25 07:29:59

回答

0

試試這個:

var arr = [20, 10, 11, 5, 15, 25, 10, 6, 15, 17, 26, 15, 7], 
    sorted = arr.sort(function(a,b){return a-b}); 

var array = []; 

sorted.forEach(function(d,i){ 
    var s = []; 
    s.push(sorted[i], sorted[(sorted.length-1) - i]); 
    array.push(s); 
}); 

console.log(array); 

工作撥弄here

+0

Thx Johnroe,我不能使用排序,因爲這些是線圖的價值。在你的序列中,最終的數組應該是[[20,5],[25,6],[26,7]] – ndalpe 2014-09-25 07:37:31

+0

這不是你想要的結果。它只是按成對排序,'[first,last],[second,last -1] ....' – andrex 2014-09-25 07:39:00

0

代碼的缺失的部分是如何存儲爲數組或對象。

在你的最後if condition之前結束for loop您需要初始化log[k]作爲一個對象,然後添加屬性lowhigh這樣

if (low > 0 && high > 0){ 
     log[k] = {}; 
     log[k].low = low; 
     log[k].high = high; 
     k++ 
     low = high = 0; 
} 

這樣做將導致是

array[0]{high: 20, low: 5} 
array[1]{high: 25,low: 6} 

如果你希望它是一個多維數組,你可以這樣做: 將log[k]初始化爲ab空數組。

if (low > 0 && high > 0){ 
     log[k] = []; 
     log[k]['low'] = low; 
     log[k]['high'] = high; 
     k++ 
     low = high = 0; 
} 

而結果

array[0]['high'] = 20 
array[0]['low'] = 5 
array[1]['high'] = 25 
array[1]['low'] = 6 
+0

好點andrex。它使代碼更清潔。因爲我將用這個函數處理數千條記錄。你是否看到我們可以優化代碼?像更快的執行和/或更少的內存使用?謝謝 – ndalpe 2014-09-25 07:47:54

相關問題