>백엔드 개발 >C++ >세트 파티셔닝은 NP-완전입니다.

세트 파티셔닝은 NP-완전입니다.

王林
王林앞으로
2023-09-05 15:17:061406검색

세트 파티셔닝은 NP-완전입니다.

Set Parcel 문제를 중국어로 번역하세요. 이것은 NP-완전 문제입니다. 이 문제는 주어진 양의 정수 집합을 두 부분 집합으로 나누어 그 합이 같은지 여부를 결정하는 것입니다. NP-완전이란 현재 알려진 다항식 시간 알고리즘이 모든 경우를 해결할 수 없으며 가능한 솔루션의 검증이 다항식 시간 내에 수행되어야 함을 의미합니다. 다른 많은 NP-완전 문제는 Set Parcel 문제로 축소될 수 있으며, 이는 더 넓은 종류의 NP-완전 문제를 이해하는 데 있어 계산 복잡성과 중요성을 보여줍니다. Set Parcel 문제의 대규모 사례를 해결하려면 복잡성으로 인해 막대한 시간 투자가 필요할 수 있으며, 이로 인해 최적의 솔루션을 효율적으로 찾기가 어렵습니다.

사용된 방법

  • 무차별 대입

  • 역추적 알고리즘

무차별 대입

무차별 대입은 가능한 모든 순열을 평가하고 올바른 순열을 선택하여 문제를 해결하는 간단하고 순진한 알고리즘 접근 방식입니다. 여기에는 가능한 모든 순열을 효율적으로 열거하고 각 순열이 문제의 요구 사항을 충족하는지 실제로 확인하는 작업이 포함됩니다. 무차별 접근 방식은 개념적으로 간단하고 구현하기 쉽지만 큰 순열 공간이 있는 문제에서는 계산적으로 비효율적이고 비실용적일 수 있습니다.

야만적 힘은 그 단순함에 관계없이 정보 크기가 거의 없거나 일반적으로 배치 공간이 적고 합리적인 경우에 대한 실질적인 방법론이 될 수 있습니다. 간단한 문제에 대해 정확성을 확인하는 패턴 또는 시작 단계로 정기적으로 활용됩니다. 보다 현대적인 계산을 적용하기 전에.

알고리즘

  • 세트에 포함된 모든 구성 요소의 완전성을 계산하고 2로 나눌 수 있는지 확인하세요. 그렇지 않은 경우 "해결 방법 없음"을 반환합니다.

  • 두 개의 퍼지 세트, 하위 세트1과 하위 세트2를 초기화합니다.

  • 시작 세트 S, 하위 세트 1, 하위 세트 2 및 대상 합계(totalSum / 2)를 사용하여 재귀 작업 분할 도우미 partitionHelper를 호출합니다.

  • partitionHelper 함수에서:
  • 하위 집합 1의 전체 구성 요소가 대상 전체와 동일한지 확인하고, 그렇다면 하위 집합 1과 2를 인쇄하고 반환합니다. 세트 S가 지워지면 반환 S에서 구성 요소 x를 선택하고 S에서 제거합니다.

  • subset1에 x를 포함시키고 업그레이드된 S, subset1, subset2 및 목표 합계를 사용하여 partitionHelper를 재귀적으로 호출해 보세요.

  • 입찰에서 대형 소포를 찾지 못한 경우 하위 집합 1에서 x를 제외하고 하위 집합 2에 x를 포함시키십시오.
  • 재구성된 S, 하위 집합 1, 하위 집합 2 및 대상 합계를 사용하여 partitionHelper 함수를 반복적으로 호출합니다.

  • 재귀 중에 실질적인 세그먼트가 발견되지 않으면 "No alignment"를 인쇄합니다.

으아아아

출력

으아아아

역추적

백트래킹은 조합 문제에 대한 답을 의도적으로 찾는 데 사용되는 전반적인 알고리즘 방법으로, 예상되는 다양한 결과를 조사하여 꾸준히 가능한 배열을 구성하고 썰물과 흐름의 방식이 가능하다는 것을 이해하면 역추적하는 일종의 실험 검색입니다. 실질적인 합의를 이끌어내지 마세요.

역추적 시스템은 각 노드가 특정 단계에서 내린 결정을 나타내고 가지가 해당 결정의 잠재적 결과를 나타내는 조사 트리로 상상할 수 있습니다. 알고리즘은 깊이 우선 방식으로 트리를 순회하며 유효한 솔루션을 찾거나 모든 가능성을 소진할 때까지 각 경로를 차례로 탐색합니다.

알고리즘

  • 두 개의 공백 세트인 SetA와 SetB로 시작하여 모양이 지정되는 두 하위 집합을 처리합니다.

  • SetA와 SetB에 무엇이 있는지 기억하기 위해 주어진 세트에서 구성 요소의 모든 잠재적 혼합을 재귀적으로 조사합니다.

  • 각 단계에서 SetA에 구성 요소를 추가하고 추가 구성 요소에 대해 반복하거나 SetB에 추가하여 반복합니다.

  • 재귀 중 SetA 및 SetB 수 모니터링

  • 언제든지 SetA의 양이 SetB의 양만큼 증가하면 어떤 경우에도 유효함을 다시 가져오고 오해의 소지가 있습니다.

Example

#include <iostream>
#include <vector>

bool isValidSubset(const std::vector<int>& inputSet, int index, int 
setSizeA, int setSizeB) {
   if (index == inputSet.size()) {
      return (setSizeA == setSizeB);
   }

   bool isValid = isValidSubset(inputSet, index + 1, setSizeA + 1, setSizeB);
   isValid |= isValidSubset(inputSet, index + 1, setSizeA, setSizeB + 1);

   return isValid;
}

int main() {
   std::vector<int> inputSet = {1000, 2000, 3000, 4000, 5000};
   bool isValid = isValidSubset(inputSet, 0, 0, 0);
   std::cout << (isValid ? "Valid" : "Misleading") << std::endl;
   return 0;
}

输出

Misleading

结论

本文研究了集合分割问题的NP完备性,该问题包括决定给定的一组正整数是否可以被分割成两个子集,使得它们的和相等。NP完备性意味着没有已知的多项式时间算法可以解决该问题的所有情况,并且验证一个潜在解决方案可以在多项式时间内完成。本文讨论了三种方法来解决这个问题:蛮力法、回溯法和动态规划。由于其复杂性,解决集合分割问题的大规模实例可能需要大量的时间和努力,使得寻找一个理想的解决方案变得具有挑战性。理解集合分割的复杂性很重要,因为它与其他NP完备问题相关,为我们揭示了计算复杂问题的更广泛教训

위 내용은 세트 파티셔닝은 NP-완전입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 tutorialspoint.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제

관련 기사

더보기