【问题标题】:Combining 2 Intervals结合 2 个区间
【发布时间】:2019-03-06 22:42:31
【问题描述】:

给定 2 个具有 int start、int end 和 boolean 状态的区间,组合 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>();
    }
}

【问题讨论】:

  • 那么,你的问题是什么?
  • 如何找到两个区间之间的交集并更改 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],[6,10,真],[10,20,真],[20,30,假],[30,35,假],[35,INF,假]]
  • 不清楚为什么预期的结果以[-INF,5,false],[5,6,false]开头。

标签: java algorithm data-structures intervals priority-queue


【解决方案1】:

区间覆盖所有轴,因此我们可以只考虑左端和 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)

【讨论】:

  • 在这里提供伪代码并让提问者进行具体编码是个好主意。谢谢。
  • 我认为这行不通,因为您正在考虑 A[ia].PositionB[ib].Position。在少数情况下,我们还需要它们两者的交集。该算法可以保证哪个特定部分? @MBo
  • @user11223 每个新间隔都从某个A[ia].Position 或某个B[ib].Position 或共享点开始(这里使用B[ib].Position)。 &amp;&amp; 为当前间隔提供布尔交集。
  • 感谢您的解释。只是为了澄清一下,当我通过一个例子时,当你说if A[ia].Position &lt;= B[ib].Position时,你到底是什么意思?您是在比较A[ia].start with B[ib].start 还是A[ia].end with B[ib].end?或任何其他组合? @MBo
  • 当所有区间都连接起来(没有空范围)时,终点就不需要了,所以我假设只使用起点。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多