确定等价类的算法

ozh*_*gin 4 algorithm

相当一般的问题.我有一个这样的列表:

A B  
A C  
C A   
D E  
F G   
E F  
C L  
M N  
Run Code Online (Sandbox Code Playgroud)

等等.

我想做的是弄清楚所有的关系,把所有相关的东西放在一行.上面的例子将成为:

A B C L   
D E F G  
M N      
Run Code Online (Sandbox Code Playgroud)

这样每个字母只出现一次,并且彼此相关的字母在一行中显示(列表,数组,等等).

这是一个定义明确的算法的某种已知问题吗?它有名字吗?听起来应该是这样.我假设应该采用某种递归解决方案.

mdm*_*dml 5

解决此问题的一种方法是使用无向图G =(V,E).输入中的每一对代表E中的边,您想要的输出是G 的连接组件.有一些很棒的Python图模块,如NetworkX.

演示

>>> data
[['A', 'B'], ['A', 'C'], ['C', 'A'], ['D', 'E'], ['F', 'G'], ['E', 'F'], ['C', 'L'], ['M', 'N']]
>>> import networkx as nx
>>> G = nx.Graph()
>>> G.add_edges_from( data )
>>> components = nx.connected_components( G )
>>> print "\n".join([ " ".join(sorted(cc)) for cc in components ])
A B C L
D E F G
M N
Run Code Online (Sandbox Code Playgroud)