【问题标题】:Merge 2 sets of intervals while constraining each interval from set1 to the bounds of set2合并 2 组区间,同时将每个区间从 set1 约束到 set2 的边界
【发布时间】:2018-01-06 18:13:41
【问题描述】:

这是一张说明我的意思的图片:

基本上我想将set1合并到set2中,但是set1中的每个区间都不允许存在,除非它包含在set2中的区间范围内。

非常感谢任何建议!

PS:我的下一个任务是弄清楚如何将 n 个 *set1*s(即可能相互重叠的绿色层)合并到一个应用相同规则的 set2 中。 ..但我会先从这个开始!

【问题讨论】:

    标签: algorithm intervals overlap


    【解决方案1】:

    这是一种在 JavaScript 中进行这种合并的算法——它应该很容易在其他编程语言中重现:

    function merge(segments1, segments2) {
        const result = [];
        let i = -1, start1 = -Infinity, end1 = -Infinity, 
            j = -1, start2 = -Infinity; end2 = -Infinity;
        while (i < segments1.length || j < segments2.length) {
            if (end1 <= start2) { // get next from segments1
                i++;
                start1 = i < segments1.length ? segments1[i][0] : Infinity;
                end1 = i < segments1.length ? segments1[i][1] : Infinity;
            } else if (end2 <= start1) { // flush and get next from segments2
                if (start2 < end2) result.push([start2, end2]);
                j++;
                start2 = j < segments2.length ? segments2[j][0] : Infinity;
                end2 = j < segments2.length ? segments2[j][1] : Infinity;
            } else { // overlap
                if (start2 < start1) {
                    result.push([start2, start1]);
                    start2 = start1;
                }
                start1 = Math.min(end2, end1);
                result.push([start2, start1]);
                start2 = start1;
            }
        }
        return result;
    }
    
    // Sample input
    const segments1 = [[6, 7], [8, 11], [12, 14], [15, 18], [19, 20], [22, 23], 
                       [25, 26], [27, 28], [30, 31], [33, 35]],
          segments2 = [[6, 10], [11, 14], [16, 17], [18, 21], [22, 24], [24, 26],
                       [27, 28], [29, 31], [33, 34], [35, 36]];
    // Merge and output
    const result = merge(segments1, segments2);
    console.log(JSON.stringify(result));

    要合并多组段,您只需像这样调用上述函数:

    merged = merge(green1, grey)
    merged = merge(green2, merged)
    merged = merge(green3, merged)
    // ... etc
    

    【讨论】:

    • 完美,这正是我所需要的。非常感谢你!您对我可以添加以帮助未来的谷歌员工的额外标签有什么建议吗?或者您认为这是一个非常具体的用例... 编辑:示例 PHP 实现的要点,如果需要,可以跟踪任何绿色层元数据(适用于我的用例)。 gist.github.com/anonymous/a0f870b77a87d0b22c5ab89db90756ee
    • 不客气 ;-) 我认为当前的标签很好。
    【解决方案2】:
    1. 将 set2 中的所有区间添加到结果中。
    2. 将 set1 中的所有间隔添加到结果中,如果它们不完全适合 set2 的间隔,则“剪切”或完全删除它们。
    3. 合并结果集中的所有重叠区间。

    为了有效地实施第二步,您可以按第一个坐标对 set2 中的间隔进行排序并使用二分搜索。第三步https://www.geeksforgeeks.org/merging-intervals/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2021-09-18
      相关资源
      最近更新 更多