在几个通道中分组间隔

时间:2013-07-17 18:36:45

标签: algorithm

我有很多间隔(x,y),我想将它们组合在一起。规则是如果一组区间全部嵌套在组的一个成员中,则它们位于同一组中,除了它们全部嵌套的最大区间之外。例如,(1,7),(2, 4),(2,9),(8,9)可分为两组(1,7),(2,4)和(2,9),(8,9)。当然,这并不是唯一的,但在你不能拥有更少的团体的意义上它是最小的。

为了使它变得更复杂,我不能一次读取所有数据,因为它太大了。

我可以通过每对中的第一个元素离线对数据进行排序,例如。

这个问题的优秀算法是什么?

4 个答案:

答案 0 :(得分:2)

通过非减少x来对间隔进行排序,通过非增加y来断开关系。按顺序扫描间隔。虽然存在更多间隔,但要使第一个间隔保留为新组的封闭间隔,并尽可能将每个连续间隔添加到该组。

假设存在两个区间[x,y]和[x',y'],使得x <= x'<= y'<= y。然后我们可以证明[x',y']不是一个组的封闭区间,因此分组是最小的。如果[x,y] = [x',y'],则很明显[x,y]和[x',y']被分配给同一组。否则,间隔[x,y]在[x',y']之前排序,因为x&lt; x',或x = x'和y'&lt;年。扫描[x',y']时有效的包围区间[x'',y'']满足x''&lt; = x'(按排序顺序)和y'&lt; = y&lt; = y''(因为活动封闭间隔的y坐标随时间不减小)。因此,[x',y']不会启动一个组。

答案 1 :(得分:0)

按x-y最大值(离线)的大小对输入组进行排序。

浏览组列表,并为每个组检查它是否包含在其中的一个组中。 如果是这样 - 将其从列表中删除并将其标记在文件中(文件说明很快) 如果不是 - 这是一个小组

文件: 保留根据输入列表中组的索引命名的文件结构。 随时创建文件,并在任何文件中保留所有(x,y)对。

这会给你一个相对好的答案,但我不确定它是否是最佳答案。

时间:

  • sort = o(nlogn)
  • 在最坏的情况下(如果没有组相交),通过列表最多可以达到o(n ^ 2)

答案 2 :(得分:0)

这可能是简单化的,但基于你给出的假设应该是恰当的。假设输入数据是无限的未知流/队列

  1. 从队列中取物品。
  2. 如果第一个创建新组。
  3. 如果不是第一个遍历现有组并进入第一个匹配组。
  4. 如果无法放入任何群组中创建新群组
  5. 重复这个过程
  6. 您可以在此处应用其他限制(最大组大小等)

答案 3 :(得分:0)

这个怎么样:

  1. 使用范围start(第一个元素)对间隔进行排序。

  2. 从排序集中获取第一个间隔。把它留在记忆中。添加到列表中。

  3. while(接下一个)

        a. it can be fully inclusive in any of the elements in the list, add it to the group of contained interval.
        b. Partial inclusive, add a new member in memory. append it to the list.
        c. totally Exclusive, add it to the list, remove previous elements in the list and persist in disk.