有序列表中的最大平均序列

时间:2016-12-15 00:53:18

标签: c#

我正试图在列表中获得不同持续时间的最大平均值。

假设我有以下数据:

var randomList = new List<int>();
var random = new Random(1969);

for (var i = 0; i < 10; i++)
{
    randomList.Add(random.Next(0, 500));
}

产生以下列表:

190
279
37
413
90
131
64
129
287
172

我正在尝试获得不同组0-9的最高平均值。

设置0(连续一项)= 413(索引3)

设置1(连续两项)= 252(平均指数3,4)

设置9(连续10个项目)= 179(整个列表的平均值)

我一直在打我的脑袋。我正在尝试找到一种有效的方法来写这个,所以我尽可能少地遍历。在制作中,我将列出3500-6000点。

如何找到不同组0-9的最高平均值?

2 个答案:

答案 0 :(得分:1)

这可能不是最有效的方法,但它运作良好:

基本上,我们使用堆栈来跟踪我们遍历的项目。然后,为了计算n最后一项的平均值,我们从堆栈中查看n个项目。

void Main()
{
    var randomList = new List<int>();
    var random = new Random(1969);

    for (var i = 0; i < 10; i++)
    {
        randomList.Add(random.Next(0, 500));
    }

    // Use the values from the original post for validation
    randomList = new List<int> { 190, 279, 37, 413, 90, 131, 64, 129, 287, 172 };

    const int numSets = 9;
    var avgDict = Enumerable.Range(1, numSets).ToDictionary(e => e, e => (double)0);
    var s = new Stack<int>();
    foreach (var item in randomList)
    {
        s.Push(item);
        for (var i = 1; i <= numSets; i++)
        {
            if (s.Count >= i)
            {
                var avg = s.Take(i).Average();
                if (avg > avgDict[i])
                    avgDict[i] = avg;
            }
        }
    }
    avgDict.Dump();
}

产生结果:

1 413 
2 251.5 
3 243 
4 229.75 
5 201.8 
6 190 
7 183.714285714286 
8 178.75 
9 180

我不确定使用Stack对大型列表的影响,当我们只需要9-10个项目时。对于定制的有限尺寸堆栈,可能是一个很好的案例

答案 1 :(得分:1)

在评论中,您提到了Avg(items:0,1,2) vs Avg(items:1,2,3) vs Avg(items:2,3,4)

不确定这是否是您想要的,但我想出了这个。

首先,获取随机数,然后获得3个数字的平均值。然后,获得最大的平均值。

    static void Main(string[] args)
    {
        var randomList = new List<int>();
        var random = new Random(1969);
        int TotalRandomNumber = 10; //Change this accordingly
        for (var i = 0; i < TotalRandomNumber ; i++)
        {
            randomList.Add(random.Next(0, 500));
        }

        foreach (var item in randomList)
        {
            Console.WriteLine("Random Number: " + item);
        }

        var AveNum = new List<double>();
        int range = 3; //Change this for different range
        for (int i = 1; i < TotalRandomNumber - range; i++)
        {
            var three = randomList.GetRange(i, range);
            double result = three.Average();
            Console.WriteLine("Average Number: " + result);
            AveNum.Add(result);
        }

        Console.WriteLine("Largest: " + AveNum.Max());
    }