【问题标题】:Fastest way to check if ranges only intersect, but not subsume [duplicate]检查范围是否仅相交但不包含的最快方法[重复]
【发布时间】:2022-11-05 18:59:17
【问题描述】:

假设我有两个范围 (x1,x2) 和 (z1,z2)。检查它们是否相交的最快方法是什么?

 if 
 #case: (2,4), (3,6)
 x1 > z1 < x2 and (z2 < x1 or z2 > x2)
 or
 #case: (2,4) , (1,3)
 x1 > z2 < x2 and (z1 < x1 or z1 > x2)
 or
 #case: (3,6), (2,4)
 ............. reverse(1) x <--> z
 or
 #case: (1,3), (2,4)
 ............. reverse(2) x <--> z

顺便说一句,在另一个范围内包含一个范围是可以的,例如

 (2,5) , (3,4)
 (2,5) , (3,5)
 (2,5) , (2,4)

(这使问题不再重复。此外,条件是 <,> 而不是 >=,<=。还有一个我希望输入范围也是无序的,例如 (x2,x1),(z2,z1) ; (z1,z2),(x1,x2) )

但是,例如,这不算作交集:

 (2,5), (2,5)

什么是更少检查的更快方法?

到目前为止,我有:

def olap(x1,x2,z1,z2):

if x1 > x2 : x1,x2 = x2,x1
if z1 > z2 : z1,z2 = z2,z1
if x1 > z1 : z1,z2,x1,x2 = x1,x2,z1,z2

return x1 < z2 and z1 < x2 < z2

【问题讨论】:

  • 在我看来 - 使用 python 范围和集合操作。 Fox 示例: r1 = set(range(x1,x2)) r2 = set(range(z1,z2)) # 使用集合交集运算符...
  • 更大的范围会很慢
  • @DanielAgam IMO,这是一个糟糕的建议。它将以极其繁琐的方式解决一个简单的数学问题。
  • @DanielHao 必须阅读讨论...谢谢

标签: python range intersection


【解决方案1】:

最简单的检查是验证相交区间的属性:最左边的端点(更小)都不能高于最右边的端点(更高)。

 x1        x2
a ------------              if x1 > y2: a would be to the right of b            
       b ----------------   if y1 > x2: b would be to the right of a
           y1           y2
def overlap(x1, x2, y1, y2):
    """ Overlap means neither of the intervals 
        is "to the right or left" of the other.
    """
    return x1 <= y2 and y1 <= x2

【讨论】:

  • 我明白了.. 我必须提前订购范围,即 (4,2) => (2,4)
  • @sten 不是“订单”,只是获取最小值和最大值(假设有 >2 个元素)。实现应该取决于您的用例:如果您不检查所有内容是否重叠,那么您可能不想预处理所有间隔并在函数内动态执行。话虽如此,如果它是任意顺序的,我不知道“间隔”表示有多好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多