>백엔드 개발 >C++ >`std::next_permutation` 및 `std::prev_permutation`을 사용하여 C에서 조합을 효율적으로 생성하려면 어떻게 해야 합니까?

`std::next_permutation` 및 `std::prev_permutation`을 사용하여 C에서 조합을 효율적으로 생성하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-03 13:05:12483검색

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

C에서 조합 생성

문제 소개

조합 생성은 다양한 언어에서 흔히 사용되는 작업입니다. 프로그래밍 시나리오. 이는 더 큰 컬렉션에서 지정된 수의 요소를 포함하는 세트를 만드는 것으로 구성됩니다. 이 기사에서는 C에서 조합 생성 문제를 해결하는 방법을 살펴봅니다.

std::next_permutation을 사용한 솔루션

한 가지 효과적인 접근 방식은 std::next_permutation 함수를 활용하는 것입니다. C 표준 라이브러리에서. 구현은 다음과 같습니다.

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

이 솔루션은 선택 배열(v)을 생성하고 r 선택기를 마지막 r 위치에 배치하는 것으로 시작됩니다. std::next_permutation 함수는 이러한 선택기의 모든 순열을 생성합니다. 각 순열에 대해 선택한 위치에 해당하는 세트 멤버를 인쇄합니다.

std::prev_permutation을 사용한 대안

조합이 다른 위치로 출력되어야 하는 상황의 경우 주문하려면 대신 std::prev_permutation 사용을 고려하세요.

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

이 변형 조합의 순서를 번갈아 변경하여 출력을 더 쉽게 해석할 수 있습니다.

위 내용은 `std::next_permutation` 및 `std::prev_permutation`을 사용하여 C에서 조합을 효율적으로 생성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.