查找两个整数范围之间的重叠区域

Posted

技术标签:

【中文标题】查找两个整数范围之间的重叠区域【英文标题】:Finding overlapping region between two ranges of integers 【发布时间】:2016-12-16 13:07:56 【问题描述】:

我正在用 C# 制作一个复杂的算法,其中一个步骤是比较 2 个非常大的范围列表并找出重叠区域。我已经尝试了很多方法来找到它们,但我不确定我是否涵盖了所有可能性。此外,我在这一步的算法对于庞大的列表花费的时间太长。

示例:

范围 1 = 1-400

范围 2 = 200-600

所以当我想检查这两个范围之间的重叠时,我应该得到答案 = 200。

因为这两个范围之间共有 200 个数字重叠。所以这就是我想要的答案,我想要两个范围之间重叠的整数的确切数量。

列表示例:

List1 : 1-400, 401-800, 801-1200 等等... List2 : 10240-10276, 10420 10456, 11646-11682 等等...

现在我必须将 list1 的每个范围与 list2 的每个范围进行比较,并找出 list1 的某个范围是否与 list2 的任何范围重叠,如果是,那么重叠的答案是什么?这些只是用于理解的示例值。

我只需要一个简单且最有效/快速的公式即可找出 2 个范围之间的重叠答案。我可以管理循环算法的其余部分。

示例公式

var OverlappingValue = FindOverlapping(range1.StartValue, range1.EndValue,range2.StartValue, range2.EndValue);

如果两个范围完全不重叠,则函数必须返回 0。

PS:我没有发布我的代码,因为它真的很复杂,有很多条件,我只需要一个简单的公式。

【问题讨论】:

你能做到400-200吗? 如果 range2.start @OscarSiauw 您还必须检查 range1.start 是在 range2.end 之前还是之后,以及 range2.end 是在 range1.end 之前还是之后。 200 到 400 之间有 201 个整数而不是 200(或者你需要解释边界是如何包含/排除的) Merge Overlapping Intervals 算法可以提供一些线索。 【参考方案1】:

如果有任何重叠范围;它必须从最大下限到最小上限开始,所以只需使用该“公式” 然后只需将其上限减去它的下限并加一(全包)即可获得该范围内的项目数 最后,如果该数量为负数,则表示范围没有重叠,因此只需获取该数量和 0 之间的最大值来处理这种情况

编辑:哎呀 C# 不是 VB.Net

int FindOverlapping (int start1, int end1, int start2, int end2)

    return Math.Max (0, Math.Min (end1, end2) - Math.Max (start1, start2) + 1);

【讨论】:

非常感谢,你给了我我需要的东西,并且只用了一行代码就可以完美地发挥作用,这完全有道理。再次感谢:) 这对我根本不起作用。我使用了 ulong 数字。 start1: 5388080000200 end1: 5388080000299 start2: 2483090000000000 end2: 2483099999999999 显然这两个范围根本不重叠,但结果是: 18444266371789551916 而不是 0 @Nick:我刚刚在 LINQpad 中尝试过这个(使用 long 而不是 int),效果很好。【参考方案2】:

你可以试试这样的:

void Main()

    double adStart = 1.501;
    double adEnd = 21.83;
    double bdStart = 0.871;
    double bdEnd = 56.81;

    int aiStart = 21;
    int aiEnd = 35;
    int biStart = 29;
    int biEnd = 43;

    // 20.239
    double dOverlap = FindOverlapping((int)(adStart*1000), (int)(adEnd*1000), (int)(bdStart*1000), (int)(bdEnd*1000))/1000.0;

    // 6
    int iOverlap = FindOverlapping(aiStart, aiEnd, biStart, biEnd);

    // 0
    iOverlap = FindOverlapping(20, 25, 26, 30);

    // 0
    iOverlap = FindOverlapping(20, 25, 25, 30);


int FindOverlapping(int aStart, int aEnd, int bStart, int bEnd)

    int overlap = System.Linq.Enumerable.Range(aStart, aEnd - aStart).Intersect(System.Linq.Enumerable.Range(bStart, bEnd - bStart)).Count();

    return overlap;

【讨论】:

【参考方案3】:

要使用的单行公式就是这个。

假设您有 2 个区间: (a1, a2) 和 (b1, b2)

那么重叠区域将是:max0, mina2-b1, b2-a1

【讨论】:

这是错误的。如果 a1b2,您的公式将返回一个大于实际重叠的值。如果您的范围重叠(a1 给出

以上是关于查找两个整数范围之间的重叠区域的主要内容,如果未能解决你的问题,请参考以下文章

查找两个矩形的重叠区域(在 C# 中)

计算R中具有不同来源和范围的2个栅格图层之间的重叠区域

计算两个矩形之间的重叠面积

如何修复 g++ 内存范围重叠?

在两个 PHP DatePeriods 中查找重叠分钟数

是否可以使用R data.table函数foverlaps来查找两个表中重叠范围的交集?