确定等价类的算法

时间:2014-03-07 14:55:13

标签: algorithm

相当一般的问题。我有一个这样的清单:

A B  
A C  
C A   
D E  
F G   
E F  
C L  
M N  

等等。

我想做的是弄清楚所有关系并将所有相关的内容放在一行中。上面的例子将成为:

A B C L   
D E F G  
M N      

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

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

2 个答案:

答案 0 :(得分:5)

解决此问题的一种方法是使用无向图G =(V,E)。输入中的每一对代表E中的一条边,您想要的输出是G的connected components。有一些很棒的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

答案 1 :(得分:2)

https://en.wikipedia.org/wiki/Connected_component_(graph_theory)

(但不要过多担心他们建议的算法,因为你有一个边缘列表,而他们认为你没有。)

让我们将一个字母称为Node,将一组节点称为Component。给定边缘列表,您需要生成一组组件。

首先,将节点映射到组件:

Map<Node, Component> map.

然后:

For each edge E:
    For each node N in E (i.e. all two of them):
        Component c = map.get (N)
        if c doesn't exist then:
            c = new Component
            map.put (N, c)

        c.add (N)

For each Component C in map.values ():
    Print (sort C's nodes)