2011-03-04 73 views
1

我的名字是Timothy Sassone。我正在开发一些C#中的排序软件,但遇到了一些麻烦。该计划的最后一部分旨在获取每周事件的大量列表(存储为一周中的某天和开始和结束时间),并将其分类到包含与另一个事件重叠的事件的子列表中(使得没有人可能参加子列表中的两个事件)。生成重叠范围的子阵列

目前,它通过查找列表中的“最长”事件((endTime-startTime)* numDays)并将其与每个与其重叠的课程添加到子列表中来完成此操作。然后找到所有“冲突”(不重叠的事件)并解决它们,同时删除最少数量的课程。我有这么多,但是由于需要处理的范围很多,我最终得到了很多子列表。有没有更好的方法来分割列表,这样我的子列表就更少了?

我已经考虑过一种蛮力方法,只是尝试一切可能性并尽力而为,但范围数足够高(平均在100-500之间),这样做可能会相当缓慢。任何建议或指针将不胜感激。

谢谢您的时间,

蒂莫西·撒森

+0

我不认为我得到它。如果event1与event2重叠且event2与event3重叠,它们是否应该全部进入相同的子列表中,即使event1可能不与event3重叠? – Jan 2011-03-06 14:48:05

+0

不可以。我们的目标是让列表形成,使任何人都无法参加任何给定列表中的两个事件。如果event1与event2和event3重叠,但event2和event3不重叠,则可以同时参加event2和event3。我将根据这些清单安排其他活动,如果涉及的两个每周活动也重叠,则新活动的时间只能重叠(从而防止任何人同时参与)。 谢谢你的时间! – 2011-03-06 16:50:20

回答

0

时间段库.NEThttp://www.codeproject.com/KB/datetime/TimePeriod.aspx包括TimePeriodIntersector搜索重叠的时间段。

通过对时间线上的所有时刻进行计数/排序,使用线性快速算法计算重叠。

而且TimePeriodIntersector的用法是这样的:

// ---------------------------------------------------------------------- 
public void TimePeriodCombinerSample() 
{ 
    TimePeriodCollection periods = new TimePeriodCollection(); 

    periods.Add(new TimeRange(new DateTime(2011, 3, 01), new DateTime(2011, 3, 10))); 
    periods.Add(new TimeRange(new DateTime(2011, 3, 04), new DateTime(2011, 3, 08))); 

    periods.Add(new TimeRange(new DateTime(2011, 3, 15), new DateTime(2011, 3, 18))); 
    periods.Add(new TimeRange(new DateTime(2011, 3, 18), new DateTime(2011, 3, 22))); 
    periods.Add(new TimeRange(new DateTime(2011, 3, 20), new DateTime(2011, 3, 24))); 

    periods.Add(new TimeRange(new DateTime(2011, 3, 26), new DateTime(2011, 3, 30))); 

    TimePeriodCombiner<TimeRange> periodCombiner = new TimePeriodCombiner<TimeRange>(); 
    ITimePeriodCollection combinedPeriods = periodCombiner.CombinePeriods(periods); 

    foreach (ITimePeriod combinedPeriod in combinedPeriods) 
    { 
    Console.WriteLine("Combined Period: " + combinedPeriod); 
    } 
    // > Combined Period: 01.03.2011 - 10.03.2011 | 9.00:00 
    // > Combined Period: 15.03.2011 - 24.03.2011 | 9.00:00 
    // > Combined Period: 26.03.2011 - 30.03.2011 | 4.00:00 
} // TimePeriodCombinerSample