Java 寻找重叠区间坐标的复杂性降低

Java 寻找重叠区间坐标的复杂性降低,java,complexity-theory,Java,Complexity Theory,此代码返回重叠坐标。 例如:输入[10,30][20,50][40,70,60,90][80100] 答案应该是:[20,30],[40,50][60,70][80,90] 有没有一种方法可以在不到二次时间复杂度的情况下解决这个问题 谢谢 public static Set<OverlapCoord> getOverlap(List<Interval> intervalList) { if (intervalList == null) { th

此代码返回重叠坐标。 例如:输入[10,30][20,50][40,70,60,90][80100] 答案应该是:[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;
}
publicstaticsetgetoverlap(List intervalList){
if(intervalList==null){
抛出新的NullPointerException(“输入列表不能为null”);
}
final HashSet HashSet=新HashSet();
对于(int i=0;iintervali.getStart()&&i!=j){
add(新的重叠坐标(Math.max(intervali.getStart(),intervalj.getStart()),
min(intervali.getEnd(),intervalj.getEnd());
}
}
}
返回哈希集;
}

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

我怀疑是否有可能做得更好,除非您可以将排序步骤的成本分摊到多次运行中


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


(例如,在“[1,2]、[1,2]、[1,2]、[1,2]”中,每个间隔与所有其他间隔重叠,给出6个重叠…或12个重叠(如果不消除对称对)。

是否可能有两个以上的间隔重叠?是的,允许重叠。psuedo代码会有所帮助, thanks@JavaDeveloper-当然你足够聪明,可以自己解决它:-)