【问题标题】:How to create all possible arrangement of 12 red and 12 blue ball in java [closed]如何在java中创建12个红色和12个蓝色球的所有可能排列[关闭]
【发布时间】:2015-12-23 03:13:11
【问题描述】:

我有 12 个蓝色球和 12 个红色球,现在想创建所有可能的排列方式。在java中我想创建一系列像这样的所有可能的安排

[1,1,2,1,2,1,2,2,1,1,2,1,2,1,1,2,1,2,1,1,2,2,2,2]

1 代表红色,2 代表蓝色。我想以数组的形式创建所有这些可能的组合。

有什么想法可以有效地做到这一点吗?

【问题讨论】:

  • 两件事:这是一组 24 个元素的排列,而该组的大小是 24! (24 个阶乘,或~620 个六分之一组合)。根据您生成它的方式,您可能没有足够的内存来完成它。
  • @Makoto 这不是排列。看我的回答。

标签: java arrays combinations


【解决方案1】:

试试这个。

static void perm(int red, int blue, int max, int i, int[] result) {
    if (i >= max) {
        System.out.println(Arrays.toString(result));
        return;
    }
    if (red > 0) {
        result[i] = 1;
        perm(red - 1, blue, max, i + 1, result);
    }
    if (blue > 0) {
        result[i] = 2;
        perm(red, blue - 1, max, i + 1, result);
    }
}

static void perm(int red, int blue) {
    perm(red, blue, red + blue, 0, new int[red + blue]);
}

public static void main(String[] args) {
    perm(12, 12);
}

【讨论】:

  • 你的代码效率很高,但缺少一些解释。
【解决方案2】:

它是从 24 个元素中选择的 12 个元素:COMBINATIONS

那么你正好有 2704156 个结果。

1 只使用组合:

您可以使用任何库来生成组合。喜欢我的:http://sourceforge.net/projects/gastor/files/org/gastor/open/algorithm/Combinatorics.java/download

你取一个包含 24 个位置(0 到 23)的向量,然后选择 12 个

这为您提供了所有可能的选择:

Vector<Integer> pos=new Vector<Integer>();
for (int i=0;i<24;i++)
    pos.add(i);

// Combinations 5 between 24
Vector<Vector<Integer>> combine=Combinatorics.combinaisons(pos, 5);

System.out.println("COMBINE "+combine.size());

for (int k=0;k<combine.size()<10;k++)
    System.out.println(combine.get(k)); 
    // You have the positions => convert to your format

不幸的是,对于 24 之间的 12,它对内存来说太多了。练习:用数组而不是向量重写算法,不要保留它们。

另一种可能性,在这种情况下更实用:获取所有子集,并保留好的子集。

所有子集为您提供 2^24 种可能性=16777216(不要太多),只保留具有 12 个元素的那些。

大数字需要更多时间。

遍历从 0 到 16777215 的每个数字,并按位分解:您将拥有这样的每个子集:

{8, 18, 19, 20, 21} : 5 个元素的一个子集

您保留 12 个元素的子集,并且您有自己的位置。

public static BitSet bitsSet(long num)
{
BitSet bitSet = new BitSet();
for (int i = 0; i < 64; i++)
    if (((num >>> i) & 1) != 0)
            bitSet.set(i);
return bitSet;
}   

int total=24;
int how_many=12;

int count=0;

int max=(int) Math.pow(2.0,total);
for (int i=0;i<max;i++)
    {
    BitSet bitset=bitsSet(i);
    if (bitset.cardinality()==how_many)
        {
        // get the bits => and convert to your format
        System.out.println(bitset);
        count++;
        }
    }

System.out.println("COUNT:"+count);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2021-07-04
    • 2019-05-21
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多