Объединение 2-х интервалов - PullRequest
1 голос
/ 07 марта 2019

Учитывая 2 интервала с int start, int end и логическим состоянием, объедините 2 интервала, как показано ниже

i1 и i2 равны 2 ArrayList<Intreval>, а 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<Intervals>.
i1 has [[-INF,6,false],[6,10,true],[10,30,true],[30,INF,false]] и
i2 has [[-INF,5,true],[5,20,true],[20,35,false],[35,INF,false]] и
res should contain [[-INF,5,false],[5,6,false],[6,10,true],[10,20,true],[20,30,false],[30,35,false],[35,INF,false]]

Код:

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>();
    }
}

1 Ответ

1 голос
/ 07 марта 2019

Интервалы охватывают все оси, поэтому мы можем рассматривать только левые концы вместе с полем T / F.

Концы отсортированы, поэтому примените процедуру слияния (например, сортировку слиянием).

 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)
...