【发布时间】:2011-11-05 00:40:12
【问题描述】:
考虑以下整数数组 {1,2,3} 的长度为 3 的所有组合。
我想使用wikipedia中的以下算法遍历所有长度为3的组合
// find next k-combination
bool next_combination(unsigned long& x) // assume x has form x'01^a10^b in binary
{
unsigned long u = x & -x; // extract rightmost bit 1; u = 0'00^a10^b
unsigned long v = u + x; // set last non-trailing bit 0, and clear to the right; v=x'10^a00^b
if (v==0) // then overflow in v, or x==0
return false; // signal that next k-combination cannot be represented
x = v +(((v^x)/u)>>2); // v^x = 0'11^a10^b, (v^x)/u = 0'0^b1^{a+2}, and x ← x'100^b1^a
return true; // successful completion
}
对于 {1,2,3} 的所有组合,该算法的起始值应该是多少? 当我得到算法的输出后,如何恢复组合?
我尝试了以下直接改编,但我是按位算术的新手,我不知道这是否正确。
// find next k-combination, Java
int next_combination(int x)
{
int u = x & -x;
int v = u + x;
if (v==0)
return v;
x = v +(((v^x)/u)>>2);
return x;
}
【问题讨论】:
-
您是否尝试过运行代码?注: Wikipedia 算法使用
x作为输入和输出参数。 Java 没有这些。 -
@MattBall 当我运行代码时,它返回一个整数。不知道怎么解释,也不知道怎么翻译成组合。我将编辑我的 Java 改编版本。这是第一次尝试,只是在调试模式下分析 wiki 算法。感谢您指出这一点。
-
@Mr.Wizard 我按照你的建议继续。谢谢。
标签: java bit-manipulation combinations combinatorics