如何确定动态区间的极值(最小值和最大值)

时间:2015-03-05 00:21:23

标签: javascript arrays math

我有一个长度为200的数组。 每一秒我都有一个新数字添加到数组的位置[0],将其他值推到数组的一个位置。

我需要的是每次输入一个新数字时确定整个数组的最大值和最小值。我需要分析所有200个值,然后再将新值输入数组。

我已经设法这样做了,但是我在丢弃'旧'最大和'旧'分钟时遇到了一些麻烦,因为一旦它们被推出阵列,我就不再需要它了。

我找到了一种方法,通过使用第一个差分并将实际值推入另一个数组。问题在于,当我有多次出现最小值或最大值时。这个新数组会以无特定顺序重复它们,我只需要一个最大值和一个最小值。

1 个答案:

答案 0 :(得分:1)

如果你有一个n值的数组,通过删除第一个元素并在末尾推送一个新元素,每隔一段时间更新一次,那么你可以分割算法,该算法分两步找到间隔的最小值/最大值。

你的先决条件允许你做出一个强有力的假设,即

min(data) = min(data[0], data[1..n-1])

从这个假设开始,您不需要计算每一步所有值的最小值/最大值。

让我们举个例子,就像你说的那样,有200个值并且有一个通用min函数能够计算数组的最小值,一对值或一个值和一个阵列。它的元代码,忽略了语法。

首先,您需要预先计算最小和其他支持数据:

int middleMin = min(array[1..n-1]); // so we skip first
int firstValue = array[0];
int realMin = min(firstValue, middleMin);

现在,当你在最后插入一个新元素并删除前两个事情时可能会发生:

  • firstValue == realMin ( && firstValue < middleMin),在这种情况下,您必须在新的array[0..n-1]上找到下一个更高的值,因为您删除了最小值
  • middleMin == realMin在这种情况下,您知道删除的元素不是第一个,因此您不需要重新计算全局最小值,您只需根据新插入的元素更新它,例如middleMin = realMin = min(realMin, array[n-1])
  • 实际上它也可能发生firstValue == middleMin,但这会回到第二种情况,因为在路径数组中有另一个值是当前最小值。