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

标签 c# performance

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

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

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

最佳答案

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

相关文章:

c# - 在 C# 中使用来自服务器资源管理器的数据连接

c# - LINQ:子 IEnumerable 的平均值

c# - 在 MVC 中发送远程属性的参数

performance - leader-follower算法的时间复杂度?

javascript - react 大数据 block 的非阻塞渲染

c# - 在 C# 中访问列表中的项目

javascript - for 循环中的 if 条件 - 性能差异

c++ - 在成员函数上使用外部类的好的设计是什么?

javascript - Knockout - 绑定(bind)到引用对象

c# - 在不使用语句的情况下使用 Entity Framework 的缺点?