找到重叠部分的最大数量

时间:2015-03-23 11:20:23

标签: java c# c++ c algorithm

假设您在X轴上收到一组部分。

一个部分有一个ID,一个起点和一个终点 编写伪代码或实际代码,找到重叠部分的最大数量及其ID

描述用于表示数据的数据结构或类。

2 个答案:

答案 0 :(得分:0)

我将使用的数据结构为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)来检查每个段是否与“间隙”相交

我对细分树很新,但我希望我能给你一个正确的方向:)

<强>编辑:

  1. 我认为可以为ID提供多种解决方案,我假设您可以输出其中任何一种
  2. 如何处理触控案例(即[1,3],[3,5])与问题有关,通常认为在坐标3处最多重叠2次。

答案 1 :(得分:0)

这有点盲目,因为它没有说明关键是性能,清晰度等。在C#中,我们假设Section是一个像这样的对象

const fileReader = new FileReader();

fileReader.addEventListener('loadend', function() {
  img.src = fileReader.result;
  storage['image'] = fileReader.result;
})

document.querySelector('input[type="file"]').addEventListener('change', function() {
    if (this.files.length > 0) {
      fileReader.readAsDataURL(this.files[0]);
    }
});

然后,我需要一个外部类来获得重叠部分(假设一个部分可以与其他几个部分重叠,并且每个重叠部分都必须独立计数)

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;
            }
        }