2011-01-17 20 views
1

整数の開始時刻と終了時刻を持つ2つのイベントE1 =(s1、e1)、E2 =(s2、e2)を指定すると、イベントが重複していないかどうかを確認するブール・ブール・チェックを実装します。範囲がオーバーラップしているかどうかを確認

私は解決策を持っていますが、私は他の人たちが何を思いつくのか興味があります。

EDIT:OK、ここに私のソリューションです:

e1 > s2 || (s1 > s2 && e2 < s1) 
+7

「私は解決策があります」 - そうです。これは、有名なFizzBu​​zzの問題のようなものです。 –

+0

学校の質問ですか?なぜあなたは答えを知っているか尋ねます。それを知っているほとんどのpplはあなたに答えるつもりはありません。 – Elalfer

+0

私の解決策を掲載しました... – jasonbogd

答えて

15

bool overlap = (s1 <= e2) && (s2 <= e1)

+0

真。 (15文字) – orlp

+0

両方の比較で '<='にする必要があります。 –

+0

@Sven:あなたが正しいと思います。 –

5

彼らが重なる場合:(両方のエンドポイントを含む)s2との間e2OR

  • e2(までの間の

    • e1両方のエンドポイントの)s1およびe1
  • +0

    素敵なダニエル! – jasonbogd

    0
    /* return true if intervals overlap */ 
    bool overlap(unsigned int s1, unsigned int e1, unsigned int s2, unsigned int e2) { 
        return (s1 >= s2 && s1 <= e2) || 
          (e1 >= s2 && e1 <= e2) || 
          (s2 >= s1 && s2 <= e1) || 
          (e2 >= s1 && e2 <= e1); 
    } 
    
    +0

    これは、最も効率的なソリューションのどこにもありません。私の答えを見てください。 – orlp

    0
    (s2 < s1 && s1 < e2) || (s1 < s2 && s2 < e1) 
    

    または、同等:

    (s2 < s1 && s1 < e2) || (s2 < e1 && e1 < e2) 
    
    2

    私はこのようにそれを行うだろう:

    return s1 < s2 ? s2 <= e1 : s1 <= e2; 
    
    +1

    他のいくつかのソリューションとは異なり、これはコンパイラが最初のブランチを最適化することを許可しません。 – finnw

    +0

    @finnw:これは、ショートカッティングブール演算子(||または&&)を使用するソリューションと同じ数のブランチで実際にコンパイルされますが、これらの演算子(|または&実際には分岐が少なくなります。しかし、Fred Larsonsの新しい提案は、場合によってはより短いコードパスを持つことができるため、&&の代わりに&が使用されると、分岐が少なくなるように変更できるため、新しい提案は私よりも効果的です。 – x4u

    +0

    これは私が念頭に置いていた最適化の一種です:http://www-graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax – finnw

    4

    は、これも動作します。

    max(s1, s2) < min(e1, e2) 
    
    +0

    スリック。私はこれが一番好きです。 – rlotun

    8

    フレッドの答えは簡潔で正確です。

    私が好む:

    bool overlap = !(e1 < s2 || e2 < s1); 
    

    私はこれが明確だと思うが、それは非常に小さな違いです。

    は英語に変換:

    どちらも、他の開始前に終了していないなら、彼らが重なります。


    これは、重複した長方形の問題に似ています。このテストを書くには2つの方法があります。

    両方の左端が他の右端の左端にあり、上端がもう一方の下端よりも上にある場合、2つの長方形が重なります。


    2つの矩形は場合もある左または他の上に重なります。

    +1

    +1 - きれいに書かれています。 – duffymo

    0

    あなたはそれが重複している::(S2> E1)のため

    条件を重複しないであろうケースで確認することができます|| (e2> s1) となるようにオーバーラップする。((s2> e1)||(e2> s1))

    1

    (S2-S1)<(e1-s1)|| (S1-S2)<(e2-s2)

    +2

    これがなぜ機能するのか説明できますか?私のような賢い人があなたから学ぶのを助けます! –

    関連する問題