【发布时间】:2018-03-28 10:54:07
【问题描述】:
假设我在类似于 Outlook 的 24 小时日历上使用 (StartTime,EndTime) 绘制事件。我的目标是检测重叠(冲突)并将它们拆分,使每列占据窗口宽度的 N%,其中 N = 该时间范围内的冲突总数。
我的问题是,我的算法
1) first, sort all events by StartTime
2) LOOP: looks at neighbors: CurrentEvent and NextEvent (n+1):
if NextEvent exists {
if (CurrentEvent EndTime > NextEvent StartTime) { // CONFLICT!
overlappingMode = true;
overlappingEvents.add(currentEvent); // Add to array
}
else { // NO CONFLICT
if (overlappingMode is TRUE) {
// Resolve Now
redrawOverlappingEvents(overlappingEvents);
// Reset
overlappingMode = false;
EMPTY overlappingEvents;
}
}
}
3) After the loop, also for the last element,
if (Overlap Mode is still TRUE) {
overlappingEvents.add(currentEvent); // Add to array also
// Now Resolve
redrawOverlappingEvents(overlappingStartTimes);
// Reset
overlappingMode = false;
EMPTY overlappingEvents;
}
这在大多数情况下都有效,但会给 EndTimes 带来某种问题。例如,考虑下图:
最后一个事件应该是 Split-Group of 4(不是 3 个)的一部分。它没有被包含在冲突拆分中,因为之前的事件的EndTime 与它的StartTime 不冲突。
在 StartTimes 的 Sorted 数组中,倒数第二个事件的 EndTime (4:30) 与最后一个事件的 StartTime (4:45) 不冲突。所以最后一个事件4:45 - 6:00 没有被包含在整个拆分组中。我应该为跨越 02:30 - 06:00 的时间区域获得一个 4 列拆分布局。
我的算法是正确的还是有更好的方法?
【问题讨论】:
标签: algorithm sorting recursion