2017-11-07 3 views
-1

X要素のリストを取得するとき、どのようにしてこれらの要素のすべての倍精度化、三重化、...(Y)の組み合わせを取得できますか?
Yは必要な組み合わせのサイズです。例:Y = 2の場合は、すべてのペアを取得する必要があります。
同じ組み合わせを2回与えないでください(例:[a、b]と[b、a]は同じ組み合わせです)リスト内の要素のすべての組み合わせを取得するにはどうすればよいですか?

+1

で組み合わせを見[実装の順列・組み合わせ-と-のPowerset・イン・C++]のように見えています(https://stackoverflow.com/a/25556248/2684539) – Jarod42

+0

質問を編集して[これまでのコード](http://whathaveyoutried.com)を表示してください。問題を抱えているコードのアウトライン(ただし、好ましくは[mcve])を含める必要があります。次に、特定の問題を解決することができます。 [ask]も読んでください。 –

答えて

2

リストをコピーしてください。

リストが空の場合、組み合わせはありません。

サイズ1のすべての組み合わせを取得するには、各要素を順番に調べます。

サイズn + 1のすべての組み合わせを取得するには、最初に最初の要素を削除します。その後、残りのリストのサイズnとその最初の要素のすべての組み合わせを取得します。その後、残りのリストのサイズn + 1のすべての組み合わせを取得し、最初の要素を追加しないでください。

これで完了です。

あなたは気に入って、最適化のために要素をコピー/除去するふりをするだけです。

+0

私は再帰を使用する必要があります配列のサイズは等しいか2より大きいですか?それで私は重複を避けることができますか?それらを避けるために、すべての要素を1つずつ削除する必要がありますか? –

1

あなたは2からYに対するTを反復し、サイズXバックに前方及びT 1SにXtの0で埋める持つ配列Aを作成し、その後、以下のコードを有することができる:

do{ 
    //1s in array A now correspond to a valid combination 
}while(std::next_permutation(A,A+X)); 

ループは、サイズtのすべての組み合わせが反復されると停止する。

next_permutationは、アルゴリズムを次の辞書順に並べ替えるか、配列が辞書編集上最も大きな順列になっている場合はfalseを返す。その複雑さはO(n)です。なぜなら、配列を一度反復する必要があるからです。だから問題にはならないでしょう。プロセス全体の複雑さの合計は、O(2^n * n)によって制限されます。だからここ

は、例えば、擬似コード

D[X] = {1,2,3,4} Y = 3 //the input 
For t = 2,3,..,Y 
    A[X] = {0,...,0,1,...,1} // X - t 0s and t 1s 
    Do 
     For j = 0,1,...,X-1 
      if A[j] == 1 
       output D[j] 
      end if 
     end for 
     output newline 
    While next_permutation(A,A+X) 
end for 

が出力意志が

3 4 
2 4 
2 3 
1 4 
1 3 
1 2 
2 3 4 
1 3 4 
1 2 4 
1 2 3 
+0

これは構造で動作しますか?そして、これは私にユニークな組み合わせしか持てないのですか? (結果に[a、b]と[b、a]は含まれていません) –

+0

辞書順に大きな順列を生成するので、同じ順列を与えません。 –

+0

はい、0と1だけが並べ替えられているので構造体と一緒に動作します。 –

関連する問題