3

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 のイベントについてサーバーに問い合わせることができます。どんな提案にも感謝します。

4

3 に答える 3