私はインタビューの勉強をしていて、この質問をオンラインで「数学」カテゴリに偶然見つけました。
指定されたセットのパワーセットを生成します。
int A[] = {1,2,3,4,5};
int N = 5;
int Total = 1 << N;
for ( int i = 0; i < Total; i++ ) {
for ( int j = 0; j < N; j++) {
if ( (i >> j) & 1 )
cout << A[j];
}
cout <<endl;
}
はっきりとした答えは欲しくない。この問題にどのように取り組むかについての説明とヒントが欲しいだけです。
私はグーグルでパワーセットアルゴリズムをチェックしました、そして私はまだこの問題に対処する方法を理解していません。
また、誰かが質問が求めていることを繰り返すことができますか?.
ありがとうございました。
Power set of a set A is the set of all of the subsets of A.
世界で最もフレンドリーな定義ではありませんが、例が役立ちます:
例えば。 {1, 2}
の場合、サブセットは次のとおりです:{}, {1}, {2}, {1, 2}
したがって、パワーセットは{{}, {1}, {2}, {1, 2}}
です。
この決定はビット(1/0)で示されます。
したがって、{1}
を生成するには、1
を選択して2
をドロップします(10)。
同様の行で、すべてのサブセットのビットベクトルを書き込むことができます。
繰り返します:元のセットの要素の一部またはすべてを含めることによって形成されたサブセット。したがって、サブセットを作成するには、各要素に移動し、それを保持するか削除するかを決定します。つまり、要素ごとに2つの決定があります。したがって、セットの場合、2^N
の異なるサブセットに対応する2^N
の異なる決定になる可能性があります。
こちらからもらえますか?.
{"A", "B", "C"}
のべき集合を作成します。
疑似コード:
val set = {"A", "B", "C"}
val sets = {}
for item in set:
for set in sets:
sets.add(set + item)
sets.add({item})
sets.add({})
アルゴリズムの説明:
1)sets
を空のセットに初期化します:{}
。
2){"A", "B", "C"}
の各項目を反復します
3)set
内の各sets
について繰り返します。
3.1)set
のコピーである新しいセットを作成します。
3.2)item
をnew set
に追加します。
3.3)new set
をsets
に追加します。
4)item
をsets
に追加します。
4)反復が完了しました。空のセットをresultSets
に追加します。
ウォークスルー:
各反復後のsets
の内容を見てみましょう。
反復1、アイテム= "A":
sets = {{"A"}}
反復2、アイテム= "B":
sets = {{"A"}, {"A", "B"}, {"B"}}
反復3、アイテム= "C":
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}}
反復が完了しました。空のセットを追加してください:
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}, {}}
セットのサイズは2 ^ | set |です。 = 2 ^ 3 = 8は正しいです。
Javaでの実装例:
public static <T> List<List<T>> powerSet(List<T> input) {
List<List<T>> sets = new ArrayList<>();
for (T element : input) {
for (ListIterator<List<T>> setsIterator = sets.listIterator(); setsIterator.hasNext(); ) {
List<T> newSet = new ArrayList<>(setsIterator.next());
newSet.add(element);
setsIterator.add(newSet);
}
sets.add(new ArrayList<>(Arrays.asList(element)));
}
sets.add(new ArrayList<>());
return sets;
}
入力:[A, B, C]
出力:[[A], [A, C], [A, B], [A, B, C], [B], [B, C], [C], []]
パワーセットは、特定のセットのすべてのサブセットのセットです。すべてのサブセットが含まれます(空のセット)。 2つあることはよく知られていますN このセットの要素。ここで、N
は元のセットの要素の数です。
パワーセットを構築するには、次のものを使用できます。
N
ビットのセットです(数値が小さい場合は、先行ゼロを追加します)。特定のセットメンバーが現在のサブセットに含まれている場合、各ビットが対応します。例、3つの数値:a
、b
、c
number binary subset
0 000 {}
1 001 {c}
2 010 {b}
3 011 {b,c}
4 100 {a}
5 101 {a,c}
6 110 {a,b}
7 111 {a,b,c}
さて、すべてのサブセットを生成する必要があります。サイズnのセットの場合、2があります。ん サブセット。
1つの方法は、0から2までの数を反復することです。ん -1、それぞれを2進数のリストに変換します。ここで、0
はその要素を除外することを意味し、1
はそれを含めることを意味します。
もう1つの方法は、再帰、分割、および征服です。
セットのすべての組み合わせを生成します(アイテムを含めるか含めないかによって)。例で説明:セット(またはリスト)内の3つのアイテム。可能なサブセットは次のとおりです。
000
100
010
001
110
101
011
111
結果は2 ^(セット内の要素数)です。
そのため、次のように(Pythonを使用して)Nアイテムのすべての組み合わせを生成できます。
def powerSet(items):
N = len(items)
for i in range(2**N):
comb=[]
for j in range(N):
if (i >> j) % 2 == 1:
comb.append(items[j])
yield comb
for x in powerSet([1,2,3]):
print (x)
最高評価の回答を実装することで、このようなものを取得できます。
def printPowerSet(set,set_size):
# set_size of power set of a set
# with set_size n is (2**n -1)
pow_set_size = (int) (math.pow(2, set_size));
counter = 0;
j = 0;
# Run from counter 000..0 to 111..1
for counter in range(0, pow_set_size):
for j in range(0, set_size):
# Check if jth bit in the
# counter is set If set then
# pront jth element from set
if((counter & (1 << j)) > 0):
print(set[j], end = "");
print("");