重叠间隔和重叠量

时间:2015-10-07 10:07:18

标签: php algorithm intervals overlap

这个问题可能与其他问题相似,但有点不同。我们假设我们有一组这样的间隔让我们说A-9是数字,但为了格式化,我使用了字母):

            <-a---> <------c--->
        <------------MAIN>
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         <--d-> <--b------->

因此,我们的主间隔从I变为Z,间隔aM变为S,依此类推。< / p>

现在我希望在主要的一个(基本上是基本约束)中具有最重叠的区间,其中MO是(a和d)和QS(a和b)和UZ(b和c)每个都有2个重叠(超出Z的所有内容都是不可能的,因为它超出了主要区间

我基本上想要一个列表(也就是数组)的间隔和Main内的重叠数,而不计算主要的那个数字(排序不需要有足够的方法来做到这一点)在PHP中。

我想过制作一个间隔的图片,然后计算每个像素列的颜色但是那个

  1. 避免问题
  2. 低效
  3. 可能很慢
  4. 所以,TLDR,我需要一个解决方案

    • 适用于PHP
    • 相对
    • 很可靠
    • 为您提供重叠间隔及其重叠计数
    • 有一个主间隔用作基本约束,不计入重叠。

    我知道这是一个非常具体的问题,但我并不精通数学和算法。

2 个答案:

答案 0 :(得分:1)

  • 构建2个向量。一个包含起点,一个包含每个区间的终点。

  • 对2个向量进行排序。

  • 虽然你有两个向量中的任何一个:

    • 选择2之间的最小值。
    • 如果您从矢量中选择它,起点将重叠间隔的数量增加1,否则将其减1。
    • 如果您的点也是主间隔的起点,则设置您生成的标志现在有效。
    • 如果您的观点是主间隔的终点,您可以停止。
    • 如果设置了标志,那么您可以将当前重叠间隔数与最大值进行比较,并相应地进行更新。

您可以从最大值减少1以忽略主间隔。您可以保留最大数量的部分列表(只要确保在获得更好的结果时清除它)。

这是O(NlogN),包含您的间隔数。

答案 1 :(得分:1)

这个基本算法是在整个长度上使用一个计数器,当你遇到一个起点时它会增加,当你遇到一个终点时它会减少。

跟踪此计数器达到的最大值。

再次查看整个长度,这次在以下情况下将位置添加到result数组:
1.你在MAIN部分边界内。
2.您的计数器(以相同的方式保持)等于您之前计算的最大值。