私は、ビットツイディングを組み込んだセットからすべての可能なサブセットを生成する方法を知っています。例えば、セットからすべての可能な順序付きサブセットを生成
//Get if nth position's bit is set
bool IsBitSet(int num, int bit)
{
return 1 == ((num >> bit) & 1);
}
int subsetMaxIterCount = pow(2, someList.size());
for (int i = 0; i < subsetMaxIterCount; i++) {
vector<A> subset;
for (size_t i = 0; i < jobList.size(); i++)
{
if (IsBitSet(jobSubsetIdx, i)) {
//Add to subset here
}
}
//Here we have a subset for some i
}
ただし、これは発注を考慮していません。例えば
、私は設定していた場合は{1、2、3}、上記のアルゴリズムは、サブセット生成:
{}、{1}、{2}、{3}、{1、 2}、{1,3}、{2,3}、{1,2,3}
Iは実際に必要なものこの
{}、{1}、{2}、{3 }、{1,2}、{1,3}、{2,3}、{1,2,3}、{2,1}、{2,1,3}、{2,3,1}、 {3,1}、{3,2}、{3,1,2}、{3,2,1}
上記の一覧が網羅的であるかどうかは不明です。このようなものを生成する効果的なアルゴリズムは何ですか? (途中で順列を持つすべての可能な部分集合ですか?)
はい。サブセットを生成し、各サブセットに対して順列を生成する。 –
std :: next_permutationとstd :: prev_permutation – pat
再現可能な例がないと投票しました –