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.