2014-05-15 69 views
-3

有关N个节点的完整图,有(N -1)!独特的完美匹配。我如何在Java中实现一种方法来枚举所有的唯一匹配?列举完整匹配的完整图

示例输出为Ñ = 4

[ (0,1), (2,3) ] 
[ (0,2), (1,3) ] 
[ (0,3), (1,2) ] 

示例输出为Ñ = 6

[ (0,1),(2,3),(4,5) ] 
[ (0,1),(2,4),(3,5) ] 
[ (0,1),(2,5),(3,4) ] 
[ (0,2),(1,3),(4,5) ] 
[ (0,2),(1,4),(3,5) ] 
[ (0,2),(1,5),(3,4) ] 
[ (0,3),(1,2),(4,5) ] 
[ (0,3),(1,4),(2,5) ] 
[ (0,3),(1,5),(2,4) ] 
[ (0,4),(1,2),(3,5) ] 
[ (0,4),(1,3),(2,5) ] 
[ (0,4),(1,5),(2,3) ] 
[ (0,5),(1,2),(3,4) ] 
[ (0,5),(1,3),(2,4) ] 
[ (0,5),(1,4),(2,3) ] 
+0

我想这是一个请求的算法,而不是它的实现? –

+0

@ggovan他们是完整的图表,只列举了完美的匹配。参见[维基百科的双因子文章](http://en.wikipedia.org/wiki)中的[this chord diagram](http://upload.wikimedia.org/wikipedia/commons/0/06/Chord_diagrams_K6_matchings.svg)/Double_factorial) – saik0

+0

@AlexeyMalev是的,但作为一名新手/中级开发人员,我最熟悉的语言实现将帮助我更好地使用伪代码。 – saik0

回答

1

我迅速敲起来Scala程序要做到这一点,然后transpiled到Java 。所以这不太好。

地图在这里用作对的列表。

/** 
* 
* @param nodes The nodes still to be added to our edge list. 
* @param edges The current edge list. This is mutated, so always return a clone! 
*/ 
public static <N> List<Map<N,N>> enumerateEdges(List<N> nodes,Map<N,N> edges){ 
    if(nodes.isEmpty()) // No more nodes to create edges from, so return our current edge list in a new list. 
     return Collections.singletonList(new HashMap<>(edges)); 


    N start = nodes.get(0); //The start node of our next pair. 

    List<Map<N,N>> acc = new LinkedList<>(); //The accumulation of the EdgeLists 

    for(int i = 1; i<nodes.size(); ++i){ 

     N end = nodes.get(i); //The end node of our pair 
     edges.put(start,end); //Add this pair to our edge list 

     List<N> unused = new ArrayList<>(nodes); // The nodes not used in our edge list. 
     unused.remove(i); 
     unused.remove(0); 

     acc.addAll(enumerateEdges(unused,edges)); 

     edges.remove(start); //Remove this pair from our edge list. 
    } 

    return acc; 
} 

更可以与蓄电池/尾递归/ lazyness来完成,以提高性能。但是,这工作。

与调用它:

List<Map<Integer,Integer>> results = enumerateEdges(Arrays.asList(0,1,2,3),new HashMap<>()); 
+0

啊,我最初的尝试与此非常相似。我没有在循环中删除这对,并且得到的输出与我在纸上做的时候得到的结果完全不同。 – saik0