【问题标题】:Find next highest and next lowest number in a sequence在序列中查找下一个最高和下一个最低的数字
【发布时间】:2014-09-25 06:47:38
【问题描述】:

如何在一个数字序列中找到最低值和最高值的对?我想保存折线图的低/高值。

你能帮我写一段伪代码,这样人们就可以用他们最喜欢的编程语言来实现答案。

我将使用它通过 D3.js 生成折线图。如果有人知道如何用 D3 做到这一点,我会很高兴知道它。

数据样本: [20, 10, 11, 5, 15, 25, 10, 5, 15, 17, 26, 15, 7]

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 维度中序列的第一个高/低值和 1 维度中的第二个低/高值,依此类推。
  • 我发布了一个答案但删除了它,因为它取决于选择 3 个结果,这取决于您选择吗?

标签: javascript d3.js data-visualization


【解决方案1】:

试试这个:

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

【讨论】:

  • 谢谢约翰罗,我不能使用排序,因为这些是折线图的值。使用您的序列,最终数组应该是 [[20,5],[25,6], [26,7]]
  • 这样的结果不是你想要的。它只是按对排序,[first, last],[second, last -1] ....
【解决方案2】:

您的代码中缺少的部分是如何存储为数组或对象。

在你结束for loop之前的最后一个if condition中,你需要将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

【讨论】:

  • 好点安德烈。它使代码更干净。因为我将使用此功能处理数千条记录。您是否看到我们可以优化代码?喜欢更快的执行和/或更少的内存使用?谢谢
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 2017-03-04
  • 2011-11-10
  • 1970-01-01
  • 2023-03-15
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多