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
Algorithm 数组中求区间的算法_Algorithm_Data Structures - Fatal编程技术网

Algorithm 数组中求区间的算法

Algorithm 数组中求区间的算法,algorithm,data-structures,Algorithm,Data Structures,我有一个包含n个间隔的列表[0,1] 每个间隔看起来像[a(i),b(i)]0提示:对列表进行排序。提示:对列表进行排序。假设只有一个间隔[0,1]。如果它不在您的列表中,为了方便起见,请添加它 对端点进行排序。如果两个端点相等,则在相应的右端点上对其进行反向排序。因此[0.1,0.2],[0.1,0.3]将被排序为0.1,0.1,0.2,0.3,其中第一个0.1与第二个间隔一致。同样,如果右端点相等 每个端点都应该有一个对其间隔的引用,这样您就可以找到给定端点的间隔 扫描已排序的端点。就像你做

我有一个包含n个间隔的列表
[0,1]


每个间隔看起来像
[a(i),b(i)]0提示:对列表进行排序。

提示:对列表进行排序。

假设只有一个间隔[0,1]。如果它不在您的列表中,为了方便起见,请添加它

对端点进行排序。如果两个端点相等,则在相应的右端点上对其进行反向排序。因此[0.1,0.2],[0.1,0.3]将被排序为0.1,0.1,0.2,0.3,其中第一个0.1与第二个间隔一致。同样,如果右端点相等

每个端点都应该有一个对其间隔的引用,这样您就可以找到给定端点的间隔

扫描已排序的端点。就像你做的那样,建一棵树。使用[0,1]作为根。节点可以是红色或绿色。它们以红色开头。因此,根节点最初是红色的

树的思想是,最终,如果一个区间包含另一个区间,它将是树中的祖先。如果两个间隔不重叠或部分重叠,则它们将位于不同的分支中,它们唯一的共同祖先将是根,或包含它们的其他间隔

当遇到每个左端点时,通过将红色节点作为其间隔添加到当前树节点,将其添加到树中的暂定位置。因此,我们遇到的第一个端点导致相应的间隔被添加到根下,并成为当前节点。因此,在遇到右端点之前,一个树节点可能有多个节点连接到它

当遇到右侧端点时,其节点将变为绿色,因为我们已经从一端到另一端完全覆盖了它。如果它有任何红色子节点,则必须移动它们,因为刚变为绿色的节点包含它们的左端,而不包含它们的右端。因此,我们将它们全部上移到父节点(该节点必须仍然为红色)


我们继续这个过程,直到到达1.0端点。此时,树已完成。所有节点都是绿色的。每个节点下的节点表示相应间隔包含的间隔

假设只有一个间隔[0,1]。如果它不在您的列表中,为了方便起见,请添加它

对端点进行排序。如果两个端点相等,则在相应的右端点上对其进行反向排序。因此[0.1,0.2],[0.1,0.3]将被排序为0.1,0.1,0.2,0.3,其中第一个0.1与第二个间隔一致。同样,如果右端点相等

每个端点都应该有一个对其间隔的引用,这样您就可以找到给定端点的间隔

扫描已排序的端点。就像你做的那样,建一棵树。使用[0,1]作为根。节点可以是红色或绿色。它们以红色开头。因此,根节点最初是红色的

树的思想是,最终,如果一个区间包含另一个区间,它将是树中的祖先。如果两个间隔不重叠或部分重叠,则它们将位于不同的分支中,它们唯一的共同祖先将是根,或包含它们的其他间隔

当遇到每个左端点时,通过将红色节点作为其间隔添加到当前树节点,将其添加到树中的暂定位置。因此,我们遇到的第一个端点导致相应的间隔被添加到根下,并成为当前节点。因此,在遇到右端点之前,一个树节点可能有多个节点连接到它

当遇到右侧端点时,其节点将变为绿色,因为我们已经从一端到另一端完全覆盖了它。如果它有任何红色子节点,则必须移动它们,因为刚变为绿色的节点包含它们的左端,而不包含它们的右端。因此,我们将它们全部上移到父节点(该节点必须仍然为红色)

我们继续这个过程,直到到达1.0端点。此时,树已完成。所有节点都是绿色的。每个节点下的节点表示相应间隔包含的间隔

  • 根据开始点对间隔进行排序,打破联系,以便较早的端点出现得较晚
  • 请注意,在排序顺序中,对于每个元素e,包含e的区间只能存在于其左侧
  • 因此,从左侧线性扫描,跟踪迄今为止观察到的最大端点。在任何阶段,如果当前时间间隔的端点小于最大端点,则我们已经找到了包含在其他时间间隔中的时间间隔
  • 根据开始点对间隔进行排序,打破联系,以便较早的端点出现得较晚
  • 请注意,在排序顺序中,对于每个元素e,包含e的区间只能存在于其左侧
  • 因此,从左侧线性扫描,跟踪迄今为止观察到的最大端点。在任何阶段,如果当前时间间隔的端点小于最大端点,则我们已经找到了包含在其他时间间隔中的时间间隔
    试过了。我无法在nlogn(快速排序)中对其进行排序,但之后我仍然找不到一个合适的解决方案,该解决方案在小于n^2的情况下有效。在对列表进行排序后,您尝试执行什么操作,问题是什么?在对数组进行排序后,我尝试搜索每个a的b部分,但通过这种方式,您将数组遍历了a次,因此,您将得到一个效率为O(n*n)的算法。@Idan:可以在日志(n)中的排序列表中搜索它。我无法在nlogn(快速排序)中对其进行排序,但之后我仍然找不到一个合适的解决方案,该解决方案在小于n^2的情况下有效。在对列表进行排序后,您尝试执行什么操作,问题是什么?在对数组进行排序后,我尝试搜索每个a的b部分,但通过这种方式,您将数组遍历了a次,因此,你得到了一个效率为O(n*n)的算法。@Idan:可以在日志(n)中的排序列表中搜索。通常认为做某人的家庭作业是不好的