Alle Möglichkeiten n Elemente Anzuordnen.

Status
Nicht offen für weitere Antworten.
G

Gauo

Gast
Mein Problem ist folgendes:
Ich habe n Verschiedene Elemente und eine zahl k.
Ich will nun alle Permutationen dieser n Elemente der Länge k haben.
Ich hab nun schon einige Algorithmen dazu im Internet gefunden und auch ihre implemenationen in Java, aber irgendwie funktionierten sie nur soweit, dass man irgendwie die die Objekte concat konnte...z.bString....
aber ich will nun am besten eine LinkedList<int[]> wo nun alle drin sind und dazu bekomm ich keine rekursion hin.
Ich hoffe jemand kann mir n tip geben oder n Rekursions ansatz
 

Marco13

Top Contributor
Wenn man eine Weile im Web sucht, findet man bestimmt Algorithmen, die das "auf einen Schlag" erledigen können. Vielleicht kannst du auch ein Beispiel für einen Algorithmus angeben, der "prinzipiell" macht, was du willst, und dann genau sagen, warum du den nicht auf dein Problem übertragen konntest.

Bis dahin schreibe ich mal spontane Gedanken :wink:

Ich würde das aufteilen in zwei Aufgaben:
1. Alle k-Elementigen Teilmengen der gegebenen Menge bestimmen
2. Für jede Teilmenge alle Permutationen bestimmen

Für das zweite bietet sich sowas an wie
http://en.wikipedia.org/wiki/Permutation#Algorithm_to_generate_permutations

Für das erste könnte man, bildlich gesprochen, die n Elemente nebeneinander schreiben, und die k Elemente markieren, die man gerade "ausgewählt" hat.
Man macht also Kreuzchen unter die ersten k Elemente.
Dann schiebt man das letzte Kreuzchen Schrittweise nach rechts, bis man am Ende ist.
Dann schiebt man das VORletzte Kreuzchen einen Schritt nach rechts, und setzt das letzte rechts daneben.
Dann schiebt man das letzte Kreuzchen Schrittweise nach rechts, bis man am Ende ist.
Dann schiebt man das VORletzte Kreuzchen einen Schritt nach rechts, und setzt das letzte rechts daneben.
...
Dann schiebt man das VOR-VORletzte Kreuzchen einen Schritt nach rechts, und setzt das VOR-letzte rechts daneben, und das letzte rechts daneben.
Dann schiebt man das letzte Kreuzchen Schrittweise nach rechts, bis man am Ende ist.
Dann schiebt man das VORletzte Kreuzchen einen Schritt nach rechts, und setzt das letzte rechts daneben.
...
Beispiel: 3 aus 6:
Code:
0 1 2 3 4 5
X X X  
X X   X  
X X     X  
X X       X  
X   X X  
X   X   X  
X   X     X  
X     X X  
X     X   X  
...
      X X X
Ugetesteter(!!!), schnell hingeschriebener(!!!) Pseudocode
Code:
// 'selected' enthält die "Kreuzchen" (am Anfang sind die ersten k kreuzchen gesetzt), x ist am anfang k
boolean nextSubset(boolean selected[], int k, int x) 
{
    if (x==-1) 
    {
        return false;
    }
    else
    {
          int toShift = findeDieStelleAnDerDas_x_teKreuzchenGesetztIst();
          if (toShift == selected.length-1)
          {
               nextSubset(selected, k, x-1);
               setzeDas_x_teKreuzchenRechtsNebenDas_x-1_te();
          }
          else
          {
               schiebeDasKreuzchenBei_toShift_um1nachRechts();
          }
    }
    return true;
}
Solange 'true' zurückgeliefert wurde, konnte noch eine neue Teilmenge gefunden werden. Ist aber wirklich nur ins blaue getippt (hab hier gerade kein JDK, kann es nicht testen)

WICHTIG: Vermutlich gibt es "elegantere" Ansätze, die beide Teilaufgaben "auf einmal" erledigen. (Man könnte nämlich auch 'int's statt 'booleans' verwenden, und dann irgendwie mit einer abgewandelten Version des Algorithmus aus Wikipedia direkt die ausgewählten Elemente permutieren). Aber als "Meta-Divide-And-Conquer-Ansatz" finde ich so eine Aufteilung in Teilprobleme ganz hilfreich - solange sie die Anforderungen erfüllt, und nicht zeitaufwändiger ist, als andere Ansätze.
 
