Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menjana Gabungan dengan Cekap dalam C Menggunakan `std::next_permutation` dan `std::prev_permutation`?

Bagaimanakah Saya Boleh Menjana Gabungan dengan Cekap dalam C Menggunakan `std::next_permutation` dan `std::prev_permutation`?

Susan Sarandon
Susan Sarandonasal
2024-12-03 13:05:12556semak imbas

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

Menjana Gabungan dalam C

Pengenalan Masalah

Menjana gabungan ialah operasi biasa dalam pelbagai senario pengaturcaraan. Ia terdiri daripada mencipta set yang mengandungi bilangan elemen tertentu daripada koleksi yang lebih besar. Artikel ini meneroka cara menangani cabaran menjana kombinasi dalam C .

Penyelesaian dengan std::next_permutation

Satu pendekatan yang berkesan ialah memanfaatkan fungsi std::next_permutation daripada Perpustakaan Standard C. Berikut ialah pelaksanaan:

#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;
}

Penyelesaian ini bermula dengan mencipta tatasusunan pemilihan (v) dan meletakkan pemilih r di kedudukan r terakhir. Fungsi std::next_permutation menjana semua pilih atur pemilih ini. Untuk setiap pilih atur, ia mencetak ahli set yang sepadan dengan kedudukan yang dipilih.

Alternatif dengan std::prev_permutation

Untuk situasi di mana gabungan harus dikeluarkan dalam bentuk yang berbeza pesanan, pertimbangkan untuk menggunakan std::prev_permutation sebaliknya:

#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;
}

Variasi ini menukar susunan gabungan, menjadikan output lebih mudah untuk ditafsirkan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Gabungan dengan Cekap dalam C Menggunakan `std::next_permutation` dan `std::prev_permutation`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn