ホームページ  >  記事  >  バックエンド開発  >  セットのパーティショニングは NP 完全です

セットのパーティショニングは NP 完全です

王林
王林転載
2023-09-05 15:17:061384ブラウズ

セットのパーティショニングは NP 完全です

Set Parcel 問題を中国語に翻訳します。これは NP 完全問題です。このタスクは、指定された正の整数のセットが次のように 2 つのサブセットに分割できるかどうかを判断することです。の合計は等しい。 NP 完全とは、現在知られている多項式時間アルゴリズムではすべてのケースを解決することはできず、可能な解決策の検証は多項式時間で行う必要があることを意味します。他の多くの NP 完全問題は Set Parcel 問題に帰着することができ、その計算の複雑さと、より広範な種類の NP 完全問題を理解する上での重要性が実証されています。 Set Parcel 問題の大規模なケースは複雑であるため、解決するには膨大な時間の投資が必要となり、最適な解決策を効率的に見つけることが困難になります。

使用される方法

    ######強引な
  • バックトラッキングアルゴリズム
  • ###強引な
ブルート フォースは、考えられるすべての順列を評価し、正しいものを選択することで問題を解決する、単純かつ無害なアルゴリズム アプローチです。これには、考えられるすべての順列を効率的に列挙し、各順列が問題の要件を満たしているかどうかを実際にチェックすることが含まれます。ブルート フォース アプローチは概念的にはシンプルで実装が簡単ですが、大きな順列空間を持つ問題では計算効率が悪く、非現実的になる可能性があります。

その直接性とは関係なく、savage power は、情報サイズが少ない問題、または一般に配置スペースが小さくて妥当な場合に、重要な方法論となる可能性があります。これは、単純な問題に対して、正しさを確認するためのパターンとして、または問題の解決策として定期的に利用されます。より最新の計算を適用する前の初期段階。

###アルゴリズム###

セット内のすべてのコンポーネントの完全性を計算し、それらが 2 で割り切れるかどうかを確認します。そうでない場合は、「解決策なし」を返します。

  • 2 つのパージ セット、subset1 と subset2 を初期化します。
  • 開始セット 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 関数を再帰的に呼び出します。
  • 再帰中に実質的なセグメントが見つからない場合は、「配置なし」と出力します。

  • ###例### リーリー ###出力### リーリー
  • 後戻り

    バックトラッキングは、組み合わせ問題に対する答えを意図的に探すために使用される全体的なアルゴリズム手法です。これは、計算がさまざまな考えられる結果を調査し、可能な配置を着実に構築し、満潮と流れの方法が理解されたときにバックトラックする一種の実験探索です。実質的な取り決めを促すことはできない。
バックトラッキング システムは、各ノードが特定のステップで行われた決定を表し、分岐がその決定の潜在的な結果を表す調査ツリーとして想像できます。このアルゴリズムは、深さ優先の方法でツリーを走査し、有効な解決策が見つかるかすべての可能性を使い果たすまで、各パスを順番に探索します。

###アルゴリズム###

2 つの void セット SetA と SetB から始めて、整形中の 2 つのサブセットに対応します。

SetA と SetB の内容を記憶するために、指定されたセットからコンポーネントの潜在的な組み合わせをすべて再帰的に調査します。

各ステップで、コンポーネントを SetA に追加して追加のコンポーネントを再帰するか、それを SetB に追加して再帰します
  • 再帰処理中に SetA と SetB の数を監視する
  • SetA の量が SetB の量まで増加した場合は、Valid を戻します。いずれの場合も、Misleading を戻します。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

関連記事

続きを見る