从一个集合生成所有可能的有序子集

Generate all possible ordered subset from a set

本文关键字:有可能 子集 集合 一个      更新时间:2023-10-16

我知道如何从包含位旋转的集合中生成所有可能的子集。例如,

//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}

现实中我需要的是这个

{},{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}

不确定上面的列表是否详尽。生成这种东西的有效算法是什么?(顺便问一下,这是所有可能的排列子集吗?)

我们使用位旋转生成子集的方式,每个子集都在它的e.g. {1, 2, 3}, {2, 3}, {1, 3}中排序。您可以使用next_permutation

为每个子集生成排列
vector<vector<int>> mySubsetGenerator(vector<vector<int>>& subsets) {
    vector<vector<int>> extendedSubset;
    for(int i = 0; i < subsets.size(); ++i) {
         do {
             extendedSubset.push_back(subsets[i]);
         } while(next_permutation(subsets[i].begin(), subsets[i].end()));
    }
    return extendedSubset;
}

此外,您只能使用回溯来通过获取数组的一个或多个元素来生成所有可能的排列。