2013-02-05 20 views
9

Gibt es einen einfachen Weg, um alle möglichen Permutationen eines Vektors von ganzen Zahlen (1 bis max 999) zu generieren, der duplizierte Elemente ausdrücklich ausschließt?R: Generiere alle Permutationen eines Vektors ohne duplizierte Elemente

Zum Beispiel für einen Vektor mit drei Elementen in einem Bereich von 1 bis 9 die Sequenz 1 2 3 würden annehmbar sein, wie dies aber 1 2 91 2 2 würde unwirksam sein. Die Sequenz muss genau n Elemente (in diesem Fall drei) enthalten. BEARBEITEN: um Verwirrung zu vermeiden, ist die Reihenfolge wichtig, so 1 2 9 und 9 2 1 sind beide gültig und erforderlich.

Es gibt viele Fragen zu Permutationen und Kombinationen mit R auf SO (wie this und this) aber keine, die zu diesem speziellen Fall passen scheinen. Ich hoffe, dass da draußen eine obskure Basis-R oder Paket-Funktion ist, die sich darum kümmern wird, ohne dass ich selbst eine unzüchtige Funktion schreiben muss.

+0

Ja, die Reihenfolge ist wichtig, ebenso wie die Elemente selbst. – SlowLearner

+2

Nun, die Antwort ohne die bearbeitete Verdeutlichung war sicherlich "Probe" und ich bin mir sicher, dass dies ein Duplikat ist, aber das zitierte Duplikat ist keine gute Antwort. –

+0

Als Warnung für diejenigen, die folgen: Die Anzahl der Permutationen von 'n' Elementen ist' n! ', Was sehr schnell sehr groß wird. Für die 999 Elemente, die in dieser Frage erwähnt werden, gibt es ungefähr 4 * 10^2564 Permutationen. – Gregor

Antwort

19

Mit gtools Paket:

require(gtools) 
permutations(n = 9, r = 3, v = 1:9) 
# n -> size of source vector 
# r -> size of target vector 
# v -> source vector, defaults to 1:n 
# repeats.allowed = FALSE (default) 
9

EDIT: Das ist nicht das, was der OP gefragt, aber ich lasse diese Antwort, um Verwirrung zu vermeiden.

Meine Mathematik ist ein wenig eingerostet, aber ich denke, Sie beschreiben Kombinationen, nicht Permutationen. Die Basisfunktion combn() gibt Kombinationen zurück.

ich illustrieren mit einem überschaubaren Set - alle Kombinationen der Länge 3, aus dem Vektor 1:4:

combn(4, 3) 
    [,1] [,2] [,3] [,4] 
[1,] 1 1 1 2 
[2,] 2 2 3 3 
[3,] 3 4 4 4 

Der Unterschied zwischen combinations und permutations ist, dass in combinations die Reihenfolge keine Rolle spielt. Also, (2, 3, 4) und (4, 3, 2) ist die gleiche Kombination, aber unterschiedliche Permutationen.

+0

Dies sind nicht alle möglichen Permutationen, oder? ex: (4,3,2) ist nicht hier ...? – Arun

+0

@Andrie Ich bin mir sicher, dass meine Mathematik rostiger ist. Braucht das oben Gesagte jedoch keine Überprüfung nach der Generierung, um Duplikate zu entfernen? Oder sollte ich die Spalten lesen anstatt über die Zeilen der obigen Matrix? – SlowLearner

+2

@SlowLearner, sollten Sie Spalten nachlesen. Also, du hast nach Kombinationen gesucht ..? – Arun

7

utils::combn; combinat::combn oder combinat::permn sind Alternativen.

Verwandte Themen