目前,它通过查找列表中的“最长”事件((endTime-startTime)* numDays),并将其与每个重叠的课程添加到子列表中来实现。然后它会找到所有“冲突”(不重叠的事件)并解决它们,同时删除尽可能少的课程。我有这么多,但由于我必须处理的范围数量,我最终得到了相当多的子列表。有没有更好的方法来拆分列表,这样我最终会有更少的子列表?
我考虑过一种蛮力方法,只是尝试各种可能性并且最好地进行,但是范围的数量足够高(平均值在100-500之间),这样做可能会相当慢。任何建议或指示都将非常受欢迎。
感谢您的时间,
蒂莫西·萨索(Timothy Sassone)答案 0 :(得分:0)
用于.NET的时间段库 http://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