序章
グラフ内のノードでいくつかの分類を行おうとすると(レンダリングが異なります)、次の問題に直面しました。
問題
要素のスーパーセットとその素でないサブセットS = {0, 1, ... M}
の数が与えられた場合、と呼ばれるセットの分割を見つけるための最良のアルゴリズムは何ですか?n
T_i
0 <= i < n
S
P
P = S
は、元のスーパーセットのすべての互いに素なパーティションの和集合であり、すべての要素について、すべてが「元の」セットの中で同じ「親」のリストを持つようになります。P_j
S
0 <= j < M
x in P_j
x
T_i
例
S = [1, 2, 3, 4, 5, 6, 8, 9]
T_1 = [1, 4]
T_2 = [2, 3]
T_3 = [1, 3, 4]
したがって、すべてP_j
は次のようになります。
P_1 = [1, 4] # all elements x have the same list of "parents": T_1, T_3
P_2 = [2] # all elements x have the same list of "parents": T_2
P_3 = [3] # all elements x have the same list of "parents": T_2, T_3
P_4 = [5, 6, 8, 9] # all elements x have the same list of "parents": S (so they're not in any of the P_j
質問
- すべて
P_j
のsとその「親」のリストを計算するためのPythonパッケージの優れた関数/クラスは何ですか?理想的にはとに制限されnumpy
ていscipy
ますか?おそらく、それを実行する関数がすでに存在します - それらのパーティションと、それぞれの「親」のリスト
P_j
を見つけるための最良のアルゴリズムは何ですか?注意しましょうT_0 = S
力ずくのアプローチは、セットの2つの組み合わせをすべて生成しT
、それらを最大3つの互いに素なセットに分割し、それらをセットのプールに追加して、結果のすべてのが互いに素にT
なるまでプロセスを繰り返すことだと思いますT
。私たちは答えに到達しました-セットのP
セット。少し問題があるのは、そこに行く途中ですべての「親」をキャッシュすることです。
動的計画法のアプローチを使用してアルゴリズムを最適化できると思います。
注:私は(MathJaxを介して)ラテックスで数学の部分を書くのが好きでしたが、残念ながらこれはアクティブ化されていません:-(