web-dev-qa-db-ja.com

特定のセットのべき集合を生成する方法は?

私はインタビューの勉強をしていて、この質問をオンラインで「数学」カテゴリに偶然見つけました。

指定されたセットのパワーセットを生成します。

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;

 }

はっきりとした答えは欲しくない。この問題にどのように取り組むかについての説明とヒントが欲しいだけです。

私はグーグルでパワーセットアルゴリズムをチェックしました、そして私はまだこの問題に対処する方法を理解していません。

また、誰かが質問が求めていることを繰り返すことができますか?.

ありがとうございました。

21
Ralph

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)。

同様の行で、すべてのサブセットのビットベクトルを書き込むことができます。

  • {}-> 00
    {1}-> 10
    {2}-> 01
    {1,2}-> 11

繰り返します:元のセットの要素の一部またはすべてを含めることによって形成されたサブセット。したがって、サブセットを作成するには、各要素に移動し、それを保持するか削除するかを決定します。つまり、要素ごとに2つの決定があります。したがって、セットの場合、2^Nの異なるサブセットに対応する2^Nの異なる決定になる可能性があります。

こちらからもらえますか?.

23
axiom

{"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)itemnew setに追加します。

3.3)new setsetsに追加します。

4)itemsetsに追加します。

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], []]

11
Cristian

パワーセットは、特定のセットのすべてのサブセットのセットです。すべてのサブセットが含まれます(空のセット)。 2つあることはよく知られていますN このセットの要素。ここで、Nは元のセットの要素の数です。

パワーセットを構築するには、次のものを使用できます。

  • 0から2までのすべての整数を反復するループを作成します。N-1
  • 各整数のバイナリ表現に進みます
  • 各バイナリ表現は、Nビットのセットです(数値が小さい場合は、先行ゼロを追加します)。特定のセットメンバーが現在のサブセットに含まれている場合、各ビットが対応します。

例、3つの数値:abc

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}
10
Alma Do

さて、すべてのサブセットを生成する必要があります。サイズnのセットの場合、2があります。 サブセット。

1つの方法は、0から2までの数を反復することです。 -1、それぞれを2進数のリストに変換します。ここで、0はその要素を除外することを意味し、1はそれを含めることを意味します。

もう1つの方法は、再帰、分割、および征服です。

4
Tom Zych

セットのすべての組み合わせを生成します(アイテムを含めるか含めないかによって)。例で説明:セット(またはリスト)内の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)
4
Amjad

最高評価の回答を実装することで、このようなものを取得できます。

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("");
0
Carlson Bimbuh