我有一个长度为200的数组。 每一秒我都有一个新数字添加到数组的位置[0],将其他值推到数组的一个位置。
我需要的是每次输入一个新数字时确定整个数组的最大值和最小值。我需要分析所有200个值,然后再将新值输入数组。
我已经设法这样做了,但是我在丢弃'旧'最大和'旧'分钟时遇到了一些麻烦,因为一旦它们被推出阵列,我就不再需要它了。
我找到了一种方法,通过使用第一个差分并将实际值推入另一个数组。问题在于,当我有多次出现最小值或最大值时。这个新数组会以无特定顺序重复它们,我只需要一个最大值和一个最小值。
答案 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
,但这会回到第二种情况,因为在路径数组中有另一个值是当前最小值。