セットがありSます。Nサブセットが含まれています(さまざまな長さのサブセットが含まれています)。
1. [[a,b],[c,d],[*]]
2. [[c],[d],[e,f],[*]]
3. [[d,e],[f],[f,*]]
N. ...
Lセットに含まれている「一意の」要素のリストもありますS。
a, b, c, d, e, f, *
各サブセットの各サブセット間で可能なすべての組み合わせを見つける必要があります。これにより、結果の各組み合わせには、リストから1つの要素が含まれますLが、要素の出現回数は任意になります[*](ワイルドカード要素です)。
したがって、上記のセットで機能する必要な関数の結果は次のようSになります(100%正確ではありません)。
- [a,b],[c],[d,e],[f];
- [a,b],[c],[*],[d,e],[f];
- [a,b],[c],[d,e],[f],[*];
- [a,b],[c],[d,e],[f,*],[*];
したがって、基本的に、次のことを行うアルゴリズムが必要です。
- サブセットからサブセットを取得し
1、 - これまでに取得した「一意の」要素のリストを維持するサブセットからもう1つのサブサブセットを追加します
2(サブセットに要素が含まれている場合、「一意の」リストのチェックはスキップされ*ます)。 2に達するまで繰り返しNます。
言い換えると、可能なすべての「チェーン」(の場合はペア、の場合N == 2はトリプルN==3)を生成する必要がありますが、各「チェーン」には、生成された各要素で何度も発生する可能性Lのあるワイルドカード要素を除いて、リストから1つの要素が含まれている必要があります。*鎖。
これを行う方法は知っていますがN == 2(単純なペア生成です)、の任意の値を処理するようにアルゴリズムを拡張する方法がわかりませんN。
ここでは、第2種のスターリング数が役立つかもしれませんが、目的の結果を得るためにそれらを適用する方法がわかりません。
注:ここで使用するデータ構造のタイプは、私にとって重要ではありません。
注:この質問は、以前の同様の質問から発展したものです。