【问题标题】:Algorithm to detect overlapping of dates in list检测列表中日期重叠的算法
【发布时间】:2015-08-17 18:08:43
【问题描述】:

我有开始和结束日期的记录列表。我想知道哪些记录日期与其他记录日期重叠。下面是示例,记录 5 日期与记录 3 和 4 重叠。如何检查?

我通过link

我的问题是因为所有日期都在同一个列表中,我必须获取每条记录并与其他记录进行比较,我认为这是一个性能问题。

还有其他方法可以做到这一点吗?喜欢使用 Lambda 吗?

【问题讨论】:

标签: c# performance date ienumerable


【解决方案1】:

您只需按开始日期对集合进行排序,然后按结束日期排序。完成此操作后,您可以迭代集合,对于每个节点,您可以查看后续节点,直到找到不重叠的节点。

因此,如果您的数据集已经排序,这是一个 O(n) 操作;如果它没有排序,那么它是一个 O(n*log(n)) 操作,它仍然明显优于每个节点与其他节点进行比较所需的 O(n^2) 时间。

【讨论】:

  • 我不明白它是如何工作的... {2,9001}, {3,9001},... {8999,9001} 并与 {1,9000} 重叠 - 你能解释一下你是如何在那个情况下得到小于 O(n) 或得到 O(n log n) 的(因为有 n^2 对重叠范围)?
  • @AlexeiLevenkov 排序后,您只需要记住您遇到的最新结束日期,迭代集合,如果当前项目在最新结束日期结束后开始,则它与上一组。您只需在对集合进行排序后迭代一次,并将其与您已经从先前迭代中计算的值进行比较。
  • 我明白了 - 您计算了生成列表所需的操作数,而我计算了迭代输出列表的操作数(可能更高)。我已经删除了我的帖子(因为它需要更多细节是合理的),请考虑在您的帖子中提供有关复杂性数字的伪代码/备注。
【解决方案2】:

如果你想使用 LINQ - 你可以使用这个变体。但老实说,for 在性能方面会给你更好的结果。例如here,您可以在forLINQ 之间找到一些比较,而不是支持LINQ

        var dates = new List<Tuple<DateTime, DateTime>>
                        {
                            new Tuple<DateTime, DateTime>(new DateTime(2001, 1, 1), new DateTime(2005, 1, 12)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2006, 1, 1), new DateTime(2006, 4, 4)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2007, 1, 5), new DateTime(2007, 10, 15)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2009, 1, 2), new DateTime(2009, 4, 5)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2007, 3, 3), new DateTime(2009, 5, 3))
                        };

        var overlaps = (from t1 in dates
                        from t2 in dates
                        where !Equals(t1, t2) // Don’t match the same object.
                        where t1.Item1 <= t2.Item2 && t1.Item2 >= t2.Item1   //check intersections
                        select t2).Distinct();

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多