Heim > Backend-Entwicklung > C++ > Wie kann ich mit „std::next_permutation' und „std::prev_permutation' effizient Kombinationen in C generieren?

Wie kann ich mit „std::next_permutation' und „std::prev_permutation' effizient Kombinationen in C generieren?

Susan Sarandon
Freigeben: 2024-12-03 13:05:12
Original
482 Leute haben es durchsucht

How Can I Efficiently Generate Combinations in C   Using `std::next_permutation` and `std::prev_permutation`?

Erzeugen von Kombinationen in C

Problemeinführung

Das Erzeugen von Kombinationen ist eine häufige Operation in verschiedenen Programmierszenarien. Dabei werden Sätze erstellt, die eine bestimmte Anzahl von Elementen aus einer größeren Sammlung enthalten. In diesem Artikel wird untersucht, wie Sie die Herausforderung der Generierung von Kombinationen in C bewältigen können.

Lösung mit std::next_permutation

Ein effektiver Ansatz besteht darin, die Funktion std::next_permutation zu nutzen aus der C-Standardbibliothek. Hier ist eine Implementierung:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    int n, r;
    std::cin >> n >> r;

    std::vector<bool> v(n);
    std::fill(v.end() - r, v.end(), true);

    do {
        for (int i = 0; i < n; ++i) {
            if (v[i]) {
                std::cout << (i + 1) << " ";
            }
        }
        std::cout << "\n";
    } while (std::next_permutation(v.begin(), v.end()));
    return 0;
}
Nach dem Login kopieren

Diese Lösung beginnt mit der Erstellung eines Auswahlarrays (v) und der Platzierung von r Selektoren an den letzten r Positionen. Die Funktion std::next_permutation generiert alle Permutationen dieser Selektoren. Für jede Permutation werden die Satzmitglieder gedruckt, die den ausgewählten Positionen entsprechen.

Alternative mit std::prev_permutation

Für Situationen, in denen die Kombinationen anders ausgegeben werden sollen Reihenfolge, ziehen Sie stattdessen die Verwendung von std::prev_permutation in Betracht:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
   int n, r;
   std::cin >> n >> r;

   std::vector<bool> v(n);
   std::fill(v.begin(), v.begin() + r, true);

   do {
       for (int i = 0; i < n; ++i) {
           if (v[i]) {
               std::cout << (i + 1) << " ";
           }
       }
       std::cout << "\n";
   } while (std::prev_permutation(v.begin(), v.end()));
   return 0;
}
Nach dem Login kopieren

Diese Variante ändert die Reihenfolge der Kombinationen, wodurch Die Ausgabe ist leichter zu interpretieren.

Das obige ist der detaillierte Inhalt vonWie kann ich mit „std::next_permutation' und „std::prev_permutation' effizient Kombinationen in C generieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage