Das Zurücksetzen der Länge n ist ein geordnetes Set ohne Wiederholungsnummern 1, 2, ..., n. Beispielsweise sind [3, 1, 2] und [5, 4, 3, 2, 1] Transverte und [1, 2, 1, 3] und [1, 2, 4] nicht.
Wenn die Herausforderung war, alle Änderungen der Länge n zu entfernen, könnte ein komfortabler C++-Mechanismus namens next_permutation verwendet werden.
Details können inDokumentation, aber der Punkt ist, dass diese Funktion die Remittanz auf eine spätere Rektifikation im Lexikographen (die im Allgemeinen durch seinen Namen verstanden wird) ändert.
Zur Verwendung der next_permutation sollte die Algorithmusbibliothek angeschlossen werden (d.h. #include vergorithm zu Beginn des Programms)
Beispiele:
Vektor arr;
arr = { 1, 2, 3}; / Masse gleich [1, 2, 3]
next_permutation(arr.begin(), arr.end()); / übertragbar in volle Reichweite
/ Jetzt ist die Masse [1, 3, 2]
arr = {2, 3, 1}; / Masse gleich [2, 3, 1]
next_permutation(arr.begin(), arr.end()); / übertragbar in volle Reichweite
/ Nun ist die Masse gleich [3, 1, 2]
next_permutation(arr.begin() + 1, arr.begin() + 3); / kann auf Teile der Masse angewendet werden, aber in der Praxis ist dies selten erforderlich
/ Nun ist die Masse gleich [3, 2, 1]
In diesem Fall hat die Funktion einen Lampen-Reset-Wert, der gleichermaßen wahr ist, wenn der nächste Stopp gesichert und falsch ist, wenn das folgende nicht erfolgt ist (ein Dienst, wenn der maximale Stop auf die Funktion in der lexikographischen Reihenfolge übertragen wird).
Dies ermöglicht es, die Funktion im Zyklus zu nutzen, wodurch wir alle Transformationen wechseln können. Aufgrund der 0-Angabe ist es in der Praxis oft einfacher, mit einem Rücksetzen zwischen 0 und n-1 zu arbeiten, obwohl die Unterbrechung formal zwischen 1 und n liegt. Glücklicherweise führt dies aber nicht zu zusätzlichen Codeauskleidungen, da die Funktion von next_permutation an den 0-indizierten Reset angepasst ist (und sogar repetitive Elemente in der Masse, aber Sie können sich genauer informieren).
Im allgemeinen ist der Massenumwandlungscode wie folgt:
int n; /
Vektor perm(n); // perm - Reduktion von "Permutation, d.h. "reset".
für (int i = 0; i À n; i+++)
perm[i] = i; // initial reset 0, 1, ..., n-1
und
/ innerhalb des Zyklus verarbeitete Stromkonvertierung
} während (next_permutation(perm.begin(), perm.end())); / wenn kein nächster Reset vorliegt, der Endzyklus
Dieser Code funktioniert für O(n! * f(n)), wo f(n) die Zeit ist, die Sie einen bestimmten Reset bearbeiten.