【问题标题】:Can anyone explain how this code generates combinations?谁能解释这段代码如何生成组合?
【发布时间】:2010-10-24 17:29:47
【问题描述】:

我在 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^n 算法。你应该使用别的东西。

标签: java algorithm


【解决方案1】:

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

代码只是简单地循环遍历足够的二进制数来表示一整套n 项目(从 0 到 (1&lt;&lt;n) - 1,与 2^n-1 相同),并将每个恰好具有 @ 的项目相加987654325@ 1 位(意味着由这些位表示的项目在给定的组合中)到列表中。

【讨论】:

    【解决方案2】:

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

    对此有更好的算法。我建议你在别处搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 2011-02-11
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多