Algorithm 您有一组N个范围,是否可以在O(N)中找到交叉点是否为空?

Algorithm 您有一组N个范围,是否可以在O(N)中找到交叉点是否为空?,algorithm,range,Algorithm,Range,我有一组N个范围,其中每个范围的形式为[a,b],并且a,b都是整数 我想知道他们的十字路口是否是空的 如果不对该集合进行任何假设,是否可以在O(n)时间内执行某些操作?尝试查看下限的最大值是否大于上限的最小值。如果第一个大于第二个,则交叉点必须为空。(如果这不明显,我将尝试寻找或构造一个证明。)如果不明显,请检查生成的间隔[max,min]是否包含您选择的元素(您没有提到您是否在整数或实数中寻找间隔,或者什么) 列表的最大值和最小值都可以在线性时间内找到,所以这将在O(N)时间内执行 1对于典

我有一组N个范围,其中每个范围的形式为
[a,b]
,并且
a
b
都是整数

我想知道他们的十字路口是否是空的


如果不对该集合进行任何假设,是否可以在O(n)时间内执行某些操作?

尝试查看下限的最大值是否大于上限的最小值。如果第一个大于第二个,则交叉点必须为空。(如果这不明显,我将尝试寻找或构造一个证明。)如果不明显,请检查生成的间隔
[max,min]
是否包含您选择的元素(您没有提到您是否在整数或实数中寻找间隔,或者什么)

列表的最大值和最小值都可以在线性时间内找到,所以这将在O(N)时间内执行


1对于典型类型的集合,例如实数或整数,此检查应为O(1)。

尝试查看下限的最大值是否大于上限的最小值。如果第一个大于第二个,则交集必须为空。(如果这不明显,我将尝试查找或构造证明。)如果没有,请检查生成的间隔
[max,min]
是否包含您选择的元素(您没有提到您是在整数、实数还是什么中寻找间隔)

列表的最大值和最小值都可以在线性时间内找到,所以这将在O(N)时间内执行


1对于典型类型的集合,比如实数或整数,这种检查应该是O(1)。

对于N个范围,通常的问题是确定它们是否成对不相交(即
O(N log N)
),但这里我想你问的是所有范围的交集是否为空。这可以在
O(N)中解决
显而易见:

  • R
    设置为第一个范围
    R1
  • 对于每个后续范围
    Ri
    ,将
    R
    设置为自身与
    Ri
  • 最后,
    R
    将是交叉口。检查它是否为空
  • 这在
    O(N)
    中起作用取决于两个事实:

  • 您可以在
    O(1)
    中相交两个范围
  • 两个范围的交点要么为空,要么为一个范围

  • 这两种情况都是由于两个范围的交集
    [low1,high1]
    [low2,high2]
    [max(low1,low2),min(high1,high2)]
    N个范围的常见问题是确定它们是否成对不相交(即
    O(N log N)
    )但这里我想你是在问所有范围的交集是否为空。这可以在
    O(N)
    中很明显地解决:

  • R
    设置为第一个范围
    R1
  • 对于每个后续范围
    Ri
    ,将
    R
    设置为自身与
    Ri
  • 最后,
    R
    将是交叉口。检查它是否为空
  • 这在
    O(N)
    中起作用取决于两个事实:

  • 您可以在
    O(1)
    中相交两个范围
  • 两个范围的交点要么为空,要么为一个范围

  • 这两种情况都直接与以下事实不符:两个范围的交点
    [low1,high1]
    [low2,high2]
    [max(low1,low2),min(high1,high2)]
    A1∩ A2∩ ..., ∩ An=((A1)∩ A2)∩ A3)∩ .... ∩ (安)


    当你遇到一个空集合时,你停止相交。每对取
    O(1)

    A1∩ A2∩ ..., ∩ An=((A1)∩ A2)∩ A3)∩ .... ∩ (安)


    当你遇到一个空集时,你停止相交。每一对取范围内的
    O(1)

    数字,除了a和b也是整数?整数对于简单来说,你可以在O(1)时间内找到两个范围的交集,因此N个范围在O(N)时间内的交集时间应该很简单。还是我遗漏了什么?@SimeonVisser,如果A和B不相交,那么算法就结束了。你打印“所有这些范围的交集都是空的”并终止函数。不需要与C进行比较。@rici,如果你指的是我的“两个范围的交集是O(1)”注释,我不会试图“修复N”。该逻辑适用于任意N。当N为2时,需要一个交点。当N为100时,需要99个交点。因此,它是O(N)。除了a和b之外,范围内的数字也是整数?简单来说,整数可以在O(1)时间内找到两个范围的交点,因此N个范围在O(N)时间内的交点时间应该很简单。还是我遗漏了什么?@SimeonVisser,如果A和B不相交,那么算法就结束了。你打印“所有这些范围的交集都是空的”并终止函数。不需要与C进行比较。@rici,如果你指的是我的“两个范围的交集是O(1)”注释,我不会试图“修复N”这个逻辑适用于任何N。当N为2时,你需要一个交点。当N为100时,你需要99个交点。因此,它是O(N)。这和rici的答案有什么区别?@chepner我现在明白了。我的答案只有一行。这和rici的答案有什么区别?@chepner我现在明白了。我的答案只有一行
    import numpy as np
    ranges = np.array([[1, 5], [2, 3], [-1, 17], [15, 15]])
    
    max = np.max(ranges[:,0])
    min = np.min(ranges[:,1])
    
    if max > min:
        print "definitely empty"
    else:
        print "gotta check, but we've got the intersection now. it's [{0}:{1}]".format(max, min)