Hi,
ich hab mal wieder was ;-)
Zu meinem Problem. Den folgenden Java-Code habe ich geschrieben, um sämtliche Permutationen einer Zahlenfolge zu bestimmen.
Aus 123 wird also: 1,2,3,12,21,13,31,23,32,123,132,213,231,312,321
Bis neun Ziffern klappt das ganze ganz gut, aber bei allem darüber hinaus bricht das System zusammen. Also die Laufzeit wird astronomisch, bzw. Eclipse schmiert komplett ab.
Ich vermute mal das es an der verketteten ArrayListe liegt. Habt ihr da Ideen welcher Speichertyp empfehlenswert wäre? Ich hatte es schon überlegt Mengen, also java.util.Set zu nehmen. Aber dann habe ich das Problem das keine Duplikate vorkommen dürfen. Also 21 würde im obrigen Beispiel z.B. rausfallen.
Naja, vielleicht habt ihr ja ne Idee zur optimierung.
Lg.
Nico
Edit: Der interessante Teil beginnt ab Zeile 40
ich hab mal wieder was ;-)
Zu meinem Problem. Den folgenden Java-Code habe ich geschrieben, um sämtliche Permutationen einer Zahlenfolge zu bestimmen.
Aus 123 wird also: 1,2,3,12,21,13,31,23,32,123,132,213,231,312,321
Bis neun Ziffern klappt das ganze ganz gut, aber bei allem darüber hinaus bricht das System zusammen. Also die Laufzeit wird astronomisch, bzw. Eclipse schmiert komplett ab.
Ich vermute mal das es an der verketteten ArrayListe liegt. Habt ihr da Ideen welcher Speichertyp empfehlenswert wäre? Ich hatte es schon überlegt Mengen, also java.util.Set zu nehmen. Aber dann habe ich das Problem das keine Duplikate vorkommen dürfen. Also 21 würde im obrigen Beispiel z.B. rausfallen.
Naja, vielleicht habt ihr ja ne Idee zur optimierung.
Lg.
Nico
Edit: Der interessante Teil beginnt ab Zeile 40
Java:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
public class Permutation {
private static int endIndex;
private static ArrayList<ArrayList> list = new ArrayList<ArrayList>();
public static ArrayList<ArrayList> permutation(int count) {
Set<Set<Integer>> subSets = SubSets.createSubSets(count);
list = new ArrayList<ArrayList>();
String s = new String();
Iterator it1 = subSets.iterator();
while (it1.hasNext()) {
s = new String();
Set localSet = (Set) it1.next();
Iterator it2 = localSet.iterator();
while (it2.hasNext()) {
s = s + it2.next().toString();
}
endIndex = s.length() - 1;
permut(s.toCharArray(), endIndex);
}
return list;
}
private static void swap(char[] a, int i, int j) {
char local = a[i];
a[i] = a[j];
a[j] = local;
}
private static void permut(char[] a, int endIndex) {
if (endIndex == 0) {
ArrayList<Integer> set = new ArrayList<Integer>();
for (char c : a) {
set.add(Integer.parseInt(String.valueOf(c)));
}
list.add(set);
} else {
permut(a, endIndex - 1);
for (int i = 0; i <= endIndex - 1; i++) {
swap(a, i, endIndex);
permut(a, endIndex - 1);
swap(a, i, endIndex);
}
}
}
}
Zuletzt bearbeitet: