这是一个我将加入类别"计算机科学500"在危险的墙上。 想象一下,你会有两个列表,你定期填写双值(即:每200ms)。每次添加新值时,都会计算其总和。如果达到预定义的限制(例如,最多:20个项目),而列表A添加了18个项目,列表B 20,则需要构建每个列表的总和并比较其两个值。哪个列表达到了最高金额?现在,想象一下在环型内存中使用的列表,其中最旧的条目被最新的double值替换。从那时起,已达到最大限制,每个新值都会导致函数调用以构建总和。 现在我的计算机科学问题/程序化方法: 哪个是正确且最有效地处理这个快速填充列表的最佳设计?该函数可能需要2s(如果它更复杂),我最感兴趣的是获得当前双值数据集的更新总和。恕我直言,我需要拍摄快照"当前列表(使用ToList),并计算其总和,但同时已添加新值。
我希望你能够对我提到的关于上述问题的意识流感到印象,并且可能有助于一些想法让灯泡闪烁高于我的头脑。
感谢收听。
编辑:
由于McCarthy先生的问题,坐在你的左侧第4排,我会给你一些代码片段,如果它有帮助,没问题,就像ALF会说的那样:
public class Score
{
public double Score { get; set;};
public double Timestamp { get; set;};
}
public class RootPool
{
private int ID{ get; set;};
private List<LeafPool> lstLeafs = new List<LeafPool>;
public RootPool(int id, CallbackEventHandler callback)
{
ID = id;
Callback = callback;
lstLeafs = new List<LeafPool>;
foreach (LeafPool lp in XMLSource)
{
LeafPool leaf = new LeafPool(lp.ID, lp_Callback);
lstLeafs.Add(leaf);
}
}
public delegate void CallbackEventHandler(int ID, double sumMax);
public event CallbackEventHandler Callback;
void rp_Callback()
{
findSumMax();
}
private void findSumMax()
{
double sumMax = 0;
//take snapshot
List<LeafPool> SortedList = lstLeafs.OrderByDescending(l=>l.SUM).ToList();
if (SortedList.Count > 0)
{
sumMax = SortedList[0].SUM;
if (Callback != null)
Callback(ID, sumMax);
}
}
}
public class LeafPool
{
private int ID { get; set;};
private Score[] arrScore { get; set;};
private double SUM { get; set;};
public LeafPool (int id, CallbackEventHandler callback)
{
ID = id;
Callback = callback;
arrScore = new Score[20];
}
public delegate void CallbackEventHandler();
public event CallbackEventHandler Callback;
public void AddVal(Score valTime)
{
//find oldest entry
int numEmpty = arrScore.Where(l => l == null).Count();
if (numEmpty > 0)
{
var index = Array.IndexOf(arrScore, null);
arrScore[index] = val;
}
else
{
var oldestEntry = arrScore.Select(l => l.Timestamp).Min()
int index = myList.FindIndex(l.Timestamp == oldestEntry);
arrScore[index] = val;
}
SUM = arrScore.Where(l => l != null).Sum();
int numEmpty = arrScore.Where(l => l == null).Count();
if (numEmpty == 0)
{
if (Callback != null)
Callback();
}
}
}
public class Main
{
private List<RootPool> lstRootPool = new List<RootPool>;
//fill list by XML
foreach (RootPool rp in XMLSource)
{
RootPool root = new RootPool(rp.ID, rp_Callback);
lstRootPool.Add(rp);
}
//add Score values to Leaf pools
lstRootPanel.Where(l => l.ID == 1).FirstOrDefault().lstLeafs.Where(l => l.ID == 101).FirstOrDefault().AddVal(score1);
void rp_Callback(int ID, double sumMax)
{
//eval ID/sumMax tuple
evalTuple(ID, sumMax);
}
}