[英]finds the maximum number of overlapping sections
假设您在 X 轴上收到一组截面。
一个部分有一个 ID ,一个起点和一个结束点 编写伪代码或实际代码,找出重叠部分的最大数量及其 ID。
描述您用来表示数据的数据结构或类。
我将使用的数据结构是Segment Tree这与您使用哪种语言无关。
对于表示数据的类,它要求您概述线段树的节点设计。
struct node{
int L,R,v; // the end point and the # of segments lying in this interval, init = 0
}
然后对于每个段,运行范围更新操作(总O(N lg(N))
)
我认为更新时需要延迟传播
然后对端点进行排序,然后查询这些端点之间的2N-1
“间隙”(例如:给定 [1,3], [2,5], 我会查询 [1,2] , [2,3 ], [3,5]) (总O(N lg(N))
)
最后,您应该知道哪个“间隙”包含重叠段的最大数量,以找到这些段的 ID,只需O(N)
即可检查每个段是否与该“间隙”相交
我对分割树很陌生,但我希望我能给你一个正确的方向:)
编辑:
这有点盲目,因为它没有说明关键是性能、清晰度等。在 C# 中,让我们假设一个 Section 是一个对象,如
class Section
{
public double StartX;
public double EndX;
public int ID;
//[...]
}
然后我需要一个外部类来获取重叠(假设一个部分可以与其他几个部分重叠,并且每个重叠必须独立计算)
class OverlapCounter
{
public static int GetOverlaps(Section[] inputSections, out List<int> OverlappedSectionsIDs)
{
int numOverlaps = 0;
OverlappedSectionsIDs = new List<int>();
for (int i= inputSections.Length-1; i>=1; i--)
{
bool isNotListed = true;
double S1_start = inputSections[i].StartX;
double S1_end= inputSections[i].EndX;
for (int j= i-1; j>=0; j--)
{
double S2_start = inputSections[j].StartX; //stored for the sake of clarity
double S2_end = inputSections[j].EndX;
if (S1_start<= S2_end && S1_end>= S2_start)
{
numOverlaps++; //all the overlappings are counted
if(isNotListed)
{
//IDs should not be repeated
OverlappedSectionsIDs.Add(inputSections[i].ID);
isNotListed = false;
}
}
}
}
return numOverlaps;
}
}
最后,您可以通过以下方式获得所询问的内容:
List<int> OverlappedSectionsIDs;
int numMaxOverlaps = OverlapCounter.GetOverlaps(SectionsArray,out OverlappedSectionsIDs);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.