`
xiems
  • 浏览: 9867 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

组合算法 java实现方式

阅读更多

 

import java.util.ArrayList;

import java.util.List;

/**

组合算法(来自互联网,java implement by xiems)

  本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标   

  代表的数被选中,为0则没选中。     

  首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。     

  然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为   

  “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。     

  当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得   

  到了最后一个组合。     

  例如求5中选3的组合:     

  1   1   1   0   0   //1,2,3     

  1   1   0   1   0   //1,2,4     

  1   0   1   1   0   //1,3,4     

  0   1   1   1   0   //2,3,4     

  1   1   0   0   1   //1,2,5     

  1   0   1   0   1   //1,3,5     

  0   1   1   0   1   //2,3,5     

  1   0   0   1   1   //1,4,5     

  0   1   0   1   1   //2,4,5     

  0   0   1   1   1   //3,4,5  

 *

 */

public class CombinationUtil {

public static void main(String[] args) {

//combinate(2, 2);

combinateAll(5);

}

 

/**

* n个数的全组合

* @param n

* @return

*/

public static List<List<Integer>> combinateAll(int n){

List<List<Integer>> resultList = new ArrayList<List<Integer>>();

for (int i = 1; i <= n; i++) {

resultList.addAll(combinate(n, i));

}

return resultList;

}

 

/**

* 从n个数中取m个数的组合

* @param n

* @param m

* @return

*/

public static List<List<Integer>> combinate(int n, int m) {

// 构造初始化字符串,前m位为1,后n-m位为0

String str = "";

for (int i = 0; i < n; i++) {

str += i < m ? "1" : "0";

}

// 最终字符串为后m位为1,前面n-m位为0

String lastStr = str.substring(m) + str.substring(0, m);

// System.out.println(lastStr);

 

List<List<Integer>> resultList = new ArrayList<List<Integer>>();

resultList.add(getIndex(str));

//System.out.println(getIndex(str));

while (!str.equals(lastStr)) {

// 取到第一个10

int index = str.indexOf("10");

// 转换10为01

String suff = "01" + str.substring(index + 2);

// 取10前的字符串

String pre = str.substring(0, index);

// 统计1的个数,用于重新构造前字符串

int count = 0;

for (int i = 0; i < pre.length(); i++) {

if (pre.charAt(i) == '1') {

count++;

}

}

// 重新构造前字符串

String newPre = "";

for (int i = 0; i < pre.length(); i++) {

newPre += i < count ? "1" : "0";

}

str = newPre + suff;

resultList.add(getIndex(str));

}

return resultList;

}

 

/**

* 显示下标组合

* @param str

* @return

*/

private static List<Integer> getIndex(String str) {

List<Integer> indexList = new ArrayList<Integer>();

for (int i = 0; i < str.length(); i++) {

if (str.charAt(i) == '1') {

indexList.add(i);

}

}

System.out.println(indexList);

return indexList;

}

}

 

0
0
分享到:
评论

相关推荐

    6位数,共有几种排列组合的算法java实现

    6位数,共有几种排列组合的算法,java实现

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

    高效实现组合算法的一种方法是位移法,也称为滚动数组法。位移法主要利用位运算来快速生成组合序列,这种方法可以避免大量的重复计算,从而提高效率。在`Combination.java`文件中,你应该能看到这种位移法的实现,它...

    多边形填充算法java实现

    在给定的标题“多边形填充算法java实现”中,我们可以推断这是一个Java编程项目,它实现了对多边形内部进行填充的功能。描述中提到的“扫描线算法”是实现这一功能的常见方法,这种方法基于逐行扫描图像并处理与...

    arima 算法 JAVA 实现.zip

    总之,ARIMA模型是时间序列预测的重要工具,通过Java实现可以将这种统计方法集成到数据分析系统中。理解模型背后的理论,结合适当的库和编程技巧,可以在各种领域,如金融、气象预报、销售预测等,应用ARIMA模型进行...

    遗传算法java实现

    遗传算法java实现 遗传算法是一种搜索启发式算法,它模拟自然选择和遗传过程,通过选择、交叉、变异等操作来搜索最优解。在交通路线和方式规划问题中,遗传算法可以用来解决 Vehicle Routing Problem(VRP),即...

    1204 Java 遗传算法排课java sqlserver.rar_java排课算法_排课_排课系统java_遗传算法Java

    Java遗传算法排课系统是一种利用遗传算法解决复杂优化问题的软件应用。在教育领域,排课是一个典型的组合优化问题,需要考虑多方面的约束条件,如教师时间冲突、教室容量限制、课程时间安排等。遗传算法作为一种启发...

    java组合算法

    ### Java组合算法详解 在Java编程语言中,组合算法是一种常用的数据处理方法,尤其是在需要从一组数据中选取特定数量元素的场景下...希望本文能够帮助读者更好地理解和掌握组合算法的核心概念及其在Java中的实现方式。

    AdaBoost算法java实现

    Java实现AdaBoost涉及多个组件的开发,包括数据结构、弱分类器、权重更新机制以及组合策略。通过不断的迭代和优化,AdaBoost能够从弱分类器中构建出强大的分类系统。在实际项目中,理解并掌握AdaBoost的原理和实现...

    维吉尼亚加密算法的JAVA实现

    在Java中实现维吉尼亚加密算法,我们需要理解以下几个核心概念: 1. **密钥**:维吉尼亚密码的关键在于其密钥,这是一个由字母组成的字符串,决定了加密和解密过程中使用的偏移量。密钥的长度决定了密码表的循环...

    经典算法Java实现

    本资源“经典算法Java实现”为Java学习者和研究人员提供了一套完整的算法实现集合,旨在帮助他们更好地理解和运用这些算法。 一、排序算法 1. 冒泡排序:基础排序算法,通过不断交换相邻的逆序元素来逐步理顺数组...

    LRU算法 java实现

    通过以上介绍,我们可以看出LRU算法在Java中的实现主要依赖于HashMap和DoublyLinkedList这两个数据结构,它们结合在一起提供了高效且灵活的缓存管理能力。在实际应用中,LRU算法广泛应用于数据库的缓存系统、操作...

    分治思想的棋盘算法java实现

    在本案例中,“分治思想的棋盘算法java实现”是一个具体的编程实践,通过Java语言来解决棋盘覆盖问题。 棋盘覆盖问题是一个经典的分治问题,通常指的是将一个n×n的棋盘划分为大小为1×2的小矩形,使得这些小矩形...

    排列组合算法实现

    排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。

    装载问题-分支限界算法-java实现

    装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...

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

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

    Apriori算法的Java实现

    在这个Java实现中,我们将会探讨如何将Apriori算法应用于处理Excel数据,并在Eclipse环境中运行。 首先,我们需要了解Apriori算法的基本原理。Apriori算法基于两个关键概念:频繁集和闭合集。频繁集是指在数据集中...

    Shamir密钥分享算法java.rar

    在这个Java实现的项目中,"Shamir密钥分享算法java.rar"包含了一个带有GUI图形界面的应用程序。用户可以输入要加密的字符串,设置共享值m(即总共生成的子密钥数量)和门限值n。这些参数决定了密钥的分散方式和重新...

    蚁群算法JAVA实现

    蚁群算法是一种优化技术...通过这个Java实现的蚁群算法程序,可以深入理解算法的运作机制,同时提供了一个学习和交流的平台。无论是初学者还是经验丰富的开发者,都能从中受益,进一步提升对优化算法的理解和应用能力。

    java实现弗洛伊德算法

    下面我们将深入探讨弗洛伊德算法的原理及其Java实现。 弗洛伊德算法的基本思想是通过逐步考虑中间节点,更新每对顶点之间的最短路径。初始时,我们假设所有顶点间的最短路径就是它们之间的直接边权重。然后,对于图...

    各种算法的java实现

    在《各种算法java实现.docx》这个文档中,你可能会找到以上算法的详细解释和Java代码示例。通过学习这些内容,不仅可以加深对算法的理解,还能提升Java编程能力,对日后的软件开发工作大有裨益。对于初学者来说,这...

Global site tag (gtag.js) - Google Analytics