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
ただし、これには別の問題があります。開始と終了が同じイベントが 5,000 ある場合、5,001 イベントのスロットを見つけるために、前の 5,000 レーンなどをチェックすることになり、パフォーマンスが低下します。
イベントを効率的に保存、クエリする方法に関する提案はありますか? それらをWebページにレンダリングする必要があります。イベント全体をパンするための水平および垂直スクロールがあります。垂直スクロールの場合、サーバーに伝えます-これらは必要なレーンです(レーン5からレーン10など)。水平スクロールの場合、基本的に新しい一連のイベントである、必要な新しい時間ウィンドウとレーンを使用して新しいクエリを作成します。
私の問題は垂直スクロールです。すべてのイベントを正しいレーンに効率的にスロットする必要があります。それを効率的に行うことができれば、レーン 26 ~ 30 のイベントについてサーバーに問い合わせることができます。どんな提案にも感謝します。