计算包含范围的两个列表之间的交集/截距

时间:2014-09-27 00:34:54

标签: c# algorithm intersection intercept computation

我正在尝试找到相反的交叉点,看看两个团队是否可以互相玩耍,但很难找到准确的代码来完成它。

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

第1组无法在列出的两次之间进行比赛,因此他们只能在上午10:00至下午5:00之间进行比赛。我们存储了排除。

第2组可以在AN-12:00 PM 8:00播放。

意味着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 个答案:

答案 0 :(得分: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到+无穷大)。 / p>