组合算法

组合算法

自交非杂交

指定数组: {"A","B","C","D"}

指定相交次数:3

输出:

AAA AAB AAC AAD ABA ABB ABC ABD...DDA DDB DDC DDD

直接上代码:

/// <summary>
/// 组合算法
/// </summary>
/// <param name="word">需要组合的字符数组:{"A","B","C","D"}</param>
/// <param name="num">组合的次数</param>
/// <returns>组合结果集</returns>
static List<string> Combination(string[] word, int num)
{
    /*结果集*/
    List<string> result = new List<string>();
    /*把字符数字放入队列*/
    Queue<string> _wordque = new Queue<string>();
    foreach (var w in word) _wordque.Enqueue(w);
    /*字符数组总长度*/
    var len = word.Length;
    /*字符数组存在的组合总数*/
    var sum = int.Parse(Math.Pow(len, num).ToString());
    /*第一次分片个数*/
    var overlap = sum / len;
    /*次序*/
    var rank = 0;
    /*
        * 设需要生成3位长度字符组合,则{"A","B","C","D"}数组共有64中组合方式
        * 第1个字符第一次分片:16(A)+16(B)+16(C)+16(D),即所有组合只会出现A B C D四种开头,那么每种开头存在16中组合
        * 第2个字符第二次分片:4(AA)+4(AB)+4(AC)+4(AD)+...+4(DA)+4(DB)+4(DC)+4(DD),在1基础上所有组合只会出现AA?,AB?,AC?,AD?...DA?,DB?,DC?,DD?的组合方式
        * 第3个字符第三次分片:1(AAA+AAB+AAC+AAD+ABA+ABC+...+DDA+DDB+DDC+DDD),在2基础上所有组合只会出现AA+(ABCD)组合方式
        * 64->16->4->1组合法
        * 说明:以上只是针对测试用例的数值解释,当输入的num不是3的时候,将改变对应的数值
        *
        */
    while (overlap >= 1)
    {
        if (!result.Any())
        {
            /*1.组合:取第一个字符*/
            for (var j = 0; j < len; j++)
            {
                /*出队,分配给第一片的result集合*/
                var _word = _wordque.Dequeue();
                for (var i = 0; i < overlap; i++) result.Add(_word);
                /*归队*/
                _wordque.Enqueue(_word);
            }
        }
        else
        {
            /*2.组合:依次取后续字符*/
            /*取最后一个字符判断*/
            var count = overlap == 1 ? len : overlap;
            count = int.Parse((Math.Pow(count, rank) * len).ToString());
            for (var i = 0; i < count; i++)
            {
                var start = i * overlap;
                if (start >= result.Count()) break;
                var end = start + overlap;
                var _word = _wordque.Dequeue();
                for (int j = start; j < end; j++)
                {
                    result[j] = result[j] + _word;
                }
                _wordque.Enqueue(_word);
            }
        }
        overlap = overlap / len;
        rank++;
    }
    return result;
}
时间: 2024-11-10 07:06:39

组合算法的相关文章

排列组合算法

实现组合算法C(n,k),可以用递归实现: python代码: 1 import copy #实现list的深复制 2 3 def combine(lst, l): 4 result = [] 5 tmp = [0]*l 6 length = len(lst) 7 def next_num(li=0, ni=0): 8 if ni == l: 9 result.append(copy.copy(tmp)) 10 return 11 for lj in range(li,length): 12 t

优化后的组合算法

项目中一个算法中涉及到了组合,大概业务是:给定一个值X,从n个数中找出能组合加起来和X相等的集合.假设用通常的组合算法.数量级是2的n的阶乘.假设记录比較多的话,有效率问题.我针对我们的业务.优化写了一个算法. 大概逻辑:先给n个值从小到大排序形成一个队列.组合数从2開始依次递增,每次运行一个剔除操作,如果组合数递增到m.取队列中前面m-1个连续的值.并加上最大的一个值V.如果大于X,那么舍弃V.这样队列是不断缩小的. 舍弃没用的组合.运算量也会大大降低.详细见代码: /** * 从list中找

(转)C#全排列组合算法

全排列组合算法方法: public static List<List<T>> FullCombination<T>(List<T> lstSource){ var n = lstSource.Count; var max = 1 << n;//1乘以2的n次方 var lstResult = new List<List<T>>(); for (var i = 0; i < max; i++) { var lstTem

算法:全组合算法

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 (

Leetcode分类解析:组合算法

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

C递归版的全排列和组合算法

For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. 全排列: 从1开始递归,然后对2递归,最后对3递归 顺序是先输出 1 2 3  1 3 2  2 1 3   2  3 1 ............稍微分析一下就出来了 class Solution { private: vector<vector<int>>r

关于足彩任选九的组合算法

最近互联网彩票被国家叫停进行整改了,整改后互联网公司获取利润肯定会降低,但是不得不说中国的互联网彩票销售需要进行整改了,虽然对行业是阵痛,但是能够更好的规范彩票市场,对整个市场都会起到积极的作用.前段时间在做互联网彩票时也遇到了一些问题,特别是足彩任选九的复试组合算法. 足彩标注投注玩法:从14场比赛中任意选择9场比赛,每场比赛选择1种比赛结果为1注,每场比赛最多可选3种结果,单注最高奖金500万元!标准投注时可选择1-8场比赛结果作为胆码,其它比赛场次结果作为拖码进行胆拖投注,单注最高奖金50

java排列组合算法代码实现

原文:java排列组合算法代码实现 源代码下载地址:http://www.zuidaima.com/share/1550463479024640.htm java排列组合算法,有需要研究的童鞋可以下载,运行结果如下: package com.zuidaima.test; /** *@author www.zuidaima.com **/ public class Pailie { public static void main(String[] args) { int[] ia = {1, 2,

字符串数组全排列——逐个追加组合算法

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac;接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位