gpt4 book ai didi

c# - 高效滚动最大和最小窗口

转载 作者:太空狗 更新时间:2023-10-29 20:20:59 24 4
gpt4 key购买 nike

我想有效地计算滚动最大值和最小值。意思是比每次窗口移动时从所有使用的值重新计算最大值/最小值更好。

这里有一篇帖子问了同样的问题,有人发布了一个涉及某种堆栈方法的解决方案,该方法据称可以根据其评级工作。然而,我再也找不到它了。

在寻找解决方案或帖子时,我们将不胜感激。谢谢大家!

最佳答案

您要使用的算法称为升序最小值 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com