Code Java pour les permutations d'une liste de nombres

J'ai écrit un programme pour trouver toutes les permutations possibles d'une liste d'éléments. Cette précision signifie que mon programme affiche tous les possibles P(n,r) pour r=0 à n

Ci-dessous le code:

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;
}
}

Sortie

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) :- [[]]

Mon problème, c'est que je vais augmenter le nombre dans la liste d'entrée. Temps d'exécution augmente et après 11 numéros dans la liste de saisie, le programme meurt presque. Prend environ 2 GO de mémoire pour exécuter.

Je suis en cours d'exécution sur une machine ayant 8GO de RAM et processeur i5, de sorte que la vitesse et de l'espace n'est pas un problème.

Je vous serais reconnaissant, si quelqu'un peut m'aider à écrire un code plus efficace.

Mieux adapté à http://codereview.stackexchange.com/.
merci 🙂 je suis nouveau sur ce donc, ne pas avoir des idées où mettre quoi.

OriginalL'auteur dharam | 2012-05-08