Algorithm 如何测试整数范围是否与整数列表重叠?

Algorithm 如何测试整数范围是否与整数列表重叠?,algorithm,data-structures,range,intervals,Algorithm,Data Structures,Range,Intervals,例如: 我们有一份清单: 1 2 3 7 8 9 11 12 我们需要检查范围(a,B)是否与列表重叠,例如范围(4,6)与列表不重叠,范围(10,12)和范围(5,9)与列表重叠。 我知道我们可以把列表放在一个hashSet中,然后我们只需检查范围中是否有任何元素出现在该集中。这要花费O(N)。N是范围的长度。有没有更好的算法来解决这个问题?我知道有一个区间树数据结构,但我不太理解它。这种结构能在logN中解决这个问题吗?似乎列表已排序;如果还没有,那么先对其进行排序 让R=(开始,结束)成

例如: 我们有一份清单:

1 2 3 7 8 9 11 12
我们需要检查范围(a,B)是否与列表重叠,例如范围(4,6)与列表不重叠,范围(10,12)和范围(5,9)与列表重叠。
我知道我们可以把列表放在一个hashSet中,然后我们只需检查范围中是否有任何元素出现在该集中。这要花费O(N)。N是范围的长度。有没有更好的算法来解决这个问题?我知道有一个区间树数据结构,但我不太理解它。这种结构能在logN中解决这个问题吗?

似乎列表已排序;如果还没有,那么先对其进行排序

R=(开始,结束)
成为我们想要检查的范围,看看它是否重叠

我们可以对排序列表中的
start
end
位置进行二进制搜索:

  • 如果列表上连续出现
    start
    end
    ,则它们不会重叠
e、 g

1 2 34 67 8 9 11 12

  • 否则,列表中有一个元素在它们之间,因此范围重叠
瞧:

123789101112


这是
O(log N)
,其中
N
是列表中的元素数。

如果对列表进行排序,您可以找到将在列表中放置范围内最小元素的位置,以及将在列表中放置范围内最大元素的位置。这需要2 lg(n)的时间。如果这些索引不同,则范围与列表相交。否则,我不知道。

如果列表未排序:


O(M),其中M是列表中项目的#,是通过列表迭代检查每个项目是否低。显然,如果列表未排序,则任何为范围查询构造特殊结构的算法将采用O(n)。对列表进行排序需要O(n log n)

使用一个集合(实现为一个平衡的二叉树),通过插入范围的下限(或上限),并检查下一个(或上一个)元素(数据结构必须支持该操作,在二叉树上很简单),将在O(log2n)中显示结果

一个非常有效的范围查询结构是,它允许您在O(logbn+k)中查找范围,其中b是树的秩(即每个节点的子节点数)。注意,这还将返回范围内的元素列表(例如,作为树数据集上的两个迭代器)


另一个有趣的结构是树,它在O(logn)中插入元素。使用与上述集合相同的技巧,我们可以找到具有相同时间复杂度的答案。另请参见X fast trie和Y fast trie。

我知道您只想知道数组中是否有A或B。您不需要使用排序,因为您只需执行两个步骤:

1- search that is there A or B in your array.(you can do it in O(n))
2- find minimum and maximum.(you can do it in o(n)).

你们可以在o(n)内完成,也可以在小于o(n)的时间内完成,我在这篇文章中对同样的问题进行了检验

你能解释一下重叠的确切含义吗?(A,B)是否为开放区间(即不包含A和B)?为什么(5,9)重叠?这是假设范围是开放的,并且我们可以随机访问列表中的元素,对吗?如果范围是封闭的,想法是相似的。“数组”比“列表”更合适。