配列またはNペア(v1, v2)
がありv1 <= v2
ます。これらは、で開始v1
および終了する時間内のイベントを表すことになっていますv2
。それらは等しくなる可能性があり、その場合、イベントは瞬時に発生します。配列は開始時刻でソートされv1
ます。
与えられた範囲について(L, R)
、私は任意のペアを見つけたいと思いますL <= v1 <= R or L <= v2 <= R
。ここでの考え方は、指定された範囲でイベントを開始、発生、または終了させることです。
私の主な問題は効率です。配列には、数十万のイベントが含まれる可能性があります。したがって、すべてのペアを通過する線形検索だけはオプションではありません。
kd-treeについて少し読みましたが、問題は、範囲の境界が除外され、が返されるだけであるということL <= v1 <= R AND L <= v2 <= R
です。つまり、範囲内で実際に発生するイベント(開始と終了)のみが返されますが、開始または終了(または明らかに両方)が必要です。
2つのルックアップテーブルを保持することも考えました(時間にdoubleを使用します)
std::map<double, Event*> startPoints;
std::map<double, Event*> endPoints;
std::find
両方でアルゴリズムを使用して、結果をマージします。
アドバイスを探すだけで、それが良い解決策であるかどうか、またはもっと賢い方法があるかどうか。
編集:
それについて考え直すと、もっと複雑になります。これが期待される結果の例です
|---Ev1---| |---Ev3---| |---Ev5---|
|---Ev2---| |---Ev4---|
| |
L R
ここでは、Ev2(範囲内で終了)、Ev3(範囲内で発生)、Ev4(怒りで開始)を取得したいと思います。
|---Ev1---| |---Ev3---| |---Ev5---|
|---Ev2---| |---Ev4---|
| |
L R
ここでは、現在範囲内で実行されているEv3と、範囲内で開始されているEv4を取得したいと思います。
|---Ev1---| |---Ev3---| |---Ev5---|
|---Ev2---| |---Ev4---|
|
LR
現在実行されているのはEv2だけなので、ここではEv2のみが必要です。
指定された範囲で開始、発生、または終了する3つのケースを処理する必要があるため、3つの部分に分割できます。
v1
あります[L,R]
。v2
あります[L,R]
。3番目のケースはとして定式化できますv1 <= R and L <= v2
が、最初の2つのケースはこのケースを部分的にカバーしているため、衝突を回避するために異なる定式化を使用します。
v1 < L and R < v2
イベントの配列をで並べ替えることができれば、対数と報告されたイベントの数の時間で最初のケースを処理するのは簡単v1
です。同じトリックが2番目のケースでも機能します。
3番目のケースはトリッキーです。描きましょう:
ピンクの領域はすべての間隔を表しますL <= R
。赤い点は間隔であり、緑がかった領域は、キャプチャしたいすべての可能なイベントを表しています。このようなキャプチャを行うには、k2-treeを使用できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加