算法:全组合算法

    public static List<int[]> combin(final int TOTAL, final int SELETED) {
        List<int[]> list = new ArrayList<int[]>(400000);
        int[] i = new int[SELETED];
        for (int x = 1; x <= SELETED; x++)
            i[x - 1] = x;
        final int LAST = SELETED - 1;
        while (true) {
            list.add(Arrays.copyOf(i, SELETED));
            i[LAST]++;
            for (int n = LAST; n > 0; n--) {
                //i[n]达到顶点
                if (i[n] > TOTAL - SELETED + 1 + n) {
                    i[n - 1]++;
                    for (int x = n; x < SELETED; x++) {
                        i[x] = i[x - 1] + 1;
                    }
                }
            }
            if (i[0] == TOTAL - LAST + 1) {
                break;
            }
        }
        return list;
        // return null;
    }

    public static void main(String[] args) {
        long i = System.currentTimeMillis();
        List<int[]> list = combin(36, 5);
        System.out.println(System.currentTimeMillis() - i);
        System.out.println(list.size());
    }

如果有兴趣使用的同仁,请自行修改int[]下标记录数组为更合适的数据结构。

算法:全组合算法,布布扣,bubuko.com

时间: 2024-10-18 16:07:01

算法:全组合算法的相关文章

全组合算法

//全组合算法        public static List<List<T>> FullCombination<T>(List<T> lstSource)        {            var n = lstSource.Count;            var max = 1 << n;            var lstResult = new List<List<T>>();           

高效率的全组合算法(Java版实现)

博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取,0表示不取.例如,对ABC三个元素进行全组合,  100表示取A,010表示取B,001表示取C,101表示取AC  110表示取AB,011表示取BC,111表示取ABC 注意到表示取法的二进制数其实就是从1到7的十进制数 推广到对n个元素进行全排列,取法就是从1到2^n-1的所有二进制形式 要

[LeetCode] Subsets I (78) &amp; II (90) 解题思路,即全组合算法

78. Subsets Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example,If nums = [1,2,3], a solution is: [ [3], [1]

java全组合算法

public static void combination(int[] s) { if (s.length == 0) { return; } int len = s.length; int n = 1 << len; // 从1循环到2^len-1 for (int i = 1; i < n; i++) { StringBuffer sb = new StringBuffer(); // 查看第一层循环里面的任意一种取值当中的哪一位是1[比如ab,011], 如果是1,对应的字符就存

算法练习 -- DP C# 实现 全组合算法

const string splitor = "----"; void Main() { var r = Dp(new List<string>(){"a","b","c","d","e","f","g"}); Console.WriteLine(r); //print combosition count var count = 0;

Leetcode分类解析:组合算法

Leetcode分类解析:组合算法 所谓组合算法就是指:在解决一些算法问题时,需要产生输入数据的各种组合.排列.子集.分区等等,然后逐一确认每种是不是我们要的解.从广义上来说,组合算法可以包罗万象,甚至排序.各种搜索算法都可以算进去.最近读<The Algorithm Design Manual>时了解到这种归类,上网一查,甚至有专门的书籍讲解,而且Knuth的巨著TAOCP的第四卷就叫组合算法,看来还真是孤陋寡闻了!于是最近着重专攻了一下Leetcode中所有相关题目,在此整理一下学习心得.

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff

字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba . #include<stdio.h> #include<string.h> static int number=0; void Swap(char *a ,char *b) { char temp =

获取所有组合算法、获取全排列算法(java)

转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数(Combination). 如1,2,3三个元素的全组合为: 1 2 3 12 13 23 123 以下是java实现的获取全组合及其个数的算法: import java.io.Buffere