我编写了一个程序来查找给定项目列表的所有可能的排列.这恰恰意味着我的程序打印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 {
public static void main(String args[]) {
Permutations obj = new Permutations();
Collection input = new ArrayList();
input.add(1);
input.add(2);
input.add(3);
Collection> output = obj.permute(input);
int k = 0;
Set> pnr = null;
for (int i = 0; i <= input.size(); i++) {
pnr = new HashSet>();
for(List 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> permute(Collection input) {
Collection> output = new ArrayList>();
if (input.isEmpty()) {
output.add(new ArrayList());
return output;
}
List list = new ArrayList(input);
T head = list.get(0);
List rest = list.subList(1, list.size());
for (List permutations : permute(rest)) {
List> subLists = new ArrayList>();
for (int i = 0; i <= permutations.size(); i++) {
List subList = new ArrayList();
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处理器的机器上运行它,因此速度和空间不是问题.
如果有人能帮我写一个更有效的代码,我将不胜感激.