这是问题的主旨:给出一组集合,例如:
[ (1,2,3), (5,2,6), (7,8,9), (6,12,13), (21,8,34), (19,20) ]
Run Code Online (Sandbox Code Playgroud)
返回集合组的列表,以便具有共享元素的集合位于同一组中.
[ [ (1,2,3), (5,2,6), (6,12,13) ], [ (7,8,9), (21,8,34) ], [ (19,20) ] ]
Run Code Online (Sandbox Code Playgroud)
注意stickeyness - 集合(6,12,13)没有与(1,2,3)共享的元素,但由于(5,2,6)它们被放在同一个组中.
更复杂的是,我应该提到我并不是真的有这些整洁的集合,而是一个包含数百万行的DB表,如下所示:
element | set_id
----------------
1 | 1
2 | 1
3 | 1
5 | 2
2 | 2
6 | 2
Run Code Online (Sandbox Code Playgroud)
等等.所以我希望能在SQL中做到这一点,但我会对解决方案的总体方向感到满意.
编辑:将表列名称更改为(element,set_id)而不是(key,group_id),以使术语更加一致.请注意,Kev的答案使用旧的列名称.
问题恰恰是超图的连通分量的计算:整数是顶点,而集合是超边界.计算连接组件的常用方法是一个接一个地泛滥它们:
其中flood_from(i,j)将被定义为
然后,集合的标签为您提供所需的连接组件.
在数据库方面,算法可以表示如下:向数据库添加TAG列,然后通过执行来计算集合i的连通组件
呈现此算法的另一种(理论)方式是说您正在寻找映射的固定点:
然后,如果S是一个集合,则通过在S上迭代(入射)o(并集)直到达到一个固定点来获得S的连通分量:
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |