我有一组元素,比如说
A1,B1,B2。
这里,a和b分别属于两类元素。我想要一个算法来列出这两个类之间的所有安排。例如,
{a1 b1},{a1 b2},{b1 a1},{b2 a1}。
请注意,
1)应避免同一类别中元素之间的安排,
2)班级数可能大于2,
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)。