我有一个排序字典,其中键是日期,值是一个表示剩余时间的整数。我有3年的数据
所以它会像
重点:2009-1-1,价值:100
关键:2009-1-2,价值:97
关键:2009-1-3,价值:92
关键:2009-1-4,价值:87
...
...
关键:2009-1-30,价值:0
我想计算每天的平均变化,并希望看看是否有任何优雅的方法。
答案 0 :(得分:3)
如果值严格下降,则每天的平均变化为:
total change = difference between time on last day and time on first day
average change = total change / number of days
如果您知道字典的大小,可以在O(1)中计算整个事物。
答案 1 :(得分:1)
如何在代码中执行此操作...
这将处理增加和减少:
int changeTot = 0;
int lastVal = 0;
bool first = true;
foreach (int val in myDict.Values)
{
if (!first) changeTot += val - lastVal;
lastVal = val;
first = false;
}
double avg = (double)changeTot / myDict.Count;
当然这是O(n),因为你只需要通过一次数组。
如果您的值仅增加或仅减少
你可以使用一点Linq:
double avg = (double)(myDict.Last().Value - myDict.First().Value) / myDict.Count();
这将是O(1)
答案 2 :(得分:0)
你这样做不止一次吗?您可以跟踪平均更改,每次插入,删除或更改字典中的元素时,只需查看元素的两个邻居即可更新平均更改。