首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最大嵌套区间集

最大嵌套区间集
EN

Stack Overflow用户
提问于 2012-10-15 12:58:38
回答 1查看 1.3K关注 0票数 3

这是一个基于求最大嵌套区间集的大小的问题。

有许多间隔,每个间隔由包含一个起点和一个结束点(si,ei)的对定义。如果i1和i2完全位于i1内部,则称为嵌套i2。示例:- (2,6)和(3,4)嵌套,因为(3,4)是(2,6)的一部分。类似地,k间隔i1、i2、i3....ik称为嵌套if,i2位于i1中,i3位于i2中,...and等等。从给定的间隔确定最大间隔集的大小,以便该集合中的所有间隔都能产生嵌套。

我是这样想的:-让我们用一个例如- (0,7) (0,5) (1,21) (1,9) (2,8) (2,4) (3,20) (4,16) (5,15) (6,21)排序,使ai-1<=ai & bi-1>=bi,而不是从第一个区间开始,我们开始一个链表。如果下一个间隔在一个区间内,我们沿着节点向下移动并遍历创建的图(主列表除外),..we在此图中存储最大级别节点的指针,新的间隔可以在该指针上适应。并在链接列表中进一步遍历,以查看当前间隔在谁下面。最后,我们有一个指向节点的指针,该节点必须附加当前间隔。并将此节点的级别与我们已有的最大级别进行比较……最大值的最终值是最大嵌套区间集的大小。

上述解决方案的复杂性可能是:- O(n(k+l) + nlogn)

我想这样很难,但我没有别的选择.如果有人有其他算法来解决它..。请张贴,因为我的算法将需要更长的时间来实现(很多数据结构).谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-04-24 05:59:52

编辑:一些问题的解决方案在http://codeforces.com/blog/entry/5541上发布,包括两个自称O(n lg n)的解决方案。然而,我认为O(n lg n)解不起作用。我在那一页上发表了评论,说明了原因。如果有人有O(n lg n)的解决方案,我很想听听。

二次解

这个问题可以用动态规划在O(n^2)时间内解决:

  1. 计算每个间隔包含多少间隔(可以用两个嵌套循环来完成)
  2. 按包含的间隔数的升序排序间隔。
  3. 使用递归MaxNestedIntervals解决问题

*注:步骤1可以在O(n lg n)时间内使用这里的解来完成:计算嵌套间隔的子O(n^2)算法?步骤2可以在O(n lg n)时间内完成,并使用任何基于最优比较的排序算法。也许有一种优化步骤3的方法,但我还没有找到它。

递归

代码语言:javascript
复制
MaxNestedIntervals(i) =
    max {j = 0 to i-1} :
        1 + MaxNestedIntervals(j)    if interval i contains interval j
        0                            if interval i doesn't contain interval j

基案例

代码语言:javascript
复制
MaxNestedIntervals(i) =
    0    if interval i contains 0 intervals
    1    if interval i contains 1 interval

示例代码

代码语言:javascript
复制
import java.util.*;

public class MaxNestedIntervals {
    public static void main(String[] args) {
        Interval[] intervals = new Interval[10];
        intervals[0] = new Interval(0, 7);
        intervals[1] = new Interval(0, 5);
        intervals[2] = new Interval(1, 21);
        intervals[3] = new Interval(1, 9);
        intervals[4] = new Interval(2, 8);
        intervals[5] = new Interval(2, 4);
        intervals[6] = new Interval(3, 20);
        intervals[7] = new Interval(4,16);
        intervals[8] = new Interval(5,15);
        intervals[9] = new Interval(6,21);

        int n = intervals.length;
        AugmentedInterval[] augmentedIntervals = new AugmentedInterval[n];

        for (int i = 0; i < n; i++) {
            augmentedIntervals[i] = new AugmentedInterval(intervals[i]);
        }

        for (int i = 0; i < n; i++) {
            AugmentedInterval outerInterval = augmentedIntervals[i];

            for (int j = 0; j < n; j++) {
                if (i == j) {
                    continue;
                }

                AugmentedInterval innerInterval = augmentedIntervals[j];

                if (outerInterval.contains(innerInterval)) {
                    outerInterval.numContainedIntervals++;

                    if (outerInterval.childInterval == null) {
                        outerInterval.childInterval = innerInterval;
                    }
                }
            }
        }

        Arrays.sort(augmentedIntervals, new Comparator<AugmentedInterval>() {
            public int compare(AugmentedInterval i, AugmentedInterval j) {
                return i.numContainedIntervals - j.numContainedIntervals;
            }
        });

        int maxNestedIntervals = 0;
        AugmentedInterval parentInterval = null;

        for (int i = 0; i < n; i++) {
            AugmentedInterval currentInterval = augmentedIntervals[i];

            if (currentInterval.numContainedIntervals == 0) {
                currentInterval.maxNestedIntervals = 0;
            } else if (currentInterval.numContainedIntervals == 1) {
                currentInterval.maxNestedIntervals = 1;
            } else {
                int maxNestedIntervalsForCurrentInterval = 0;

                for (int j = 0; j < i; j++) {
                    AugmentedInterval candidateNestedInterval = augmentedIntervals[j];
                    int maxNestedIntervalsForCurrentCandidate = candidateNestedInterval.maxNestedIntervals + 1;

                    if (currentInterval.contains(candidateNestedInterval) && maxNestedIntervalsForCurrentCandidate >= maxNestedIntervalsForCurrentInterval) {
                        maxNestedIntervalsForCurrentInterval = maxNestedIntervalsForCurrentCandidate;
                        currentInterval.childInterval = candidateNestedInterval;
                    }
                }

                currentInterval.maxNestedIntervals = maxNestedIntervalsForCurrentInterval;

                if (maxNestedIntervalsForCurrentInterval >= maxNestedIntervals) {
                    maxNestedIntervals = maxNestedIntervalsForCurrentInterval;
                    parentInterval = currentInterval;
                }
            }
        }

        if (n == 0) {
            System.out.println("The largest set of nested intervals is the empty set.");
        } else if (maxNestedIntervals == 0) {
            System.out.println("The largest set of nested intervals has 1 interval.\n");
            System.out.println("That interval is:");
        } else {
            System.out.println("The largest set of nested intervals has " + (maxNestedIntervals + 1) + " intervals.\n");
            System.out.println("Those intervals are:");
        }

        for (AugmentedInterval currentInterval = parentInterval; currentInterval != null; currentInterval = currentInterval.childInterval) {
            System.out.println(currentInterval);
        }

        System.out.println();
    }

    private static class Interval implements Comparable<Interval> {
        public int start = 0;
        public int end = 0;

        public Interval(int start, int end) {
            this.start = start;
            this.end = end;
        }

        public int size() {
            return this.end - this.start;
        }

        public boolean contains(Interval other) {
            return (this.start <= other.start && this.end >= other.end);
        }

        public int compareTo(Interval other) {
            return this.size() - other.size();
        }

        public String toString() {
            return "[" + this.start + ", " + this.end + "]";
        }
    }

    private static class AugmentedInterval extends Interval {
        public int numContainedIntervals = 0;
        public int maxNestedIntervals = 0;
        public AugmentedInterval childInterval = null;

        public AugmentedInterval(Interval interval) {
            super(interval.start, interval.end);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12896156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档