Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何证明是否存在间隔重叠?_Java_Algorithm_Intervals - Fatal编程技术网

Java 如何证明是否存在间隔重叠?

Java 如何证明是否存在间隔重叠?,java,algorithm,intervals,Java,Algorithm,Intervals,如果没有间隔重叠,我必须执行 间隔看起来是这样的: 0-100 100-200 200-500 500-1000 1000-2000 ect.... 现在,间隔分别存储在一个带有min(0100200500…)和max(100200500…)的arraylist中 如果我添加一个新的间隔,我必须检查现有间隔是否没有重叠。 例: 250-280还可以 300-600不行 但是,我不知道怎么做?您可能确实创建了一个包含开始和结束的Interval对象,并将其放入ArrayList中 您可以轻松在此

如果没有间隔重叠,我必须执行

间隔看起来是这样的:

0-100
100-200
200-500
500-1000
1000-2000 ect....
现在,间隔分别存储在一个带有min(0100200500…)和max(100200500…)的arraylist中

如果我添加一个新的间隔,我必须检查现有间隔是否没有重叠。 例:

250-280还可以 300-600不行


但是,我不知道怎么做?

您可能确实创建了一个包含开始和结束的Interval对象,并将其放入ArrayList中

您可以轻松在此类上实现一个方法,该方法可以检测碰撞:

public boolean hasCollision(Interval inter){....}
现在,在插入之前,请遍历集合并调用hasCollision()方法。。。 如果要优化结果,还可以使Interval对象实现可比性,并使用排序集合。

用于Interval(a,b)

1循环你的列表

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

3找出哪两个间隔
a

4用
b
重复。同样,如果
b
在任何重叠的间隔内

5如果
a
b
在两个相同的间隔之间,则它们不会重叠。否则它们会重叠

当然,Yob建议在开始算法之前使用单个arraylist,并将间隔管理为对象,这是一个好主意。

您可以在该任务中使用,并且仅当间隔中没有碰撞/相交时才添加元素

现在,间隔分别存储在一个带有 最小值(0100200500…)和最大值(100200500…)

所以

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;
  }
}
bool isCollided=false;
最小整数=250;
整数max=280;
for(整型音调:firstList){
整数intTwo=secondList.get(firstList.indexOf())

如果((min>=intOne&&=intOne&&由于间隔不重叠,您可以按下限对它们进行排序。要查找给定间隔是否与某个现有间隔重叠,您可以使用二进制搜索,这样搜索时间将为log(N)


我建议创建
类Interval实现Comparable
,并使用
java.util.TreeMap
。键是上界和下界的总和。插入新的
Interval I
时,只检查两个项的重叠:
map.floorEntry(I.key())
map.lowerEntry(I.key())

您可以按起始点对它们进行排序,例如,在中

导航地图=
地图放置(100200);
地图放置(300500);
//测试范围。
int start=300,end=400;

如果(map.floorEntry(start).getValue()>=start&&map.ceilingKey(start)有一个简单的实用方法

公共静态布尔值isOverlapping(日期开始1、日期结束1、日期开始2、日期结束2){ 返回开始1.之前(end2)和开始2.之前(end1);
}

为什么250-280可以,它与200-500重叠。如果插入(x',y'),我将使用提供的apache内部解决方案,搜索min(x(1),x(2),…,x(n)),直到找到x(m),x(m+1),这样x(m)是一个
IntervalTree
的实现。使用适合手头查询的数据结构几乎总是正确的解决方案。给出代码在“我已经完成了这个程序,我得到了这个意外错误”中是有意义的,但在“我不知道使用哪种算法”中则没有意义。
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.