对连接的值对进行分组

时间:2017-12-01 21:32:40

标签: algorithm grouping

我有一个包含唯一值对 x y 的列表;例如:

x      y
--     --
1      A
2      A
3      A
4      B
5      A
5      C
6      D
7      D
8      C
8      E
9      B
9      F
10     C
10     G

我想按如下方式划分这个对列表:

Group 1
1      A
2      A
3      A
5      A
5      C
8      C
10     C
8      E
10     G

Group 2
4      B
9      B
9      F

Group 3
6      D
7      D

第1组包含

  • y =' A' (1-A,2-A,3-A,5-A)
  • x =任何 x 以上(5-C)的任何其他对
  • y =任何 y 以上(8-C,10-C)的任何其他对
  • x =任何 x 以上(8-E,10-G)
  • 的任何其他对

第2组中的配对不能以第1组中的任何配对方式到达,第3组中的配对也不能从第1组或第2组到达。

如第1组所述,连接链可以任意长。

我正在使用Perl探索解决方案,但任何类型的算法(包括伪代码)都可以。为简单起见,假设所有数据都适合内存中的数据结构。

[更新] 因为我需要将此方法应用于53亿对,因此可扩展性对我来说非常重要。

2 个答案:

答案 0 :(得分:1)

选择一个起点。找到从中可以到达的所有点,从主列表中删除。重复所有添加的点,直到无法再达到。移动到下一组,从另一个剩余点开始。继续,直到你没有剩余的分数。

pool = [(1 A), (2 A), (3 A), (4 B), ... (10 G)]
group_list = []
group = []
pos = 0

while pool is not empty
    group = [ pool[0] ]   # start with next available point
    pos = -1

    while pos+1 < size(group)  // while there are new points in the group
        pos += 1
        group_point = group[pos]    // grab next available point
        for point in pool           // find all remaining points reachable
            if point and group_point have a coordinate in common
                remove point from pool
                add point to group

    // we've reached closure with that starting point
    add group to group_list

return group_list

答案 1 :(得分:1)

您可以将字母和数字视为图形的节点,将对视为边缘。将此图表划分为线性时间内的连通分量。

带有'A'的连接组件形成组1.其他连接组件构成其他组。