和のセットを「加算解除」するための効率的なアルゴリズム


24

自然数Xのマルチセットが与えられた場合、すべての可能な合計のセットを考えます。

sums(X)={iAi|AX}

例えば、sums({1,5})={0,1,5,6}ながら sums({1,1})={0,1,2}

(和の入力セットのサイズに関して測定される)逆演算を計算するための最も効率的なアルゴリズムは何ですか?具体的には、次のいずれかを効率的に計算できますか?

  1. 特定のセットが有効な合計セットであるかどうか。(例えば、{0,1,2}、有効であるが、{0,1,3}ではありません。)
  2. 指定されたセットに合計されるマルチセット。
  3. 最小の所与のセットへの合計マルチセット。(たとえば、{12}{111}両方の合計{0123}が、前者が小さいです。)

1
あなたは、おそらく私たちに与えることができる多重集合和のではなく、集合和のか?これにより、心地よい対称性が得られます(値のマルチセットから始めると見えます)。
DW

1
別の質問-理論的な結果(例えば、漸近的な複雑さ)、または実用的な解決策(実際に問題なく機能するスキーム)に最も興味がありますか?後者の場合、パラメータの一般的な値のアイデアがあります。たとえば、マルチセットXのサイズ、マルチセットXの最大要素のサイズ、最高の多重度など。これは、ILPソルバーやSATソルバーのような「ビッグハンマー」を適用するのが妥当かどうかに影響する可能性があります。
DW

@DW私は間違いなく、マルチセットではなく合計のセットを使用することに興味があります(それは興味深い問題かもしれませんが)。また、これはもともとレクリエーションの数学の問題であったため、私は主に実用的な解決策よりも複雑さの限界に興味があります。
ウリグランタ

3
合計のマルチセットが与えられている場合、貪欲にこれを行うことは非常に簡単です(例えばmath.stackexchange.com/questions/201545/…を参照)。
-jschnei

@UriZarfaty入力として指定されたセットは既にソートされていますか?最後に、これはセットまたはマルチセットですか?コメントは、純粋なセットが必要であることを示しています。

回答:


9

溶液

ソリューションには2つの部分があります。最初に最小集合を発見し、次にそれがべき和集合を表すことができることを証明します。ソリューションは、プログラミングの実装に合わせて調整されます。

最小集合アルゴリズム

  1. 合計(マルチ)セットから最大要素を見つけます。P、潜在的な最小(マルチ)セットは最初は空です。amP

  2. 一つだけのグループ、表現がない限りメートルまで追加和のペアとしてすべての可能な方法で、MはS 、I 、J = { IJ| a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}

  3. 合計セットのすべての要素が含まれていることを確認します。

  4. 最大の要素の検索全てからS I jのそれぞれについて、次のプロパティで(一緒にという意味)S I jはasSijSijsがのいずれかであるS I 、J、または我々は見つけることができるのpので、合計のセットからのP + a sS i jにあります。asSijapap+asSj

  5. sが含まれいない場合は、合計a s + a pSjasas+ap、削除したp + SからSのi個のjは(または単にそれを無視するようにマークを設定)を挿入PAを代わりにS i j のsap+asSjapasSj

  6. すべての要素が存在する場合、すべてのS i jからその要素を1回削除し(またはマークを設定して、それを無視し、もう触れないようにします)、潜在的な最小セットPの要素のリストに追加します。SjSjP

  7. すべてのが空になるまで繰り返しますSj

  8. 一部が空でないままで続行できない場合は、すべてのS i jの最大値で再試行してください。SjSj

  9. 削除せずに再帰的なステップを再作成し、上のパワーセットカバレッジアルゴリズムを続行します。(これの前に、Pが2つの要素の合計として表せないすべての要素を含むことを確実にチェックできるので、確実に基本セットになければなりません。たとえば、最小要素はPになければなりません。)PPP

(10.アルゴリズムの目標である最小集合解には、同じ数の繰り返しを複数含めることはできません。)

例:

{2357810121315}

合計のセットからの2つの数値の合計として、あらゆる方法で15を表します。

13212310587

すべてのグループにあるか、合計として表すことができる最大数を見つけてください。明らかに8から検索を開始できますが、それ以上のポイントはありません。

最初のグループの13は13 = 8 + 5なので13は問題ありませんが、合計のセットに12 = 8 + 4を作る4がないため、2番目のグループの12はうまくありません。次に7を試します。しかし、すぐに13はカバーできず、6はありません。

次に5を試します。13= 5 + 8、12 = 5 + 7、10 = 5 + 5、最後の8 = 5 + 3または7 = 5 + 2のいずれかで、両方ではありません。グループは次のとおりです。

582573555537

