更好的日期比较任务算法

时间:2011-11-10 08:51:32

标签: c# performance algorithm

我希望有一些帮助使这种比较更快(下面的示例)。该示例获取数组中的每个值,将一小时附加到比较变量。如果没有匹配值,则将值添加到第二个数组(稍后连接)。

 if (ticks.TypeOf  == Period.Hour)
   while (compareAt <= endAt)
   {
      if (range.Where(d => d.time.AddMinutes(-d.time.Minute) == compareAt).Count() < 1)
         gaps.Add(new SomeValue() {
             ...some dummy values..  });

      compareAt = compareAt.AddTicks(ticks.Ticks);
   }

这个执行过程太费时了。此数组中最多有365 * 24 = 8760个值。将来,每月还会有分钟/秒60*24*31=44640,这意味着无法使用

如果阵列通常是完整的(这意味着没有间隙/空槽),它很容易被if (range.Count() == (hours/day * days))旁路。虽然,那一天不会是今天。

我如何更有效地解决它?

一个例子:如果阵列中有7800个值,我们会错过950个,对吗?但我能找到差距结局,只是创造缺失值吗?这将使o符号取决于差距的数量,而不是值的数量。

另一个受欢迎的答案只是一个更有效的循环。

[编辑] 抱歉英语不好,我尽力描述。

1 个答案:

答案 0 :(得分:0)

您的性能很低,因为范围查找没有使用任何索引,每次都会重新检查整个范围。

一种方法可以更快地完成这项工作;

    if (ticks.TypeOf == Period.Hour)
    {
        // fill a hashset with the range's unique hourly values 
        var rangehs = new HashSet<DateTime>();
        foreach (var r in range)
        {
            rangehs.Add(r.time.AddMinutes(-r.time.Minute));
        }

        // walk all the hours
        while (compareAt <= endAt)
        {
            // quickly check if it's a gap
            if (!rangehs.Contains(compareAt))
                gaps.Add(new SomeValue() {     ...some dummy values..});

            compareAt = compareAt.AddTicks(ticks.Ticks);
        }
    }