1

2 つの日付の間のどこかが他の 2 つの日付の間のどこかで交差しているかどうかをチェックする効率的な方法は何ですか?

4

4 に答える 4

1

あなたの問題はこのように言い換えることができます。

2つの日付c1とc2のいずれかが2つの日付d1とd2の間にあるかどうかを確認します。

// assuming d1 is before d2
BOOL intersects = 
   ([d1 compare:c1] == NSOrderedAscending  &&
    [d2 compare:c1] == NSOrderedDescending)
    ||
   ([d1 compare:c2] == NSOrderedAscending &&
    [d2 compare:c2] == NSOrderedDescending)
    || [d1 compare:c1] == NSOrderedEqual
    || [d1 compare:c2] == NSOrderedEqual
    || [d2 compare:c1] == NSOrderedEqual
    || [d2 compare:c2] == NSOrderedEqual;

編集:あるいは、

NSTimeInterval i = [d2 timeIntervalSinceDate:d1];
NSTimeInterval c1i = [c1 timeIntervalSinceDate:d1];
NSTimeInterval c2i = [c2 timeIntervalSinceDate:d1];
BOOL intersects = (c1i >= 0 && c1i <= i) || (c2i >= 0 && c2i <= i); 
于 2012-10-26T10:12:32.780 に答える
1

2つの間隔[a, b]で、[c, d]空でない交差点がある場合

a <= d && c <= b

したがって、あなたはチェックすることができます

[a compare:d] <= 0 && [c compare:b] <= 0

間隔に共通の値があるかどうかを確認します。

(ここでは、間隔が順序付けられていると仮定しました。つまり、それとですa <= bc <= d

于 2012-10-26T10:52:21.610 に答える
1

2 つの日付の間のどこかが他の 2 つの日付の間のどこかで交差しているかどうかをチェックする効率的な方法は何ですか?

あなたはそれを別の方法で行います。最初の間隔が 2 番目の間隔と交差しないのはいつですか?

  • End1 < Start2 の場合 (最初のインターバルが 2 番目のインターバルの開始前に終了する)
  • Start1 > End2 の場合 (2 番目の間隔が終了した後に最初の間隔が開始されます)。

あなたが望んでいるのは

 End1 < Start2 OR Start1 > End2  // Condition of non-intersection

偽である:つまり、あなたが欲しい

 End1 >= Start2 AND Start1 <= End2   // Negation of above

真であります。

于 2012-10-26T11:01:27.497 に答える
1

あなたが持っているとしましょう: timetと interval [a-b] [c-d]、それらが次のようにソートされている場合:

  • a < 日
  • a < b
  • c<d

次に、tが b と c 内にあるかどうかをチェックし、b > c であるかどうかをチェックすると、すべてが true になり、そうでない場合は no になります。そして、簡単な見方として、それらがソートされていないかどうかを完全にチェックするよりも優れたものをまだ考え出すことができません。

于 2012-10-26T10:08:36.947 に答える