【问题标题】:Calculate Intersection/Intercept between two lists that contain ranges计算包含范围的两个列表之间的交集/截距
【发布时间】:2014-11-22 02:08:42
【问题描述】:

我正在尝试找到反向交叉点,看看两支球队是否可以互相比赛,但很难找出准确的代码来做到这一点。

表示以下范围的类将包含两个属性,开始时间和结束时间,可以是日期时间或时间跨度。每个团队都可以拥有这些列表。时间跨度属性下降到分钟,因此下午 2:21 有效。

第 1 队无法在所列的这两个时间段之间进行比赛,因此他们只能在上午 10:00 到下午 5:00 之间进行比赛。我们存储排除项。

第 2 队可以打 8:00 AN -12:00 PM。

意思是 Team 1 和 Team 2 可以在 10-12 之间进行比赛。有没有好办法在代码中计算出来?

第 1 队

List<Restriction>
     Restriction
          StartTime: 8:00 AM
          EndTime: 10:00 AM
     Restriction
          StartTime: 5:00 PM
          EndTime: 9:00 PM

第 2 队

List<Restriction>
     Restriction
          StartTime: 12:00 PM
          EndTime: 9:00 PM

【问题讨论】:

  • 对不起,我对时间表示法感到困惑。
  • 只是在这里大声输入,但我认为您可以将一天中的所有时间转换为字节数组中的位,其中可播放时间为 1,然后在团队之间进行 AND 操作。最重要的是他们可以互相比赛。
  • 如果您将您的时间转换为他们可以玩的时间(即使是暂时的),然后将其转换为可用时间的集合,它会变成一个交叉点而不是反向交叉点。
  • 我喜欢位比较的想法,但如果你能精确到分钟呢。

标签: c# algorithm intersection intercept computation


【解决方案1】:

创建一个包含所有开始时间和结束时间的数组,包括 +1 或 -1,具体取决于每个时间是开始时间还是结束时间。

对于您的设定时间,这将为您提供:

[(08:00, +1), (10:00, -1), (17:00, +1), (21:00, -1), (12:00, +1), (21:00, -1)]

对它们进行排序:

[(08:00, +1), (10:00, -1), (12:00, +1), (17:00, +1), (21:00, -1), (21:00, -1)]

对正负 1 求和:

[(08:00, 1), (10:00, 0), (12:00, 1), (17:00, 2), (21:00, 1), (21:00, 0)]

运行总和是当时开始忙的团队数(0、1 或 2)。所以现在标记为 0 的时间是两支球队都空闲的开始时间(这里是 10:00 和 21:00)。数组中的下一次是空闲期的结束。这给出了两队空闲的时间段,包括开始和结束的时间段是(-infinity 到 08:00)、(10:00 到 12:00)和(21:00 到 +infinity)。

【讨论】:

  • 有趣。我会试试这个。看起来正是我需要的,如果那样的话,我也不会想到。你是怎么想到的?
  • 你将如何处理上午 10 点到下午 3 点和 12 点到 9 点的两个团队?我需要包含无穷大 -10 吗?
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2011-12-18
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多