Sie können einen beliebigen Algorithmus (wie bekannt Narayana algorithm) verwenden, um alle Permutationen der Größe N
zu generieren.
Wenn nun in dieser Gesamtsequenz von Permutationen betrachten Sie nur Permutationen mit Präfix (a , ein , ..., a k), wo ein < ein < ... < a k, dann bilden die Schwanzabschnitte aller solcher Permutationen eine Abfolge aller möglichen Permutationen der Länge N - k
.
Auf diese Weise können Sie alle Permutationen der Länge N
und kürzer mit einem einzigen Durchlauf durch alle Permutationen der Länge N
generieren.
Hier ist, was eine C++ Implementierung wie
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
int a[] = { 2, 3, 4, 5, 7, 8 };
do
{
for (auto ite = std::begin(a); ite != std::end(a); ++ite)
if (std::is_sorted(std::begin(a), ite))
{
std::copy(ite, std::end(a), std::ostream_iterator<int>(std::cout));
std::cout << std::endl;
}
} while (std::next_permutation(std::begin(a), std::end(a)));
}
da aufeinanderfolgende Aufrufe von std::is_sorted
(ich nahm sich die Freiheit von Vorsortierung Ihre Eingabe festgelegt.) Innerhalb des oben ist natürlich nicht optimal, aussehen könnte Der Zyklus for
wiederholt wiederholt, was bereits in der vorherigen Iteration überprüft wurde. Aber auch hier soll diese Implementierung nur illustrativen Zwecken dienen.
Jetzt ist die Frage, ob Sie mit der Reihenfolge zufrieden sind, in der diese Permutationen generiert werden. Der obige Ansatz gruppiert sie nicht nach Länge.
Alternativ können Sie durch all possible combinations, iterieren und dann erzeugen nur alle möglichen Permutationen für jede Kombination.
@Ian Mercer: Kein exaktes Duplikat. Alle möglichen Kombinationen! = Alle möglichen Permutationen. – AnT