5はすべてのグループで繰り返されるため、を抽出します。各グループから5回だけ抽出します。P={5}

82735537

明らかに、5より高くなるポイントはないため、5を再試行します。8 = 5 + 3、7 = 5 + 2なので、すべて問題ありません

53252355352

繰り返しているため、すべてのグループから1つの5を再度抽出します。(これは一般的ではありませんが、我々の場合は故意に私たちは繰り返しを持っている場合には何をすべきかを表示するために作成されています。)P={55}

3223532

ここで、3で試して、5 = 3 + 2にします。グループに追加します。

32233232

それらはどこでも反復され、我々は微細であるため、今3及び2を抽出とグループが空です。P={5532}

ここで、削除せずに再帰ステップを再作成する必要があります。これは、から要素を実際に削除せずにPに配置し、それ以上変更しないようにマークするだけで上記を実行することを意味します。SjP

5 8 2 5 7 3 5 5 5 5 3 7

13212310587
5 5 3 2 5 5 2 3 5 3 2 5 5 3 5 2
582573555537
5532552353255352

パワーセットカバレッジ

このパートの目的は、見つかった最小セットが電力合計セットをカバーできるかどうかを確認することです。見つかったソリューションは、指定されたすべての合計をカバーできますが、それらはパワーセットの合計ではない可能性があります。(技術的には、見つかった最小セットから単純に電力合計セットを作成し、電力セットの指示に従って各合計が初期合計セット内にあるかどうかを確認できます。 。この部分は、再帰を巻き戻しながら実行できます。)

  1. 2の累乗を使用して、最小セットのすべての要素をエンコードします。順序は重要ではありません。同じ要素を繰り返して何回も新しい値でエンコードします。C = 1から開始し、次のすべての要素にはC = 2Cがあります。

2=[1]3=[2]5=[4]5=[8]
  1. 復元された再帰リスト内の要素を置き換え、

5532552353255352

エンコーディングの場合:2が1、3が2、5が4、そして別の5が8

4821481242188241
  1. (1,2,4,8)の時点で、すべての中間合計を収集します

4101492438105

123458910

1411327815

123458910131415

{15151515}
  1. 2m1mm=4

  2. 12m1

671112

  1. 次の方法でそれらの不在を正当化します。各形式をバイナリ形式で表します

6=01102 7=01112 11=10112 12=10102

6 3 + 5の合計を表します 01102 から2番目と3番目の要素をカバーしています 2=[1]3=[2]5=[4]5=[8]。これらの要素の合計8は、初期合計リストにリストされています{2357810121315}、すべてが順調です。

7 2 + 3 + 5の合計を表します 01112 の最初の3つの要素をカバーしています 2=[1]3=[2]5=[4]5=[8]。これらの要素の合計10は、最初の合計リストにリストされているため、すべて問題ありません。

11 2 + 3 + 5であり、10がリストにあります。 12 は3 + 5で、8はリストにあります。

バイナリ表現が見つからない合計に対応する場合、解決策がないことを報告します。

すべて順調 2355解決策です。最小限のソリューションでもあります。

討論

合計がパワーセットの完了をカバーするかどうかをチェックするアルゴリズムを提供する必要がありました。これはバイナリ展開に隠されています。たとえば、最初の例から8と7を除外した場合、最初の部分が解決策を提供し、2番目の部分のみが合計の欠落した組み合わせを報告します。

可能な最小セットを発見する最初の部分は mnlogm に来る mログ2m:私たちは見回しています m 要素 n 持っている回 ログm バイナリ検索。

最後の部分は再帰復帰で行われ、特別な努力を必要としません。 m 要素、バイナリ形式が必要です ログm そして、追加が1つあり、合計がリストにあるかどうかを検索するので、一緒に再び約 mログ2m

べき和セットの要素数が、基礎となるセットの最大要素のパーティション数に対応すると仮定すると、複雑さは約 mログ3m。2つのいずれも、最大の要素を見つけるために初期ソートを正当化します。

アルゴリズムの一部は、線形時間で合計のペアを見つけることができると想定しており、これにはソートが必要です。

誤った開始

間違った足で開始した場合、アルゴリズムの最初の部分は失敗する可能性があります。例えば234567891011121315 基本的な解決策があります 2346アルゴリズムを6から開始する場合に取得します。ただし、手順4では何もしないため、アルゴリズムを7から開始できます。理由は、7は7 = 4 + 3であり、4と3はソリューションに含まれているからです。そのため、ロックされたアルゴリズムは常に低い初期値で再試行するだけで解決策がないことを意味するわけではありません。その場合、可能な値に関するいくつかのアイデアは残りの部分に隠されますSj。そのため、失敗した場合にそこから開始することをお勧めします。

