C ++ STL Nächste Permutation mit Kombination

8

Ich weiß, dass ich std::next_permutation für einen Container verwenden kann, der die Elemente [1, 2, 3] enthält, die 6 Permutationen dieser Sequenz erzeugen würden. Was ich tun möchte, ist ein set [1, 2, 3, 4, 5, 6] erzeugt alle möglichen Permutationen der Größe 3. Also für dieses Beispiel wäre [4, 3, 2] eine der Permutationen, die sich aus diesem Kriterium ergeben. Ich suche nach einer STL-Methode (wenn möglich), anstatt meine eigene Kombinationsfunktion zu schreiben. Irgendeine bestimmte STL-Implementierung, über die ich lesen sollte?

    
Mutating Algorithm 18.05.2016, 21:50
quelle

3 Antworten

2

Derzeit gibt es (ab 2016) keine einzige STD-Funktion dafür. Am nächsten kommt der Vorschlag von Ссылка

Die gewünschte Funktion heißt next_partial_permutation und sieht wie folgt aus (ab N2639):

%Vor%     
Mircea Baja 18.05.2016 23:26
quelle
2

Dies ist nicht der effizienteste mögliche Algorithmus, aber es ist einfach. Sie müssen mit den sortierten Elementen beginnen. Um die nächste k-Permutation zu erhalten, kehren Sie die letzten n-k Elemente um und versuchen Sie dann, die nächste Permutation zu erhalten. Die ersten k Elemente sind die nächste k-Permutation.

    
rici 18.05.2016 22:25
quelle
1

Hier ist ein in Smalltalk geschriebener Algorithmus.

Die Idee des Algorithmus besteht darin, die lexikographische Ordnung von Arrays der Länge m mit Elementen zwischen 1 und n zu berücksichtigen. Bei einem solchen array ersetzt die Methode next array durch ihre nächste partielle Permutation in dieser Reihenfolge.

Ich habe eine Klasse mit drei Instanzvariablen erstellt

%Vor%

Die Instanzerstellungsmethode m:n: funktioniert wie folgt

%Vor%

In dieser Klasse ändert die Methode next die array so, dass sie jetzt die nächste Permutation enthält.

Es ist vielleicht erwähnenswert, dass der Algorithmus nicht rekursiv ist.

Die Methode next antwortet mit nil iff array enthält die letzte Permutation in der Reihenfolge (d. h. array = (n, n-1, ...., n-m+1) .

Um alle Permutationen zu berechnen, beginnen Sie mit array = (1 ... m) und senden Sie next , bis die Antwort nil ist.

%Vor%

Wo

%Vor%     
Leandro Caniglia 20.05.2016 01:18
quelle