我正在尝试将 10000 个事件安排到不同的通道中。每个事件都有开始和结束日期。任何事件都不能在通道中重叠。
======================================================================
Lane 1 [Event1] [Event4 ] [Event7 ]
======================================================================
======================================================================
Lane 2 [Event2] [Event 5] [Event 8]
======================================================================
======================================================================
Lane 3 [Event3 ] [Event6]
======================================================================
========time along x axis >>>>>>>>>>>>>>>>>>>>>>>>>>
所以我的问题是有效地为活动确定合适的车道。我从数据库中获取按开始时间排序的事件。我采取的第一种方法是为每个车道设置一个 last_end_time。对于每个新事件,我都会检查每个车道,如果事件的 start_time 早于车道的 last_end_time,我会向下移动并检查下一个车道。如果我找不到适合它的通道,我会创建一个新通道。
class LaneManager
def initialize
@lanes = []
end
# Find the free lane given start and end of an event
def nextFreeLane start_date, end_date
@lanes.each_with_index do |lane, index|
if start_date > lane.last_date
lane.last_date = end_date
return index
end
end
lane = Lane.new
lane.last_date = end_date
@lanes << lane
@lanes.length - 1
end
end
class Lane
attr_accessor :last_date
end
然而,这存在另一个问题。如果我有 5000 个具有相同开始和结束的事件,那么要为 5001 事件找到一个插槽,我最终会检查之前的 5000 个通道,依此类推......性能只会下降。
有关如何有效存储、查询事件的任何建议?我需要在网页上呈现它们。我有水平和垂直滚动来平移事件。对于垂直滚动,我告诉我的服务器 - 这些是我需要的通道(比如通道 5 到通道 10)。对于水平滚动,我只需使用新的时间窗口和所需的通道进行新查询,这基本上是一组新的事件。
我的问题是垂直滚动,我需要有效地将所有事件插入正确的通道。如果我能有效地做到这一点,那么我可以在我的服务器上查询 26-30 车道中的事件。将不胜感激任何建议。