G

Gauo

Gast
Danke, ich hab bis jetzt immer nur hinbekommen, wenn k==n ist also ich nur durchnummeriere...
cih werd ma das hier durchkauen und schaun ob ichs hinbekomm.

Zur Not hatte ich vor mit eine Art n-k Baum zu basteln und dann einfach die Wege auszulesen...aber als eigene Datenstruktur, weil ich einfach die übertrag leistung in ne Reksursive Funktion hinbekommen hab ^^
 
G

Gauo

Gast
Code:
public boolean nextSubset(boolean[] selected, int k, int x){
    if(x==-1){
        return false;
    }else{
        int toShift=positionofXthX(selected,x);
        if(toShift==selected.length-1){
            nextSubset(selected,k,x-1);
            shiftX(x);
        }else{
            selected[toShift]=false;
            selected[toShift+1]=true;
        }
        
    }
    return true;
}

public void shiftX(int x){
    int tmp=x;
    for(int i=0;i<selected.length;i++){
        if(selected[i]){
            if(tmp-1==0){
                selected[i+1]=true;
                for(int k=i+2;k<selected.length;k++){
                    if(selected[k]){
                        selected[k]=false;
                        break;
                    }
                }
            }else{
               tmp--;
            }
        }
    }
}
public int positionofXthX(boolean[] selected, int x){
    int tmp=x;
    for(int i=0;i<selected.length;i++){
        if(selected[i]){
            if(tmp==1){
                return i;
            }else{
                tmp-=1;
            }
        }
    }
    return 0;
}

Hier mal meine Umsätzung des Pseudocodes...aber klappt irgendwie noch nicht, sobald halt das True hinten ankommt will er nochmal schieben...ich versuch das mal mit dem Baum -.-
 
G

Guest

Gast
Das Hier Sollte mir doch nun eigentlich das gewünschte Liefern(Achtung n die länge Permutationen und n nun die Anzahl der Objekte)
nun brauche ich ja nur noch die LinkedList zerlegen in Mengen ||=n oda?

Code:
public class Tree {
    private class TreeNode{
        LinkedList<TreeNode> nodes=new LinkedList();
        int key;
        public TreeNode(int keys,int n,int key){
            this.key=key;
            if(n>0){
            for(int i=0;i<keys;i++){
            nodes.add(new TreeNode(keys,n-1,i));
            }
            }
        }
        
        public LinkedList<Integer> getKeys(){
            LinkedList<Integer> muh= new LinkedList();
            muh.add(key);
            for(int i=0;i<nodes.size();i++){
                LinkedList<Integer> temp=nodes.get(i).getKeys();
                while(!temp.isEmpty()){
                    muh.add(temp.poll());
                }
            }
            return muh;
        }
    }

    private LinkedList<TreeNode> anker=new LinkedList();
    public Tree(int keys, int n){
        for(int i=0;i<keys;i++){
            anker.add(new TreeNode(keys,n-1,i));
        }
    }
        public LinkedList<Integer> getKeys(){
            LinkedList<Integer> muh= new LinkedList();
            
            for(int i=0;i<anker.size();i++){
                LinkedList<Integer> temp=anker.get(i).getKeys();
                while(!temp.isEmpty()){
                    muh.add(temp.poll());
                }
            }
            return muh;
        }    
}
 
G

Gauo

Gast
hm...irgendwas mach ich falsch ich bekomm bei Tree(6,4) nur 388 möglichkeiten als |Leaves|/4...aber da sollten 1296 rauskommen :/
 

Leroy42

Top Contributor
Gauo hat gesagt.:
hm...irgendwas mach ich falsch ich bekomm bei Tree(6,4) nur 388 möglichkeiten als |Leaves|/4...aber da sollten 1296 rauskommen :/


lass mich morgen mal basteln,
weile wegen
heut bn ivh zu brdoffen..............
 
G

Gauo

Gast
Das Problem hab ich gestern noch erkannt aber wieder kein Plan wie ich es Löse ^^...die blätter lese ich nähmlich nicht so aus wie ich es tuen sollte, da ich jeden Zwei nur einmal auslese, dabei sollte ich ja jeden Pfad auslesen also die Verzweigungen mehrmals
 
G

Gauo