別の例では、5からアルゴリズムを逃して開始すると、次のようになります。 5433 ただし、これには2は含まれません。

このアルゴリズムは、次のような導出ソリューションを提供しないことに注意してください。 22344、ソリューションで6を4と2に変えるだけで得られました 2346。これらのバージョンをカバーする特別なルールがあります。

このアルゴリズムの目的は、すべてを正しく開始した後にソリューションを提供することです。

改善点

ステップ4は、この方法でアップグレードできるものです。最大の代わりに、指定された条件を満たすすべての要素を降順で試すことができます。それぞれに個別のブランチを作成します。一部のブランチが解決策を提供しない場合は、キャンセルします。

例えば 234567891011121315 私たちは最初のラウンドで試すことができます 7654それらはすべて最初のテストに合格しているため、別々の方法で。(2つまたは3つを使用する理由はありません。これらは基礎となるセットに存在する必要があることがわかっているためです)。これにより、複数の基礎となるセットを検出するフルカバレッジソリューションが作成されます。

もう1つは、ケースが最小の場合、複数回の繰り返しはできないことがわかっているため、これをアルゴリズムに組み込むことができます。

全体として、ステップ4の条件は、すべてのグループで数値が繰り返されるか、合計を作成する必要があるため、指数関数的な直接の水域から抜け出すのに十分な強さです。これは、すべての組み合わせを試し、一致するものが見つかるまでそれぞれを設定します。


1
より広く:アルゴリズムのテキスト記述が表示されますが、(a)擬似コードはなく、(b)正確性の証拠はありません。なぜこのアプローチは、すべての可能な入力で正しく機能するアルゴリズムを提供すると思いますか?正当化とは何ですか?これについての正当性の証拠はありますか?
DW

この問題は、すべて一緒に30時間ほどかかったと思います(1時間あたり30倍、まあ...)。ただし、有料のオプションはありません。

最後に、それに値する詳細な答えを読んでください。すごい仕事!
ウリグランタ

1

注:これは一般的にはまったく機能しません。以下のUriの反例を参照してください。

特定のセットで少なくとも1.および2.を達成する1つの方法 Y (最小には微調整が必​​要です)は(ソート Y 最初に、必要に応じて):

  • かどうか確かめる 0Y。そうでない場合、解決策はありません。
  • させて y の最小の正数である Y。それからy にもなければなりません バツ、存在する場合(そうでない場合はより小さい正数の合計になり、 Y)。
  • させて z1<<zn の残りのメンバーである Y。セットを見つけようとしますY そのような Y=Y+{0y}。明らかに0 になければなりません Y。ために=1n:場合 z+yY、追加 zY; そうでなければ、zyY、解決策はありません。そうでなければ(つまりz+yY、しかし z+yY)、私たちは必要ありません zY
  • 再帰的に繰り返す Y、最小要素の収集 yyマルチセットに。これは、空のセットで終わる場合のソリューションです。}

各再帰ステップで、セットのサイズは少なくとも減少します 1 (最小の要素を除外するため y)、したがって、ステップ数は On。各ステップには、現在のセットに対する単一の反復が含まれます。On2 総複雑度(算術演算の単位コストを想定)。

最小限のソリューションを見つける(これは必ずしも一意ではないことに注意してください。たとえば、 Y={0134567} 我々は持っています {01346} そして {01356})やや複雑です:最小値を見つけた後 yY、算術の進行を分析します {a+ky}Y、それらの1つがシングルトンである場合は拒否し、そうでなければ、 Y; 進行の長さが奇数の場合、連続するメンバーのペアを選択する必要があります。したがって、一意性はありません。


Y 'が行き止まりにつながらないことは明らかですか?結局、Y = Y '+ {0、y}のような多くのYが存在する可能性があります。たとえば、{0,1,2,3,4} = {0,2,3} + {0,1} = {0,1,2,3} + {0,1}ですが、前者の分解はデッドエンド。
ウリグランタ

それは本当であり、本当の問題です。修正できるかどうかを確認する必要があります。ありがとう!
クラウスドレーゲル

@ UriZarfaty、Klausのアルゴリズムは、マルチセットではなくセットで始まる特殊なケース(つまり、マルチセット内のアイテムが1を超える多重度を持たない)に適しているのではないかと思います。反例はありますか?マルチセットではなくセットから始める特別なケースのアルゴリズムを最初に探すのは面白いかもしれません。その場合に機能する場合、たとえばセットを見つけようとすることで、マルチセットで機能するように一般化できる場合がありますY そして最大数 k そのような Y=Y+{0yy} どこで {0yy} 含む k のコピー y、次に再帰 Y
DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.