Algorithm 给定了一组区间S。必须以最小时间复杂度找到S中包含在给定区间(a,b)中的所有区间
您将获得一组间隔Algorithm 给定了一组区间S。必须以最小时间复杂度找到S中包含在给定区间(a,b)中的所有区间,algorithm,search,data-structures,tree,intervals,Algorithm,Search,Data Structures,Tree,Intervals,您将获得一组间隔S。您必须在S中找到包含在给定时间间隔(a,b)中的所有时间间隔,时间复杂度最低。 这可以通过蛮力在O(n)时间内完成,其中n是集合S中的间隔数。但是,如果允许我做一些预处理,这可以在O(n)时间内完成吗,例如O(logn)时间 最初我是在考虑,但我认为它不适用于这里,因为区间树用于获取与给定区间重叠的所有区间 预处理: 创建空的持久化树。它应该存储按结束点排序的间隔 按起始点对间隔进行排序 对于每个间隔,从排序列表的末尾开始,创建持久树的“副本”,并将此间隔添加到此副本中 搜索
S
。您必须在S
中找到包含在给定时间间隔(a,b)
中的所有时间间隔,时间复杂度最低。
这可以通过蛮力在O(n)
时间内完成,其中n
是集合S
中的间隔数。但是,如果允许我做一些预处理,这可以在O(n)
时间内完成吗,例如O(logn)
时间
最初我是在考虑,但我认为它不适用于这里,因为区间树用于获取与给定区间重叠的所有区间
预处理:
搜索时间复杂度为O(log(n)+m),其中m是输出中的元素数。您可以在二维平面中重新建模问题。让每个间隔的
(开始,结束)
为二维点。(请注意,所有有效间隔将在对角线上方结束)
您的区间搜索问题转化为经过充分研究的正交二维范围查询,其算法具有或运行时,其中k是报告的点数
如上所述,您所能做的最好的事情就是
O(n)
,因为在最坏的情况下,S
的所有元素都必须复制到输出中。是的,这是正确的。但我希望得到类似于O(logn)+O(m)的东西,其中m是输出中的元素数。@SteveM需要注意的是,在大O表示法中,O(logn)+O(m)=O(n)
,因为m可以和n一样大。预处理时间也包含在运行时中,因为如果您想对间隔进行排序或使用一些数据结构进行排列,这些也是您算法的一部分。相关:好主意,但我不知道有任何算法的复杂性小于O(k),其中k是报告的点数。因此,帕特里夏是对的,没错。我已经更新了我的答案,加入了对k的描述。但有时数据点分布得很好,并且您的查询只覆盖一小部分,因此,它的空间复杂度似乎是O(n^2)。如果我错了,请纠正我。@SteveM:空间复杂度是O(n*log(n))。持久数据结构允许创建浅层“拷贝”,其中大部分数据在“拷贝”之间共享,因此每次BST更新只需要O(log(n))个额外节点。