我编写了一个程序来查找给定项目列表的所有可能排列。这恰好意味着我的程序会打印出r = 0至n的所有可能的P(n,r)值
下面是代码: ``
package com.algorithm; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; public class Permutations<T> { public static void main(String args[]) { Permutations<Integer> obj = new Permutations<Integer>(); Collection<Integer> input = new ArrayList<Integer>(); input.add(1); input.add(2); input.add(3); Collection<List<Integer>> output = obj.permute(input); int k = 0; Set<List<Integer>> pnr = null; for (int i = 0; i <= input.size(); i++) { pnr = new HashSet<List<Integer>>(); for(List<Integer> integers : output){ pnr.add(integers.subList(i, integers.size())); } k = input.size()- i; System.out.println("P("+input.size()+","+k+") :"+ "Count ("+pnr.size()+") :- "+pnr); } } public Collection<List<T>> permute(Collection<T> input) { Collection<List<T>> output = new ArrayList<List<T>>(); if (input.isEmpty()) { output.add(new ArrayList<T>()); return output; } List<T> list = new ArrayList<T>(input); T head = list.get(0); List<T> rest = list.subList(1, list.size()); for (List<T> permutations : permute(rest)) { List<List<T>> subLists = new ArrayList<List<T>>(); for (int i = 0; i <= permutations.size(); i++) { List<T> subList = new ArrayList<T>(); subList.addAll(permutations); subList.add(i, head); subLists.add(subList); } output.addAll(subLists); } return output; } }
输出量
P(3,3) : Count (6) :- [[1, 2, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2], [2, 1, 3], [1, 3, 2]] P(3,2) : Count (6) :- [[3, 1], [2, 1], [3, 2], [1, 3], [2, 3], [1, 2]] P(3,1) : Count (3) :- [[3], [1], [2]] P(3,0) : Count (1) :- [[]]
我的问题是,随着我增加输入列表中的数字。运行时间增加,并且在输入列表中输入11个数字后,程序几乎消失了。运行大约需要2 GB内存。
我正在具有8GB RAM和i5处理器的计算机上运行此程序,因此速度和空间不是问题。
如果有人可以帮助我编写更高效的代码,我将不胜感激。
如果您希望所有15位或更多元素的排列,请将它们写到磁盘或db之类的东西,因为它们不适合内存。编辑:Steinhaus–Johnson–Trotter算法。这可能是您要寻找的。