谁能解释这段代码如何生成组合?

时间:2010-10-24 09:03:48

标签: java algorithm

我找到了generating combinations的一些Java代码,但我无法理解它在做什么,因为它使用位执行一些奇怪的操作。

import java.util.Collections;
import java.util.LinkedList;

public class Comb{

    public static void main(String[] args){
            System.out.println(comb(3,5));
    }

    public static String bitprint(int u){
            String s= "";
            for(int n= 0;u > 0;++n, u>>= 1)
                    if((u & 1) > 0) s+= n + " ";
            return s;
    }

    public static int bitcount(int u){
            int n;
            for(n= 0;u > 0;++n, u&= (u - 1));
            return n;
    }

    public static LinkedList<String> comb(int c, int n){
            LinkedList<String> s= new LinkedList<String>();
            for(int u= 0;u < 1 << n;u++)
                    if(bitcount(u) == c) s.push(bitprint(u));
            Collections.sort(s);
            return s;
    }
}

2 个答案:

答案 0 :(得分:5)

一组项目的特定组合可以表示为二进制数字,其中数字的位n表示该组合是否包含该组的项目#n

代码只是循环通过足够的二进制数来表示一整套n项(从0到(1<<n) - 1,与2 ^ n-1相同),并添加每一个在列表中具有正好c 1位(意味着这些位表示的项在给定的组合中)。

答案 1 :(得分:1)

给定选择(r,n),它将创建n位宽,然后从0到2 ^ n计数。它检查每个值以查看它是否设置了r位。如果是,则将其添加为有效组合。使用这些数字,它形成有效的组合字符串。

有更好的算法。我建议你去其他地方搜索。