降低复杂度以寻找重叠区间坐标

时间:2013-08-05 01:37:33

标签: java complexity-theory

此代码返回重叠坐标。 示例:输入[10,30] [20,50] [40,70,] [60,90] [80,100] 答案应该是:[20,30],[40,50] [60,70] [80,90] 有没有办法以低于二次时间复杂度来解决这个问题?

谢谢,

  public static Set<OverlapCoord> getOverlap(List<Interval> intervalList) {
    if (intervalList == null) {
        throw new NullPointerException("Input list cannot be null.");
    }

    final HashSet<OverlapCoord> hashSet = new HashSet<OverlapCoord>();

    for (int i = 0; i < intervalList.size() - 1; i++) {
        final Interval intervali =  intervalList.get(i);

        for (int j = 0; j < intervalList.size(); j++) {
            final Interval intervalj = intervalList.get(j);

            if (intervalj.getStart() < intervali.getEnd() && intervalj.getEnd() > intervali.getStart() && i != j) {
                hashSet.add(new OverlapCoord(Math.max(intervali.getStart(),intervalj.getStart()), 
                                             Math.min(intervali.getEnd(), intervalj.getEnd())));
            }
        }
    }

    return hashSet;
}

1 个答案:

答案 0 :(得分:0)

您应该能够通过对间隔数组进行排序(按间隔起点排序)将其减少到O(NlogN),然后在比较连续间隔时迭代它。

我怀疑O(NlogN)可能做得更好,除非您可以分摊多次运行的分拣步骤的成本。


请注意,如果一个间隔可以重叠多个其他间隔,则此一般方法将起作用。但是如果你想枚举每个重叠,那么在最坏的情况下可能会有O(N^2)个重叠,因此算法必须是O(N^2)

(例如,在“[1,2],[1,2],[1,2],[1,2]”中,每个区间重叠所有其他区域,给出6个重叠...或者12个,如果你不要消除对称对。)