Java 使用字典顺序和位运算顺序生成有限集的所有组合
考虑以下整数{1,2,3}数组长度3的所有组合 我想使用下面的算法遍历长度3的所有组合 对于{1,2,3}的所有组合,这个算法的起始值应该是多少? 当我得到算法的输出时,如何恢复组合 我尝试了以下直接调整,但我对按位算术还不熟悉,我不知道这是否正确Java 使用字典顺序和位运算顺序生成有限集的所有组合,java,bit-manipulation,combinations,combinatorics,Java,Bit Manipulation,Combinations,Combinatorics,考虑以下整数{1,2,3}数组长度3的所有组合 我想使用下面的算法遍历长度3的所有组合 对于{1,2,3}的所有组合,这个算法的起始值应该是多少? 当我得到算法的输出时,如何恢复组合 我尝试了以下直接调整,但我对按位算术还不熟悉,我不知道这是否正确 // find next k-combination, Java int next_combination(int x) { int u = x & -x; int v = u + x; if (v==0)
// 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;
}
我找到了一个能解决这个问题的类。请参见此处的类组合生成器 要恢复组合,请执行以下操作:
for(Long combination : combinationIterator(10,3))
toCombination(toPermutation(combination);
谢谢大家的输入。我已经编写了一个类来处理处理处理二项式系数的常见函数,这是您的问题所属的问题类型。它执行以下任务:
将此类转换为Java应该不难。您是否尝试过运行代码?注意:维基百科算法使用
x
作为输入和输出参数。Java没有这些。@MattBall当我运行代码时,它返回一个整数。我不知道如何解释它,也不知道如何将它翻译成一个组合。我将编辑我的Java改编。这是第一次尝试,只是在调试模式下分析wiki算法。谢谢你指出这个。@Mr.Wizard我按照你的建议进行。谢谢
for(Long combination : combinationIterator(10,3))
toCombination(toPermutation(combination);