Gast
ich hab mal die Methode der Nodes geändert
Code:
        public LinkedList<Integer> getKeys(LinkedList<Integer> mau){
            System.out.println("test");
            System.out.println(mau);
            
            if(nodes.size()>0){
            for(int i=0;i<nodes.size();i++){
                int tmp=key;
                mau.add(tmp);
                mau=nodes.get(i).getKeys(mau);
            }}else{
                int tmp=key;
                mau.add(tmp);
                mau.add(null);
            }
            
            return mau;
        }
Jedoch verschluckt er nun immer welche und kommt bei 3,3 auf 21 bei 6,4 auf irgendwas mit 700
 
G

Guest

Gast
Hokay, ein neuer Ansatz und ist wohl nun auch das geworden das ich suche:
Code:
public class Permnator {
    static int k = 6;
    static int n = 4;
    static int[] perm=new int[n];
    
    public static void kElem(int level){
        if(level<n){
        for(int i=0; i<k; i++){
            perm[level]=i;
            kElem(level+1);
            
            
        }
        }else{
            for(int i=0;i<n;i++){
                System.out.print(perm[i]);
            }
            System.out.println();
        }
        
    }
    

    public static void main(String[] args){
        kElem(0);
    }
    
}
 

Marco13

Top Contributor
Hm. Eine Permutation der Ziffern ist das aber nicht. Du müßtest da ja jetzt noch die wegwerfen, die eine Ziffer mehrmals enthalten. Das, was du im Moment machst, ist ziemlich trivial: Du zählst :roll:
Code:
public class Permnator2
{
    static int k = 6;
    static int n = 4;

    public static void main(String[] args)
    {
        for (int i=0; i<1296; i++)
        {
            System.out.println(pad(Integer.toString(i, k)));
        }
    }

    private static String pad(String s) // Von vorne mit '0'en auffüllen
    {
        while (s.length() < n) s="0"+s;
        return s;
    }

}
 
G

Gauo

Gast
naja sry, Permutation war dan wohl etwas vergriffen mit dem Begriff, es dürfen die k elemente doppelt verwendet werden...
also k^n möglichkeiten
 
G

Gauo

Gast
Sollt mich mal reggen sry -.-....
gibt es vielleicht noch eine effizientere möglichkeit?
 

Marco13

Top Contributor
Na also dann - (das ist jetzt aber schon was GANZ anderes - mein Kreuzchen-Gewurschtel ist damit überflüssig, weil das NUR dem Zweck diente, zu verhindern, dass man alle k^n Kombinationen aufstellen muss - das können nämlich (im Vergleich zu denen, in denen jede Ziffer nur einmal vorkommt) verdammt viele sein)

