【问题标题】:Determine if ranges overlap确定范围是否重叠
【发布时间】:2011-06-10 17:17:08
【问题描述】:

给定两个具有整数开始和结束时间的事件,E1 = (s1, e1), E2 = (s2, e2),实现快速布尔检查以查看事件是否重叠。

我有解决方案,但我很想看看其他人想出什么。

编辑:好的,这是我的解决方案:

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

【问题讨论】:

  • “我有解决方案”——是的,没错。这听起来像是著名的 FizzBu​​zz 问题的对应物。
  • 这是学校的问题吗?为什么要问你是否知道答案。大多数知道它的人都不会回答你。
  • 写你的解决方案:e1 &gt; s2 不正确,如果s1 &gt; s2 也是。

标签: java c math boolean


【解决方案1】:

如果出现以下情况,它们会重叠:

  • e1s2e2 之间(包括两个端点)
  • e2 在(包括两个端点)s1e1 之间

【讨论】:

    【解决方案2】:
    /* 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);
    }
    

    【讨论】:

    • 这远不是最有效的解决方案。看我的回答。
    【解决方案3】:

    bool overlap = (s1 &lt;= e2) &amp;&amp; (s2 &lt;= e1)

    【讨论】:

    • 在两个比较中都应该是&lt;=
    • @Fred:经过更正后,这显然是最简单、最有效的答案。令人惊讶的是有多少人没有做对——这似乎真的是某种FizzBuzz
    • 这对于两个完全相邻但不重叠的事件返回 true。
    • @caf:如果您不认为重叠,您可以将“
    • 我终于知道我之前在哪里解决了这个问题。我正在编写代码来确定两架飞机是否有冲突的高度。由于可以为飞机分配块高度,因此每个高度都可以是一个范围。任何范围重叠都是冲突。
    【解决方案4】:
    (s2 < s1 && s1 < e2) || (s1 < s2 && s2 < e1)
    

    或者,等效地:

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

    【讨论】:

      【解决方案5】:

      我会这样做:

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

      【讨论】:

      • 与其他一些解决方案不同,这个解决方案不允许编译器优化第一个分支。
      • @finnw:这实际上编译时使用的分支数量与使用快捷布尔运算符(|| 或 &&)的解决方案相同,尽管这些可以更改为使用非排序切割版本这些运算符(| 或 &)确实会导致更少的分支。但我同意,即 Fred Larsons 的新建议比我的更有效,因为它在某些情况下可以具有更短的代码路径,或者如果使用 & 而不是 &&,则可以修改为具有更少的分支。
      • 这是我想到的优化:www-graphics.stanford.edu/~seander/…
      【解决方案6】:

      这也可以:

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

      【讨论】:

      • 光滑。我最喜欢这个。
      【解决方案7】:

      弗雷德的回答既简洁又正确。

      我更喜欢:

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

      我认为这更清楚,但差异很小。

      转换成英文:

      如果两个都没有在另一个开始之前结束,它们就会重叠。


      这类似于重叠矩形问题。有两种编写该测试的好方法。它们对应于语句:

      如果两个矩形的左边缘在另一个的右边缘的左侧,并且两个矩形的上边缘在另一个的下边缘之上,则两个矩形重叠。


      如果两个矩形都不在另一个矩形的左侧或上方,则两个矩形会重叠。

      【讨论】:

        【解决方案8】:

        你可以检查在哪些情况下不会重叠

        不重叠的条件是 :: (s2 > e1 ) || (e2 > s1) 所以重叠是 !((s2 > e1 ) || (e2 > s1))

        【讨论】:

          【解决方案9】:

          (S2-S1)

          【讨论】:

          • 您有没有机会解释一下为什么会这样?帮助像我这样不聪明的人向你学习!
          猜你喜欢
          • 2017-06-28
          • 2016-02-14
          • 2015-10-15
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          • 2010-12-29
          • 1970-01-01
          • 2011-09-11
          相关资源
          最近更新 更多