如何证明是否没有intervall重叠?

时间:2012-11-10 15:46:34

标签: java algorithm intervals

如果没有间隔重叠,我必须实施。

Intervalls看起来像这样:

0-100
100-200
200-500
500-1000
1000-2000 ect....

现在,intervalls分别存储在一个arraylist中,其中min(0,100,200,500 ...)和max(100,200,500 ...)

如果我添加新的Intervall,我必须检查现有的intervalls是否没有重叠。 例如:

250-280还可以 300-600不行

但是,我不知道该怎么做?

7 个答案:

答案 0 :(得分:5)

您可以使用interval tree data structure执行此任务,并仅在间隔中没有碰撞/交叉点时添加元素。

答案 1 :(得分:1)

对于间隔(a,b)

1循环列表

2如果a落在其中一个区间内,则区间重叠。

3找到两个间隔a之间的ge

4与b重复。如果b在任何区间内,它会重叠。

5如果ab介于两个相同的区间之间,则它们不会重叠。否则他们重叠。

当然,在开始算法之前,Yob建议使用单个arraylist并将间隔作为对象进行管理。

答案 2 :(得分:1)

  

现在,intervalls分别存储在一个arraylist中   min(0,100,200,500 ...)和max(100,200,500 ...)

所以......

bool isCollided = false;
Integer min = 250;
Integer max = 280;
for(Integer intOne: firstList){
  Integer intTwo = secondList.get(firstList.indexOf())
  if( (min >= intOne && <= intTwo) || (max >= intOne && <= intTwo){
    isCollided = true;
    break;
  }
}

但我可能像其他人建议的那样创建自己的课程。

答案 3 :(得分:0)

您可能创建了一个包含开头和结尾的Interval对象,并将其放入ArrayList中。

您可以在此Class上轻松实现可以检测冲突的方法:

public boolean hasCollision(Interval inter){....}

现在在插入之前迭代你的集合并调用hasCollision()方法...... 我想要优化结果,您还可以使Interval对象实现Comparable并使用Sorted集合。

答案 4 :(得分:0)

由于间隔不重叠,您可以按照下限对它们进行排序。要查找给定的间隔是否与某个现有间隔重叠,可以使用二分搜索,这样搜索时间就是log(N)。

我建议您创建class Interval implements Comparable<Interval>,并使用java.util.TreeMap<Integer, Interval>。关键是下限和上限之和。插入新的Interval i时,只需检查两个条目的重叠:map.floorEntry(i.key())map.lowerEntry(i.key())

答案 5 :(得分:0)

您可以按起点对其进行排序,例如在NavigableMap

NavigableMap<Integer, Integer> map =
map.put(100, 200);
map.put(300, 500);

// to test for a range.
int start = 300, end = 400;
if (map.floorEntry(start).getValue() >= start && map.ceilingKey(start) <= end)
   // out of existing ranges.

此操作为O(ln N)

答案 6 :(得分:0)

有一种简单的方法作为实用方法

public static boolean isOverlapping(Date start1,Date end1,Date start2,Date end2){     return start1.before(end2)&amp;&amp; start2.before(END1); }