Finde alle Kombinationen von zwei Arrays

8

Ich versuche, die ganze Kombination von zwei Arrays zu finden, aber mit einer wichtigen Variation:

  

Jeder Wert des zweiten Arrays muss über die Werte des ersten verteilt werden. Daher werden immer alle Werte des zweiten Arrays verwendet.

Gegeben diese zwei Arrays:

%Vor%

Ich erwarte eine Sammlung der folgenden Ergebnisse:

%Vor%

Bearbeiten:

Also nur um klar zu sein. Dies muss für beide Arrays skaliert werden.

Gegebene Arrays:

%Vor%

Einige der (viele, viele mögliche) Ergebnisse wären:

%Vor%     
SaphuA 29.07.2015, 13:50
quelle

5 Antworten

11

Lösung für jeden Parameter (solange das Ergebnis zählbar ist)

Bearbeiten : Diese Version vermeidet ein mögliches Problem mit len = Math.pow(left.length, right.length) und das Problem mit der Länge über 36 (cnr!).

  

Wie es funktioniert:

     

Beispiel: combine(['A', 'B'], [1, 2, 3]) alle möglichen Zeilen sind 2 ^ 3 = 8. Die Verteilung ist in diesem Beispiel binär, aber mit mehr Parametern von left ändert sie die Basis.

%Vor%      

Die Verteilung i = 3 von 0 1 1 wird wie folgt ausgewertet:

     
  1. Nimm das erste 0 und nimm es als Index des linken left[0] = A und verschiebe den Platzwert von 0 von rechts right[0] = 1 auf A.
  2.   
  3. Nimm das zweite 1 und nimm es als Index des linken left[1] = B und verschiebe den Place-Wert von 1 des rechten right[1] = 2 auf B.
  4.   
  5. Nimm das dritte 1 und nimm es als Index des linken left[1] = B und verschiebe den Platzwert von 2 von right right[2] = 3 auf B.
  6.   

Ein anderes Beispiel: combine(['A', 'B', 'C'], [1, 2]) Alle möglichen Zeilen sind 3 ^ 2 = 9.

%Vor%

%Vor% %Vor%
    
Nina Scholz 29.07.2015, 15:02
quelle
1

Ich schlage vor, genau das zu programmieren, wonach Sie fragen:

%Vor%

Ausgabe:

%Vor%     
גלעד ברקן 29.07.2015 17:56
quelle
1

Ich denke, ich habe eine mögliche Lösung gefunden, aber ich bin mir sicher, dass es bei weitem nicht effizient ist.

Gegeben die Arrays:

%Vor%

Erstellen Sie zuerst eine Potenzmenge von rechts :

%Vor%

Dann haben Sie für jeden Wert in left verschachtelte Schleifen. Jede Schleife prüft, ob der Wert bereits in der vorherigen Schleife ist und die letzte Schleife prüft auch, ob alle Werte vorhanden sind.

In psuedo würde das ungefähr so ​​aussehen:

%Vor%

Bearbeiten

Hier ist diese beschissene ineffiziente Lösung in Javascript. Veröffentlichen Sie es für den Abschluss Willen.

Ссылка

%Vor%     
SaphuA 29.07.2015 15:56
quelle
0

Ich glaube, dass Ihr Problem so umformuliert werden kann: Erzeugen Sie alle möglichen Zuweisungen von Labels in left zu den Elementen in right . Dies ist ein Standard-Backtracking-Problem.

Die Anzahl der Lösungen ist l ^ r (da Sie jedem Element unabhängig voneinander beliebige Beschriftungen zuweisen können), wobei l die Anzahl der Elemente in links und r ist die Anzahl der Elemente in rechts .

Ich werde eine rekursive Lösung bereitstellen, die Sie vielleicht auf nicht-rekursive Weise umschreiben können, obwohl dies nicht die Komplexität des Algorithmus (vielleicht die Konstante) verringert. Es gibt eigentlich keine Möglichkeit, die Komplexität zu verringern, da Sie irgendwann jede Lösung generieren müssen. Also teste es nicht für l = 20 und r = 20 , probiere kleinere Zahlen aus: p

%Vor%     
cobarzan 29.07.2015 16:19
quelle
0

Nur zur Veranschaulichung, das ist eine Version von @ NinaScholz Antwort, die toString für die Basiskonvertierung nicht verwendet oder Zählen manuell durchführen. Ich habe die Struktur der. Behalten gleich codieren. values.length-i-1 könnte einfach 'ich' sein, aber Ich wollte auch die Reihenfolge der Ausgabe beibehalten.

%Vor% %Vor%
    
1983 01.08.2015 11:01
quelle