【问题标题】:Better algorithm for a date comparison task日期比较任务的更好算法
【发布时间】:2011-11-10 08:51:32
【问题描述】:

我需要一些帮助来加快比较速度(示例如下)。该示例获取数组中的每个值,将小时附加到比较变量。如果没有匹配的值,它会将值添加到第二个数组(稍后连接)。

 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-notation 取决于间隙的数量,而不是值的数量..

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

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

【问题讨论】:

  • 我读了你的问题两次,但我仍然不确定你在这里要求什么。 “阵列中的间隙”,您是在谈论阵列中的空槽吗?或间隔?请重写您的问题,使其更有意义。
  • 抱歉,无法理解您要做什么。
  • @Lasse Gaps 表示空位!对不起英语。小时可以跨越20110101 00:00 -- 20110601 23:00,但有缺失值,即20110303 14:00 20110304 04:00
  • 这不就是对它们进行排序,遍历它们,并处理一个项目和下一个项目之间的差异吗?然后,您可以轻松识别任何缺失值。
  • @Lasse,嗯.. 这正是上面的代码示例正在做的事情.. 比较一年的时间需要很多时间。

标签: c# performance algorithm


【解决方案1】:

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

一种更快地做到这一点的方法;

    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);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2015-08-19
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多