生成向量的幂集
Generating powesets of a vector
我目前正在尝试编写一个函数来创建向量的幂集。我目前有一个对象向量和一个空向量向量。我在网上四处寻找,找到了 a recursive algorithm,但在我的情况下无法正常工作。
算法:
void Game::PowersetRec(vector <Die> & s, int k, int m, int n) {
// Recursively builds a vector which is the powerset of the input vector
if (m <= n) {
s[k+1].pips = m ;
powerset.push_back(s) ;
PowersetRec(s, k+1, m+1, n) ; /* with m */
PowersetRec(s, k, m+1, n) ; /* without m */
}
}
.
PowersetRec(rolledDice, 0, rolledDice[0].pips, rolledDice[rolledDice.size() - 1].pips);
powerset
是我的向量向量,rolledDice
是 Die
对象的向量,这些对象具有 pips
属性(整数)。
当我打印 powerset 时,我得到这个(示例):
1, 1, 4, 6, 4, 6
1, 1, 2, 6, 4, 6
1, 1, 2, 3, 4, 6
1, 1, 2, 3, 4, 5
考虑到算法,这对我来说有意义,但不是幂集,这意味着我不知道原始算法是如何工作的。
编辑:This answer 看起来很有用,但我无法获得列出的代码(组合)以在 GCC 中编译。
我能够通过以下方式回答问题:the different combinations of a vector's values
我只是将 char 更改为我的 die 对象。
编辑:完整代码如下。
void Game::PowersetGen(vector <Die> & v) {
for (int counter = 1; counter < (1 << v.size()); ++counter) {
vector <Die> combination;
for (int i = 0; i < v.size(); ++i)
{
if (counter & (1 << i))
combination.push_back(v[i]);
}
powerset.push_back(combination);
}
}
简单澄清编辑:<Die>
只是我的向量中对象的名称,理想情况下,此函数将被模板化以使用任何数据类型。
我目前正在尝试编写一个函数来创建向量的幂集。我目前有一个对象向量和一个空向量向量。我在网上四处寻找,找到了 a recursive algorithm,但在我的情况下无法正常工作。
算法:
void Game::PowersetRec(vector <Die> & s, int k, int m, int n) {
// Recursively builds a vector which is the powerset of the input vector
if (m <= n) {
s[k+1].pips = m ;
powerset.push_back(s) ;
PowersetRec(s, k+1, m+1, n) ; /* with m */
PowersetRec(s, k, m+1, n) ; /* without m */
}
}
.
PowersetRec(rolledDice, 0, rolledDice[0].pips, rolledDice[rolledDice.size() - 1].pips);
powerset
是我的向量向量,rolledDice
是 Die
对象的向量,这些对象具有 pips
属性(整数)。
当我打印 powerset 时,我得到这个(示例):
1, 1, 4, 6, 4, 6
1, 1, 2, 6, 4, 6
1, 1, 2, 3, 4, 6
1, 1, 2, 3, 4, 5
考虑到算法,这对我来说有意义,但不是幂集,这意味着我不知道原始算法是如何工作的。
编辑:This answer 看起来很有用,但我无法获得列出的代码(组合)以在 GCC 中编译。
我能够通过以下方式回答问题:the different combinations of a vector's values
我只是将 char 更改为我的 die 对象。
编辑:完整代码如下。
void Game::PowersetGen(vector <Die> & v) {
for (int counter = 1; counter < (1 << v.size()); ++counter) {
vector <Die> combination;
for (int i = 0; i < v.size(); ++i)
{
if (counter & (1 << i))
combination.push_back(v[i]);
}
powerset.push_back(combination);
}
}
简单澄清编辑:<Die>
只是我的向量中对象的名称,理想情况下,此函数将被模板化以使用任何数据类型。