Std::next_permutation verstehen
std::next_permutation ist ein Algorithmus, der die nächstgrößere Permutation eines Elementcontainers berechnet. Dies bedeutet, dass die Elemente im Container so geändert werden, dass die Gesamtreihenfolge konsistent bleibt, während die Elemente in einer definierten Reihenfolge maximiert werden.
Wie funktioniert es?
Wichtige Erkenntnis: Der Algorithmus geht davon aus, dass Elemente als Ziffern und Permutationen als Zahlen behandelt werden können. Das Ordnen von Permutationen entspricht dann dem Ordnen von Zahlen in aufsteigender Reihenfolge.
Implementierung:
-
Hauptschleife: Die Der Algorithmus tritt in eine Schleife ein, die prüft, ob die Elemente rechts vom aktuellen Element i in absteigender Reihenfolge vorliegen.
- Wenn dies der Fall ist, bedeutet dies, dass es keine Permutationen der rechten Elemente mehr gibt.
- Wenn dies nicht der Fall ist, wird mit dem Permutationsprozess fortgefahren.
-
Suchen des am weitesten links aufsteigenden Elements: Der Algorithmus dekrementiert i, bis er ein Element findet j wobei ich < J. Dies zeigt an, dass i und j Teil einer Teilfolge sind, die nicht in absteigender Reihenfolge vorliegt.
-
Suchen des nächstgrößten Elements: Es wird das nächstgrößere Element k vom Ende des Containers gesucht, z dass ich < k.
-
Vertauschen und Umkehren: Der Algorithmus vertauscht i und k und verschiebt im Wesentlichen das nächstgrößere Element nach links vom aktuellen Element. Anschließend wird die Reihenfolge von j bis zum Ende umgekehrt, um sicherzustellen, dass die Elemente auf der rechten Seite in aufsteigender Reihenfolge bleiben.
Bedeutung der Variablen:
-
i: Das aktuell betrachtete Element.
-
j: Das Element vor i (wird für die Prüfung der absteigenden Reihenfolge verwendet).
-
k: Das nächstgrößtes Element vom Ende der Sequenz.
Beweis der Korrektheit (Skizze)
-
Monotonie: Es beweist, dass, wenn die Sequenz vor dem Schleife wurde lexikographisch geordnet, die Sequenz nach der Schleife wird ebenfalls lexikographisch geordnet.
-
Beendigung: Es zeigt, dass der Algorithmus irgendwann einen Punkt erreichen wird, an dem ich nicht mehr dekrementiert werden kann, was darauf hinweist Die letzte Permutation wurde berechnet.
Das obige ist der detaillierte Inhalt vonWie generiert std::next_permutation die nächstgrößere Permutation?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn