我在c#中制作一个复杂的算法,其中一步是比较2个非常大的范围列表并找出重叠区域。我已经尝试了很多方法来找到它们,但我不确定我是否涵盖了所有可能性。此外,我对这一步的算法花了很长时间才有大量的名单。
示例:
范围1 = 1-400
范围2 = 200-600
所以当我想检查这两个范围之间的重叠时,我应该得到
answer = 200
因为这两个范围之间共有200个数字重叠。所以这就是我想要的答案,我想要在两个范围之间重叠的整数的确切数量。
列表示例:
List1:1-400,401-800,801-1200等...... 清单2:10240-10276,10420 10456,11664-11682等......
现在我必须将列表1的每个范围与列表2的每个范围进行比较,并找出某个范围的list1是否与list2的任何范围重叠,如果是,那么重叠的答案是什么?这些只是样本值让你明白。
我只需要一个简单且最有效/快速的公式来找出2个范围之间的重叠答案我可以管理其余的循环算法。
示例公式:
var OverlappingValue = FindOverlapping(range1.StartValue, range1.EndValue,range2.StartValue, range2.EndValue);
如果两个范围完全不重叠,则函数必须返回0 提前致谢 P.S:我没有发布我的代码bcz它真的很复杂,有很多条件,我只需要一个简单的公式。感谢。
答案 0 :(得分:6)
如果有任何重叠范围;它必须从最大下限开始到最小上限,所以只需使用“公式”
然后只需通过将其上限减去该范围的上限即可获得该范围内的项目数量并添加一个(包括所有内容)
最后,如果该金额为负数,则意味着该范围不重叠,因此只需获得该金额与0之间的最大值即可处理该情况
编辑:糟糕的C#而不是VB.Net
int FindOverlapping (int start1, int end1, int start2, int end1)
{
return Math.Max (0, Math.Min (end1, end2) - Math.Max (start1, start2) + 1);
}
答案 1 :(得分:0)
您可以尝试以下操作:
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;
}
答案 2 :(得分:-1)
要使用的单行公式就是这个。
假设您有 2 个间隔: (a1, a2) 和 (b1, b2)
那么重叠区域将是:max{0, min{a2-b1, b2-a1}}