【问题标题】:Complexity reduction for finding overlapping interval coordinates [duplicate]寻找重叠区间坐标的复杂性降低[重复]
【发布时间】:2013-08-05 10:04:53
【问题描述】:

此代码返回重叠坐标。 示例:对于 [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;
}

【问题讨论】:

  • 两个以上的区间是否可以重叠?
  • 是的,允许重叠。

标签: java complexity-theory


【解决方案1】:

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

我怀疑是否有可能比O(NlogN) 做得更好,除非您可以在多次运行中分摊排序步骤的成本。


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

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

【讨论】:

  • 伪代码会有所帮助,谢谢
  • @JavaDeveloper - 你肯定很聪明,可以自己解决这个问题 :-)
猜你喜欢
  • 2020-09-04
  • 2015-09-06
  • 1970-01-01
  • 2021-09-22
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多