相当一般的问题。我有一个这样的清单:
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
这样每个字母只出现一次,并且彼此相关的字母在一行中开启(列表,数组,等等)。
这是一种定义明确的算法的某种已知问题吗?它有名字吗?听起来应该是这样。我假设应该采用某种递归解决方案。
答案 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)