我有一个包含唯一值对 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组包含
第2组中的配对不能以第1组中的任何配对方式到达,第3组中的配对也不能从第1组或第2组到达。
如第1组所述,连接链可以任意长。
我正在使用Perl探索解决方案,但任何类型的算法(包括伪代码)都可以。为简单起见,假设所有数据都适合内存中的数据结构。
[更新] 因为我需要将此方法应用于53亿对,因此可扩展性对我来说非常重要。
答案 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.其他连接组件构成其他组。