Java 组合2个区间

Java 组合2个区间,java,algorithm,data-structures,intervals,priority-queue,Java,Algorithm,Data Structures,Intervals,Priority Queue,给定两个具有int start、int end和boolean状态的间隔,组合这两个间隔,如下所示 i1和i2是2ArrayList,res应该包含组合间隔的输出 例如: -INF --------- 6 ------- 10 --------- 30 --------- INF F T T F -INF --- 5 ------------------- 20 --------- 35 ---- INF

给定两个具有int start、int end和boolean状态的间隔,组合这两个间隔,如下所示

i1和i2是2
ArrayList
,res应该包含组合间隔的输出

例如:

-INF --------- 6 ------- 10 --------- 30 --------- INF

       F           T             T           F

-INF --- 5 ------------------- 20 --------- 35 ---- INF

      T            T                  F         F
输出:

-INF ---5 ---- 6 -------- 10 -- 20 ---- 30 -- 35 --- INF

      F     F       T         T      F      F      F

代码创建了i1和i2,它们是
ArrayList

i1有[-INF,6,false],[6,10,true],[10,30,true],[30,INF,false],
i2有[-INF,5,true],[5,20,true],[20,35,false],[35,INF,false],
res应该包含[-INF,5,false],[5,6,false],[6,10,true],[10,20,true],[20,30,false],[30,false],[35,INF,false],

代码:

类间隔
{
int启动;
内端;
布尔状态;
公共间隔(整数开始、整数结束、布尔状态)
{
this.start=start;
this.end=end;
这个状态=状态;
}
}
麦可德类{
公共静态void main(字符串[]args){
ArrayList i1=新的ArrayList();
i1.添加(新间隔(Integer.MIN_值,6,false));
i1.添加(新间隔(6,10,真));
i1.添加(新间隔(10,30,真));
i1.添加(新间隔(30,整数.MAX_值,false));
ArrayList i2=新的ArrayList();
i2.添加(新间隔(Integer.MIN_值,5,true));
i2.添加(新间隔(5,20,真));
i2.添加(新区间(20,35,假));
i2.添加(新间隔(35,整数.MAX_值,false));
int i=0,j=0;
ArrayList res=新的ArrayList();
}
}

< /代码>

区间覆盖所有轴,因此我们只考虑左端和T/F字段。

端点已排序,因此应用合并过程(如合并排序中的过程)

ia=0
ib=0
//启动第一个输出间隔代码
而ia
那么,你的问题是什么?我如何找到两个间隔之间的交点并更改I和j值并将其添加到res?res应该具有组合的间隔i1和i2以及交叉点状态的&。代码现在做什么,您希望它做什么?代码创建的i1和i2是ArrayList。i1有[[-INF,6,false],[6,10,true],[10,30,true],[30,INF,false]],i2有[-INF,5,true],[5,20,true],[20,35,false],[35,INF,false]]和res应该包含[-INF,5,false],[5,6,false],[10,20,true],[20,30,false],[30,35,INF,false],[35,INF,false]]不清楚为什么预期结果以
-5,false][,5,false]开头
。在这里提供伪代码并让询问者进行具体编码是个好主意。谢谢。我认为这不起作用,因为您正在考虑
A[ia].Position
B[ib].Position
。在少数情况下,我们还要求两者相交。该算法可以保证的具体部分是什么@MBo@user11223每个新间隔从某个
A[ia]位置开始,或从某个
B[ib]位置开始,或从共享点开始(此处使用
B[ib]。位置)。
&
为当前间隔提供布尔交集。感谢您的解释。在我运行一个示例时,为了澄清一下,当您说
if A[ia].Position时,当所有间隔都连接在一起时(没有空范围),就不需要终点,所以我假设只使用起点。
Class Interval
{
  int start; 
  int end;
  boolean status;
  public Interval(int start, int end, boolean status)
  {
    this.start = start;
    this.end = end;
    this.status = status;
  }
}
  class MyCode {
    public static void main (String[] args) {
    ArrayList<Interval> i1 = new ArrayList<Interval>();
    i1.add(new Interval(Integer.MIN_VALUE, 6, false));
    i1.add(new Interval(6,10,true));
    i1.add(new Interval(10,30,true));
    i1.add(new Interval(30,Integer.MAX_VALUE,false));

    ArrayList<Interval> i2 = new ArrayList<Interval>();
    i2.add(new Interval(Integer.MIN_VALUE, 5, true));
    i2.add(new Interval(5,20,true));
    i2.add(new Interval(20,35,false));
    i2.add(new Interval(35,Integer.MAX_VALUE,false));

    int i=0, j=0;
    ArrayList<Interval> res = new ArrayList<Interval>();
    }
}
 ia = 0
 ib = 0
 //Start the first output interval code

 while ia < ACount and B < BCount
    if A[ia].Position <= B[ib].Position
          ia++
          AActive  = True
    else if A[ia].Value >= B[ib].Value  //reuse == case for simplicity
                                        // and incrementing both indexes
          ib++
          AActive  = False

    State = A[ia].BooleanField && B[ib].BooleanField
    Pos = A[ia].Position if AActive else B[ib].Position 
    CloseOutputInterval(Pos)
    StartOutputInterval(Pos, State)

continue with the rest (A or B left)