Java 使用字典顺序和位运算顺序生成有限集的所有组合

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)

考虑以下整数{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) 
    return v; 
  x = v +(((v^x)/u)>>2); 
  return x; 
}

我找到了一个能解决这个问题的类。请参见此处的类组合生成器

要恢复组合,请执行以下操作:

for(Long combination : combinationIterator(10,3))       
    toCombination(toPermutation(combination);

谢谢大家的输入。

我已经编写了一个类来处理处理处理二项式系数的常见函数,这是您的问题所属的问题类型。它执行以下任务:

  • 将任意N选择K的所有K索引以良好格式输出到文件。可以用更具描述性的字符串或字母替换K索引。这种方法使得解决这类问题变得非常简单

  • 将K索引转换为已排序二项系数表中某个条目的正确索引。这种技术比以前发布的依赖于迭代的技术要快得多。它通过使用帕斯卡三角形固有的数学特性来实现这一点。我的论文谈到了这一点。我相信我是第一个发现并发表这项技术的人,但我可能错了

  • 将已排序的二项式系数表中的索引转换为相应的K索引。我相信它可能比你找到的链接要快

  • 使用此方法计算二项式系数,它不太可能溢出,并且适用于较大的数字

  • 该类是用.NETC#编写的,它提供了一种通过使用泛型列表来管理与问题相关的对象(如果有)的方法。这个类的构造函数接受一个名为InitTable的bool值,如果为true,它将创建一个通用列表来保存要管理的对象。如果此值为false,则不会创建表。执行上述4种方法不需要创建表。提供了访问器方法来访问表

  • 有一个关联的测试类,它显示了如何使用该类及其方法。它已经过2个案例的广泛测试,没有已知的bug

  • 要阅读有关此类的信息并下载代码,请参阅


    将此类转换为Java应该不难。

    您是否尝试过运行代码?注意:维基百科算法使用
    x
    作为输入和输出参数。Java没有这些。@MattBall当我运行代码时,它返回一个整数。我不知道如何解释它,也不知道如何将它翻译成一个组合。我将编辑我的Java改编。这是第一次尝试,只是在调试模式下分析wiki算法。谢谢你指出这个。@Mr.Wizard我按照你的建议进行。谢谢
    for(Long combination : combinationIterator(10,3))       
        toCombination(toPermutation(combination);