我有一些复杂的计算算法,基本上可以测试一些较小的矩阵是否适合另一个较大的矩阵。 是否所有矩阵都适合大矩阵,取决于小矩阵的顺序。如果小矩阵不合适,则应重新排列ArrayList并重试,直到测试了所有可能的顺序/序列为止。
如果我有5个小矩阵,则总共有 5个! (= 120)数组可以有的订单。
我的问题是我不知道如何重新排列这些对象(矩阵),因此我可以测试所有可能的顺序。我希望有人可以帮助我吗?
对于n对象,存在n!排列。考虑一组:
n
n!
S = {a1, a2, a3 ..., an};
查找以上集合的置换的算法可以是:
foreach(item i : S) { /* all other item except i1 and i */ foreach(item i1 : S - {i}) { foreach(item i2 : S - {i, i1}) { . . . foreach(item in : S - {i, i2, .... in-1}) { /* permutation list */ P = { i1, i2, ...., in-1, in }; } } } }
显然,我们没有n for循环,但是可以递归构造此算法,直到获得nlist中的元素P。以下是使用上述算法进行置换的实际Java代码:
for
P
public static void permutations(Set<Integer> items, Stack<Integer> permutation, int size) { /* permutation stack has become equal to size that we require */ if(permutation.size() == size) { /* print the permutation */ System.out.println(Arrays.toString(permutation.toArray(new Integer[0]))); } /* items available for permutation */ Integer[] availableItems = items.toArray(new Integer[0]); for(Integer i : availableItems) { /* add current item */ permutation.push(i); /* remove item from available item set */ items.remove(i); /* pass it on for next permutation */ permutations(items, permutation, size); /* pop and put the removed item back */ items.add(permutation.pop()); } }
这是主要方法:
public static void main(String[] args) { // TODO Auto-generated method stub Set<Integer> s = new HashSet<Integer>(); s.add(1); s.add(2); s.add(3); permutations(s, new Stack<Integer>(), s.size()); }
它打印了结果:
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]