長さNの自然数ベクトル と エントリの合計Sを扱います。ベクトル内で> 0と見なされます。
同じ構成(N,S)=(4,7)のすべてのベクトルをリストしたいのですが、回転は除外する必要があります。
質問:最適なアルゴリズムは何ですか?
(私の実際の実装は、下限と上限のインデックス値の境界のベクトルを使用してネストされた for ループを提供する Pari/GP にあります)
ネストされたforループを使用してリストを生成するという点で、最初に「ブルートフォース」ソリューションを試しましたが、連結された2重のconcat(E,E)をリストEE[]に保存し、次に、それぞれに対して新しいベクトルE=[e_1,e_2,e_3,e_4]このベクトルが既にチェックされたリストEE[]の連結されたベクトルにあるかどうかをチェックし、そうでない場合は新しい有効なエントリ
EE[k]=E||Eとして追加します= [e_1,e_2,e_3,e_4,e_1,e_2,e_3,e_4] . ここでの比較は、文字列の比較に似ています。一致は、位置1または最大Nから始まる場合に常に見つかります。
この方法は機能しますが、私にはブルートフォースのように見え、その組み合わせ構造により、NとSが増加すると爆発します。
より良い方法はありますか?
注: ターゲット言語はPari/GP
注: 疑似アルゴリズムで十分ですが、おそらく Pari/GP のツールを使用すると、よりコンパクトなソリューション/表記が可能になります。
例、(N,S)=(4,7)
以下は非常に単純な例です。
ネストされたループによって、次の方法でベクトルEを取得すると仮定します。
[1,1,1,4] --- first vector: store as [1,1,1,4;1,1,1,4] in EE
[1,1,2,3] --- 2nd vector: not in EE so far, append as [1,1,2,3;1,1,2,3] to EE
[1,2,1,3] ...
[2,1,1,3] ...
[1,1,3,2] --- ignore!! This is a rotation of an earlier entry (is in EE)
[1,2,2,2]
...
これにより、ベクトルEEのリストが連続して作成されます。
[1,1,1,4;1,1,1,4]
[1,1,2,3;1,1,2,3]
[1,2,1,3;1,2,1,3]
[2,1,1,3;2,1,1,3]
[1,2,2,2;1,2,2,2]
このリストは最初のN列のみで、後で使用するベクトルのリストです。
追加の健全性チェック: for (N,S)=(4,16) フィルター処理されていないリストlength_unfiltered = 455と、回転が削除された後のlength_filtered=116を取得します。