Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定了一组区间S。必须以最小时间复杂度找到S中包含在给定区间(a,b)中的所有区间_Algorithm_Search_Data Structures_Tree_Intervals - Fatal编程技术网

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))个额外节点。