我有很多间隔(x,y),我想将它们组合在一起。规则是如果一组区间全部嵌套在组的一个成员中,则它们位于同一组中,除了它们全部嵌套的最大区间之外。例如,(1,7),(2, 4),(2,9),(8,9)可分为两组(1,7),(2,4)和(2,9),(8,9)。当然,这并不是唯一的,但在你不能拥有更少的团体的意义上它是最小的。
为了使它变得更复杂,我不能一次读取所有数据,因为它太大了。
我可以通过每对中的第一个元素离线对数据进行排序,例如。
这个问题的优秀算法是什么?
答案 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)对。
这会给你一个相对好的答案,但我不确定它是否是最佳答案。
时间:
答案 2 :(得分:0)
这可能是简单化的,但基于你给出的假设应该是恰当的。假设输入数据是无限的未知流/队列
您可以在此处应用其他限制(最大组大小等)
答案 3 :(得分:0)
这个怎么样:
使用范围start(第一个元素)对间隔进行排序。
从排序集中获取第一个间隔。把它留在记忆中。添加到列表中。
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.