获得平均变化的最快算法

时间:2009-10-23 11:29:55

标签: c# algorithm performance

我有一个排序字典,其中键是日期,值是一个表示剩余时间的整数。我有3年的数据

所以它会像

重点:2009-1-1,价值:100
关键:2009-1-2,价值:97
关键:2009-1-3,价值:92
关键:2009-1-4,价值:87 ...
...
关键:2009-1-30,价值:0

我想计算每天的平均变化,并希望看看是否有任何优雅的方法。

3 个答案:

答案 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)

你这样做不止一次吗?您可以跟踪平均更改,每次插入,删除或更改字典中的元素时,只需查看元素的两个邻居即可更新平均更改。