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
Lepaskan: 2024-12-03 13:05:12
asal
531 orang telah melayarinya

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;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan