重複の可能性:
2 つの日付範囲が重複しているかどうかを判断する
2 つのオブジェクトがあり、これらの各オブジェクトの日付範囲が終了日と開始日の間にあるとします。最も効率的または迅速な方法で、2 つの日付範囲の間に重複があるかどうかを確認するにはどうすればよいですか。
.NET 3.5 c# を使用してこれを行いたい
重複の可能性:
2 つの日付範囲が重複しているかどうかを判断する
2 つのオブジェクトがあり、これらの各オブジェクトの日付範囲が終了日と開始日の間にあるとします。最も効率的または迅速な方法で、2 つの日付範囲の間に重複があるかどうかを確認するにはどうすればよいですか。
.NET 3.5 c# を使用してこれを行いたい
これが最も効率的か最速かはわかりませんが、これが私のやり方です。それがボトルネックであることが判明した場合は、そのときだけ、さらに最適化を検討します。
必要に応じて範囲を交換することで、最初の範囲がより早く (または同時に) 開始されるようにします。
次に、他の範囲の開始が最初の範囲の終了 (範囲が開始時刻と終了時刻の両方を含む場合) 以下の場合、または範囲が開始時刻を含み終了時刻を含まない場合、重複を検出できます。 .
両端が包括的であると仮定すると、重複しない可能性は 4 つだけです。
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
範囲 2 のエンドポイントは入りません。したがって、疑似コードでは次のようになります。
def doesOverlap (r1,r2):
if r1.s > r2.s:
swap r1, r2
if r2.s > r1.e:
return false
return true
範囲が開始時に包括的で終了時に排他的である場合は、2 番目のステートメントを>
次のように置き換えるだけです。>=
if
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
|---> range 2 no overlap
範囲 1 が範囲 2 の後に開始されないようにすることで、問題領域の半分を早期に削除するため、実行する必要があるチェックの数を大幅に制限できます。
2 番目のオブジェクトの Startdate または Enddate が最初のオブジェクトの範囲内にあるかどうかを確認します。
bool overlap = (y.Start > x.Start && y.Start < x.End) || (y.End > x.Start && y.End < x.End);