`
huangjun_mail
  • 浏览: 118779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

集合组合算法

    博客分类:
  • Java
阅读更多

//设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合。
// 例如,从集合{1..4}中选取2个元素的所有组合的输出结果为:1 2,1 3,1 4,2 3, 2 4,3 4。 .
 //集合allLst{a1,a2,....an}
 //组合个数(维度):k(k<=n)
 //思路:
 //首先按照顺序排列第一个组合:{a1,a2....ak}
 //第一步:k项递增index,然后一直到an,到达第k项的极值.
 //第二步:向前递增k-1项递增index = index++,k项index按照k-1项顺序排列,再次递归k项到极值。
 //     如果k-1项到达极值index=n -(k - dimensi[维度,k-1项维度k-1]),以此类推,向前递增k-2项index,递归第二步。
 //第三步:当递归到第一项的最大极值,组合结束。

 

<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> -->package com.base.test1;

import java.util.ArrayList;
import java.util.List;

public class Test {

    
///结束标记
    public static boolean flag = false;
    
class Element
    {
        
public Object data;
        
public int index;
    }
    
public static void main(String[] args)
    {

        Test combine 
= new Test();
        
int n = 10;
        
int k = 9;
        ArrayList lst 
= new ArrayList();
        
forint i =0;i < n;i++)
        {
            lst.add(
new Integer(i+1));
        }
        combine.computeColleCombine(lst, k);
    }
    
public void computeColleCombine(List allLst,int k)
    {
        Element[] objs 
= new Element[k];
        
//首先按照顺序组合第一个排列
        
//{a1,a1,....ak}
        for(int i = 0;i < k;i++)
        {
            Element elment 
= new Element();
            elment.data 
= allLst.get(i);
            elment.index 
= i;
            objs[i] 
= elment;
        }
        printObjs(objs);
        
int n = allLst.size();
        
if( n > k )
        {
            
//从后向前控制组合
            cycDimensionality(allLst,objs,k - 1);
        }
    }
    
    
private void cycDimensionality(List allLst,Element[] elments,int dimensi)
    {
        
int k = elments.length;
        
int n = allLst.size();
        
if(flag)
        {
            
return ;
        }
        
//控制最后一个元素开始打印
        if(dimensi==(k-1))
        {
            
//第k项
            Element lastEl = elments[k - 1];
            
//一直递增k项到极值
            while(lastEl.index < (n - 1))
            {
                lastEl.index 
= lastEl.index + 1;
                lastEl.data 
= allLst.get(lastEl.index);
                printObjs(elments);
            }
            
//向前一项递增index
            cycDimensionality(allLst,elments,dimensi - 1);

        }
else{
            
//前一项=如index = k - 2
            Element preEl = elments[dimensi];
            
//当前维度项索引最大极值
            int currDimensiMaxIndex = n - 1 - (k - 1 - dimensi);
            
if(preEl.index < currDimensiMaxIndex)
            {
                preEl.index 
= preEl.index + 1;
                preEl.data 
= allLst.get(preEl.index);
                
//preEl后面元素个数
                int nextCount = k - 1 - dimensi;
                
//排序后面的元素
                for(int i = 0;i < nextCount;i++)
                {
                    
int nextIndex= preEl.index + i + 1;
                    
int nextDimensi = dimensi + i + 1;
                    elments[nextDimensi].index 
= nextIndex;
                    elments[nextDimensi].data 
= allLst.get(nextIndex);
                }
                printObjs(elments);
                
//结束点:当第一维度达到极值,结束
                if(preEl.index == currDimensiMaxIndex &&
                        dimensi 
== 0)
                {
                    flag 
= true;
                    
return;
                }
                
//递归k项元素到极值
                cycDimensionality(allLst,elments,k - 1);
            }
            
else{
                cycDimensionality(allLst,elments,dimensi 
- 1);
            }
        }
        
    }
    
    
private  void printObjs(Element[] objs)
    {
        
for(int i = 0;i < objs.length;i++)
            System.out.print(objs[i].data);
        System.out.println();
    }
}

 


 

 

分享到:
评论

相关推荐

    C#实现排列组合算法完整实例

    排列组合是常见的数学问题,本文就以完整实例形式讲述了C#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下: 首先,数学中排列组合,可表示为:排列P(N,R) 其实排列实现了,组合也就实现了,组合...

    C++实现生成组合算法

    C++实现生成组合算法 在计算机科学和数学中,组合算法是一种常用的算法,用于生成所有可能的组合或子集。下面是 C++ 实现生成组合算法的详细介绍。 一、组合的基本概念 组合是指从一个集合中选出若干元素,按照...

    基于位图的n选m的组合算法实现(C#)

    在IT领域,组合算法是一种常见的数据处理方法,用于从给定的集合中找出所有可能的m个元素的子集,当需要对大量数据进行筛选或分析时尤其有用。本项目是基于C#语言实现的n选m组合算法,能够处理各种类型的数据,包括...

    matlab 组合算法参考资料及代码

    组合算法是解决从有限且不重复的元素集合中选择特定数量元素的问题。在计算领域,这通常与组合数学相关,包括计算组合数(即“n选k”问题)以及生成所有可能的组合。 在MATLAB中,我们可以利用内置函数和编程技巧来...

    组合算法|C++实现

    ### 组合算法在C++中的实现 #### 知识点概述 本篇文章将深入探讨一个基于C++语言实现的组合算法案例。该算法能够从一个整数序列中选取特定数量的元素进行组合,并输出所有可能的组合结果。文章首先简要介绍了组合...

    Java排列组合算法分析和代码实现

    3. 位运算的理解:在组合算法中,位运算的运用可以显著提升算法性能,你需要熟悉位运算符及其在Java中的使用。 4. 缓存优化:对于组合问题,可以考虑使用缓存存储已计算的结果,避免重复计算。 总之,这个资源包...

    java组合算法

    无论是通过位操作还是递归方法实现的组合算法,都能够有效地解决从给定集合中选择元素的问题。在实际应用中,根据具体的业务需求和技术背景选择合适的方法是非常重要的。希望本文能够帮助读者更好地理解和掌握组合...

    动态规划,分治算法,概率算法,模拟退火算法,搜索算法,贪婪算法,网上matlab,遗传算法,组合算法

    9. **组合算法**:组合算法通常涉及从有限集合中选择元素的问题,如排列组合、子集选择等。这些问题常常出现在组合优化问题中,例如0-1背包问题、组合调度问题等。 以上算法在实际问题中都有广泛的应用,理解和掌握...

    基于c语言的排列组合算法

    在这个“基于C语言的排列组合算法”中,我们将深入探讨这两个概念以及如何使用C语言来实现它们。 排列是有限集合中的元素的一种有顺序的排列方式。在C语言中,我们可以使用递归方法来实现排列算法。首先,我们需要...

    组合算法所有代码rar.zip_组合算法

    组合算法是一种在计算机科学中广泛使用的数学方法,用于从给定集合中选择特定数量的元素,而不考虑元素的顺序。这种算法在各种场景下都非常有用,例如在数据处理、优化问题、概率计算以及人工智能等领域。下面我们将...

    集合幂级数的性质与应用及其快速算法

    总结来说,集合幂级数及其快速算法提供了一种在组合数学和算法设计中处理集合运算的新方法。通过深入理解集合的基本性质,并将这些性质融入到幂级数的概念中,可以构建出在理论和应用中都有重要价值的新工具。这不仅...

    组合数学及其算法(杨振生)

    **组合数学及其算法** 组合数学是一门研究有限集合中元素排列、组合以及各种计数问题的数学分支。在计算机科学中,它具有极其重要的地位,因为很多算法设计和复杂性分析都离不开组合数学的理论支持。杨振生教授的...

    matlab 经典算法集合

    本文将深入探讨标题"matlab 经典算法集合"所提及的几个重要算法,包括模拟退火、汉密尔顿回路、随机数生成、网络流、线性规划、解方程以及数据分析。 1. **模拟退火算法**:模拟退火是基于物理退火过程的全局优化...

    集合划分算法java源码

    集合划分算法是组合数学中的一个重要概念,主要用于将一个集合分成两个或多个互不相交的子集。在计算机科学中,这种算法常用于数据处理、图论问题、资源分配等场景。Java作为一种广泛使用的编程语言,提供了丰富的...

    论文研究-一种解决集合组合优化问题的差分进化算法 .pdf

    一种解决集合组合优化问题的差分进化算法,毕晓君,,现实生活中,很多问题都属于集合组合优化问题,例如背包问题、生产资料调度问题、通信系统用户调度问题等等。针对集合组合优化问

    组合算法_matlab源码.rar

    在MATLAB环境中,组合算法是一种处理有限集合的子集生成问题的有效工具,广泛应用于数据分析、机器学习、优化问题等领域。本资源"组合算法_matlab源码.rar"包含了一组MATLAB实现的组合算法,旨在帮助用户理解和应用...

    gray码生成组合算法的java代码

    本项目"gray码生成组合算法的java代码"是基于Java编程语言实现的,旨在结合组合数学原理生成Gray码。在实际编程中,生成Gray码通常涉及到循环移位和异或操作。下面将详细讲解这个程序可能涉及的知识点: 1. **Java...

    组合数学及其算法

    组合数学是数学的一个分支,它主要研究有限集合中元素的不同选择和排列方式。在计算机科学中,组合数学及其算法扮演着至关重要的角色,因为它为解决许多实际问题提供了理论基础和计算方法。组合数学包括组合计数、...

    组合算法.rar_算法解读与代码

    组合算法是计算机科学中一种重要的算法类型,主要处理如何有效地从给定的有限元素集合中选取一部分元素的问题。这些元素可以是无序的,也可以是有一定顺序的,但通常不考虑重复选择。在数学建模和数学课件中,组合...

Global site tag (gtag.js) - Google Analytics