我正试图在列表中获得不同持续时间的最大平均值。
假设我有以下数据:
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的最高平均值?
答案 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());
}