Ich habe deine Lösung jetzt nicht nachvollzogen, aber vielleicht ist sie schon effizient. Kann gut sein. Letztendlich macht man damit aber - wie gesagt - nichts anderes als zu zählen. Schau vielleicht auch mal in
http://www.java-forum.org/de/viewtopic.php?p=293731&highlight=
... das könntest du bestimmt leicht anpassen. Wenn nicht, sag einfach bescheid.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
_user_q Alle Kombinationen von "0000" bis "FFFF" kompakt schrieben Allgemeine Java-Themen 13
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
L Farbverlauf RGB alle Farben Allgemeine Java-Themen 28
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
S Alle Dateinamen ermitteln Allgemeine Java-Themen 22
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
MaxG. Best Practice Alle Kombinationen berechnen Allgemeine Java-Themen 3
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
S Anwendung die alle Abhaengigkeiten einer Library listet..? Allgemeine Java-Themen 5
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
I Alle logs von Logger bekommen Allgemeine Java-Themen 3
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
L Alle möglichen Additionen (Rekursiv) Allgemeine Java-Themen 3
KaffeeFan Methoden replace alle Buchstaben Allgemeine Java-Themen 3
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
F Java Spintax: Alle Kombinationen Erzeugen Allgemeine Java-Themen 2
Sogomn Klassen Alle in eine Klasse Allgemeine Java-Themen 11
P Methoden Alle Kombinationen aus 2 Karten berechnen Allgemeine Java-Themen 2
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
M Zufälligen String generieren und alle 5 Minuten ändern Allgemeine Java-Themen 2
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
C SwingWorker.cancle(true) tötet alle Worker Allgemeine Java-Themen 3
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
T Alle Instancen einer Klasse auflisten Allgemeine Java-Themen 13
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
brunothg Alle Kombiationen von n Ziffern Allgemeine Java-Themen 2
M Erste Schritte alle xmlFiles in zugehörige pdfFiles einlesen Allgemeine Java-Themen 4
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
E Logger loggt nicht alle Level Allgemeine Java-Themen 2
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K String: alle X Zeichen Zeilenumbruch Allgemeine Java-Themen 3
F Alle Exceptions abfangen Allgemeine Java-Themen 4
nrg JS als ScriptEngine - alle Punkte ersetzen Allgemeine Java-Themen 4
A Bildschirmauflösung geändert - alle Bildschirminhalte verschoben - was tun? Allgemeine Java-Themen 7
C Alle Klassen eines Packages lesen und instanzieren? Allgemeine Java-Themen 9
B Alle Exceptions auf einmal abfangen Allgemeine Java-Themen 4
S Warum packt er nicht alle Dateien? Allgemeine Java-Themen 13
J Alle Tage eines Jahres Allgemeine Java-Themen 2
AlexSpritze Alle Domains oder FQDN von einem Server erfragen? Allgemeine Java-Themen 2
Spot84 alle kombinationen einer string arraylist Allgemeine Java-Themen 2
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
J Konstrukt um alle Paare und Tripel einer Punkte-Menge bilden Allgemeine Java-Themen 12
B Alle möglichen Buchstabenkombinationen in einem String Allgemeine Java-Themen 7
P alle zusammanhaengenden teilgraphen Allgemeine Java-Themen 7
A alle nicht-dplikate finden Allgemeine Java-Themen 14
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
E Alle unter Prozesse der beim schließen mit schließen Allgemeine Java-Themen 3
A An alle Cracks: Anwendung beenden mit ShutdownHook? Allgemeine Java-Themen 13
J Logger gibt nicht alle Level aus Allgemeine Java-Themen 3
M alle möglichen Zahlenkombinationen Allgemeine Java-Themen 5
B in welchem verzeichnis liegen alle installierten klassen? Allgemeine Java-Themen 6
hdi Für alle fleissigen Helfer! Allgemeine Java-Themen 15
N Alle Fehler ausgeben? Allgemeine Java-Themen 4
J Zweiter Prozess der alle x Sekunden etwas abfragen soll Allgemeine Java-Themen 2
O Auf alle Events reagieren Allgemeine Java-Themen 3
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
U alle Dateien eines Ordners innerhalb einer JAR auflisten Allgemeine Java-Themen 6
S toString() für alle Member einer Klasse. Allgemeine Java-Themen 6
G Alle möglichen Konfigurationen eines Baumes Allgemeine Java-Themen 4
C Alle Möglichen Substrings der Länge k aus String extrahieren Allgemeine Java-Themen 9
C Alle Bilder eines binären Arrays ausgeben Allgemeine Java-Themen 3
G Alle möglichen Permutationen einer Folge n Allgemeine Java-Themen 3
V Alle Klassen eines Package auflisten? Allgemeine Java-Themen 6
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
@ RegEx: Alle Sonderzeichen ausser dem Punkt Allgemeine Java-Themen 4
G Alle Möglichen Kombinationen einer Liste Allgemeine Java-Themen 11
H Alle möglichen Hochkommata ausschließen Allgemeine Java-Themen 6
M Gibt es ein Jar - das alle Componente Automatisch anpasst? Allgemeine Java-Themen 14
K Suche alle Objekte einer bestimmten Klasse Allgemeine Java-Themen 2
N Unter Mac Os X alle laufenden Prozesse ausgeben Allgemeine Java-Themen 3
S Änderung an Proberties datei an alle User weitergeben? Allgemeine Java-Themen 7
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
der JoJo [TreeSelection] wie bekomme ich alle Elemente Allgemeine Java-Themen 4
G Alle Zeichen des Alphabets ausgeben Allgemeine Java-Themen 4
0 Alle Teiler einer Zahl performant berechnen? Allgemeine Java-Themen 9
O Warten bis alle gestarteten Threads beendet sind? Allgemeine Java-Themen 6
G HTML file Alle relativen URL in absolute URL umschreiben? Allgemeine Java-Themen 12
D FileWriter, PrintWriter und wie sie alle heißen. Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben