Algorithm 数组中求区间的算法
我有一个包含n个间隔的列表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与第二个间隔一致。同样,如果右端点相等 每个端点都应该有一个对其间隔的引用,这样您就可以找到给定端点的间隔 扫描已排序的端点。就像你做
[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)中的排序列表中搜索。通常认为做某人的家庭作业是不好的