我想有效地计算滚动最大值和最小值。意思是比每次窗口移动时从所有使用的值重新计算最大值/最小值更好。
这里有一篇帖子问了同样的问题,有人发布了一个涉及某种堆栈方法的解决方案,该方法据称可以根据其评级工作。然而,我再也找不到它了。
在寻找解决方案或帖子时,我们将不胜感激。谢谢大家!
最佳答案
您要使用的算法称为升序最小值 (C++ implementation) .
要在 C# 中执行此操作,您需要获得 double ended queue类,NuGet 上有一个很好的名称 Nito.Deque .
我已经使用 Nito.Deque 编写了一个快速的 C# 实现,但我只是简单地检查了一下,并且是根据我的想法进行的,所以它可能是错误的!
public static class AscendingMinima
{
private struct MinimaValue
{
public int RemoveIndex { get; set; }
public double Value { get; set; }
}
public static double[] GetMin(this double[] input, int window)
{
var queue = new Deque<MinimaValue>();
var result = new double[input.Length];
for (int i = 0; i < input.Length; i++)
{
var val = input[i];
// Note: in Nito.Deque, queue[0] is the front
while (queue.Count > 0 && i >= queue[0].RemoveIndex)
queue.RemoveFromFront();
while (queue.Count > 0 && queue[queue.Count - 1].Value >= val)
queue.RemoveFromBack();
queue.AddToBack(new MinimaValue{RemoveIndex = i + window, Value = val });
result[i] = queue[0].Value;
}
return result;
}
}
关于c# - 高效滚动最大和最小窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823713/