Generieren von Permutationen von JavaScript-array
Habe ich ein array von n verschiedenen Elementen in javascript, ich weiß, es gibt n! mögliche Wege, um diese Elemente. Ich will wissen, was am effektivsten (schnellsten) Algorithmus zur Generierung aller möglichen Ordnungen von diesem array?
Habe ich diesen code:
var swap = function(array, frstElm, scndElm) {
var temp = array[frstElm];
array[frstElm] = array[scndElm];
array[scndElm] = temp;
}
var permutation = function(array, leftIndex, size) {
var x;
if(leftIndex === size) {
temp = "";
for (var i = 0; i < array.length; i++) {
temp += array[i] + " ";
}
console.log("---------------> " + temp);
} else {
for(x = leftIndex; x < size; x++) {
swap(array, leftIndex, x);
permutation(array, leftIndex + 1, size);
swap(array, leftIndex, x);
}
}
}
arrCities = ["Sidney", "Melbourne", "Queenstown"];
permutation(arrCities, 0, arrCities.length);
Und es funktioniert, aber ich denke, etwa alle Element, um die Kombinationen ist ein bisschen teuer, Speicher-Weise, ich dachte, ein guter Weg, es zu tun, ist nur die Konzentration auf die Indizes des Arrays und alle Permutationen der zahlen Frage ich mich, ob es einen Weg gibt, der computing-alle von Ihnen, ohne Schalter-Elemente innerhalb des Arrays? Ich denke, rekursiv möglich ist, zu erhalten Sie alle, ich brauche Hilfe, dies zu tun.
So zum Beispiel, wenn ich habe:
arrCities = ["Sidney", "Melbourne", "Queenstown"];
Ich soll die Ausgabe sein:
[[012],[021],[102],[120],[201],[210]]
oder:
[[0,1,2],
[0,2,1],
[1,0,2],
[1,2,0],
[2,0,1],
[2,1,0]]
Lese ich dies:
http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations
Aber Wikipedia hat noch nie gut im erklären. Ich verstehe nicht viel davon, ich muss sagen, mein Mathe-Niveau ist nicht die beste.
- Mögliche Duplikate von Permutationen in javascript?
- Erklären Sie bitte, was meinen Sie mit "effektivsten". Schnellste? Niedrigste Speichernutzung?
- Es gibt nicht n! Permutationen, es sei denn, Sie absolut sicher sind, dass alle n Elemente im array sind voneinander Verschieden (oder besser erkennbar). Wenn zwei Elemente zu unterscheiden sind Sie schon weniger als n! Permutationen (in der Tat, müssen Sie Permutationen mit Wiederholungen).
- ist nicht das gleiche, ich will es tun, die durch den index nicht von element
- Nicht wirklich sicher, wie Sie es anders. Ersetzen Sie den Namen mit zahlen und es ist das gleiche problem.
- diese Methode hat zum wechseln der Elemente im array zu erreichen, alle Permutationen, die ich denke, ist zu teuer Geschwindigkeit (und Speicher) weiser, ich bin nicht gut in Mathe, aber meine Logik sagt mir, es sollte eine Methode zur Berechnung aller möglichen Anzahl innerhalb einer Bandbreite und wäre schneller Weg, als dass Sie tatsächlich verschieben jedes element
- Natürlich, können Sie herausfinden, wie viele es sind, ganz einfach, das ist nur eine Formel. Aber Sie müssen noch um die Ausgabe zu erzeugen. Das ist immer noch das gleiche problem. Ob strings oder zahlen, sind Sie immer noch eindeutig identifizierbare Dinge, die Sie generieren möchten Permutationen für.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Funktion
perm(xs)
, gibt alle Permutationen einer gegebenen array:JS:
Heap-Methode (Sie finden es in diesem Papier, die Ihre Wikipedia-Artikel verweist), können Sie die Generierung aller Permutationen von N Elementen mit Laufzeit-Komplexität von O(N!) und räumliche Komplexität in O(N). Dieser Algorithmus basiert auf swapping-Elemente. AFAIK ist dies so schnell, wie es kommt, es gibt keine schnellere Methode, um zu berechnen alle Permutationen.
Für eine Umsetzung und Beispiele, bitte haben Sie einen Blick bei meiner letzten Antwort auf die Frage im Zusammenhang mit "Permutationen in javascript".
Dies ist meine version basiert auf le_m's code:
JS:
Dies ist meine rekursive JavaScript-Implementierung des gleichen Algorithmus:
JS:
Es ist einfach nur zum Spaß - mein rekursive lösen in einem string