相互置换算法

时间:2014-08-29 01:42:29

标签: algorithm sorting math permutation combinatorics

我有一组元素,比如说

  

A1,B1,B2。

这里,a和b分别属于两类元素。我想要一个算法来列出这两个类之间的所有安排。例如,

  

{a1 b1},{a1 b2},{b1 a1},{b2 a1}。

请注意,

1)应避免同一类别中元素之间的安排,

2)班级数可能大于2,

3)属于不同类别的元素数量可能不相同。

提前致谢!

3 个答案:

答案 0 :(得分:2)

你可以使用python的itertools.product来做到这一点:

import itertools as itl
la = ['a1']
lb = ['b1', 'b2']
print list(itl.chain(itl.product(la, lb), itl.product(lb, la)))

输出是:

[('a1', 'b1'), ('a1', 'b2'), ('b1', 'a1'), ('b2', 'a1')]

答案 1 :(得分:0)

如果您不过分关注效率,可以执行类似(Python)

的操作
def mutualperms(lst, prefix=()):
    if lst:
        for x in lst:
            yield from mutualperms([y for y in lst if not sameclass(x, y)],
                                   prefix + (x,))
    else:
        yield prefix

(如果您不熟悉Python生成器,请将yield视为print并忽略yield from。)

这是一个Java版本。

import java.util.*;

public class MutualPerms {
    private static boolean sameClass(String arg1, String arg2) {
        return arg1.charAt(0) == arg2.charAt(0);
    }

    private static void mutualPerms(Deque<String> prefix,
                                    Collection<String> args) {
        if (args.isEmpty()) {
            for (String arg: prefix) {
                System.out.print(arg);
                System.out.print(' ');
            }
            System.out.println();
        } else {
            for (String arg1: args) {
                prefix.addLast(arg1);
                Collection<String> subargs = new ArrayList<String>();
                for (String arg2: args) {
                    if (!sameClass(arg1, arg2)) {
                        subargs.add(arg2);
                    }
                }
                mutualPerms(prefix, subargs);
                prefix.removeLast();
            }
        }
    }

    public static void main(String[] args) {
        mutualPerms(new LinkedList<String>(), Arrays.asList(args));
    }
}

答案 2 :(得分:0)

对于k = 2(班级数)的情况:

1)将K1中的第一个元素与K2中的每个元素相匹配

2)为每个这样的匹配创建所有排列

3)将所有排列添加到最终列表

4)继续使用K1中剩余的元素

对于k>的情况; 2你需要扩展这个,这样你首先从K1中获取第一个元素,K2中的第一个元素,然后是K3中的剩余元素(或者在K3中的第一个元素,并继续使用K4,..,Kn)。