【问题标题】:How to calculate that no sub range overlap each other and all sub range covers whole range in java?java - 如何计算没有子范围相互重叠并且所有子范围都覆盖了java中的整个范围?
【发布时间】:2011-04-20 04:35:12
【问题描述】:

我在 java 中有一个范围被实现为一个分为子范围的类。实现大致如下:

public class Range
{
   static public class Key implements Comparable<Key>
   {
      public int start;
      public int end;
      ...
   }

   Key range;
   SortedMap<Key, Range> subRange;
}

我想创建一个函数,确保没有子范围相互重叠,并且子范围的组合范围完全覆盖整个范围。每个范围的开始和结束可能相等。

有效对象示例:

Range: start 1, end 10
  subrange 1: start 1, end 2
  subrange 2: start 3, end 9
  subrange 3: start 10, end 10

实现这一点的最佳方法是什么?

编辑:

致对实施感兴趣的任何人:

在我的验证代码中,我执行以下步骤:

  1. 将排序后的地图转换为数组
  2. 强制第一个和最后一个元素覆盖整个范围的开头和结尾
  3. 迭代数组元素并修复它们之间的间隙或重叠

第 3 步的代码:

for (int i=0; i < (rangeArray.length - 1); i++)
{
    if (rangeArray[i].range.end < (rangeArray[i+1].range.start - 1) ||
        rangeArray[i].range.end >= rangeArray[i+1].range.start)
    {
        // Alternatively, lose the if and just force subrange to behave this way
        rangeArray[i].range.end = rangeArray[i+1].range.start - 1; 
    }
}

【问题讨论】:

  • Avee,你能发布你的代码吗?我必须执行类似的验证,但我无法想出一些东西。提前致谢。
  • 嗨阿米特,这是我的结尾:
  • 嗨,我已经更新了我的问题以包含我的实现的 sn-p,希望对您有所帮助

标签: java algorithm range


【解决方案1】:

由于您的subRange 映射已排序,您可以对其进行迭代并检查end 到下一个start 的序列中是否没有间隙。当然,从您的总起点到第一个 start 和最后一个 end 到您的总终点。将此检查递归地应用于所有subRanges。

为此,您的地图必须按start 排序,您的示例就是这种情况。

【讨论】:

  • 这解决了问题,非常感谢!除了检查间隙之外,我还在每次迭代中检查重叠的子范围。
【解决方案2】:

另一种方法是对所有范围求和,并将其与所有范围的最大值和最小值的增量进行比较。如果总和大于或等于 delta,则表示存在交集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多