2014-09-25 106 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

相关问题