import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
//计算组合的算法
public class CombinationClass {
public CombinationClass()
{
}
//对于任意n选m个元素,如果m==0,则此次排法结束,如果m不为0,那么在n个元素中选择m个元素就是要首先在n个元素中选出一个元素,然后
//在其他n-1个元素中选择m-1个元素。因此,对于每一个n来讲,它的任务就是,将当前传入的集合中填充上自己的信息,然后比较是否有其他
//集合与自己所在集合相等如果这个集合长度为0,则重新建立一个集合,然后再把集合传入到其他的数据中。
public ArrayList<HashSet> computeCombine(int cardinalNum, int ordinalNum,int[] numList, HashSet resultSet,ArrayList<HashSet> resultList)
{
//拷贝副本,而不能引用原来的HashSet
HashSet resultSetEnter = (HashSet)resultSet.clone();
//如果m==0则此次排法结束
if(ordinalNum == 0)
{ //完毕一种排法,把它添加到序列中
resultList.add(resultSetEnter);
return resultList;
}
if(numList.length != cardinalNum)
return null;
int newList[] = new int[numList.length - 1];
for(int i = 0; i < numList.length; i ++)
{
//每次随便在cardinalNum中取出一个数,打印出来,然后在在其余的cardinalNum-1个数中取ordinal-1次
//如果集合长度为0,则新建一个集合
HashSet resultSetCopy =(HashSet)resultSet.clone();
if(resultSetCopy.size() == 0)
resultSetCopy = new HashSet();
resultSetCopy.add(numList[i]);
//如果有其他集合与本集合相等,则返回
boolean result = false;
for(int k = 0; k < resultList.size(); k ++)
{
HashSet hashSet = resultList.get(k);
result = HashSetEqual(hashSet,resultSetCopy);
//如果有集合和该集合相等,则跳出循环
if(result == true)
break;
}
//如果有集合和该集合相等,则进行下一次循环
if(result == true)
continue;
//在该集合中添加入该元素
//删掉numList[i]
for(int j = 0;j<i;j++)
{
newList[j] = numList[j];
}
for(int j = i + 1; j <= numList.length - 1; j ++)
{
newList[j - 1] = numList[j];
}
computeCombine(cardinalNum - 1,ordinalNum - 1, newList,resultSetCopy, resultList);
}
return null;
}
public static boolean HashSetEqual(HashSet hashSet, HashSet resultSetCopy)
{ int equal = 1;
Iterator it = hashSet.iterator();
if(resultSetCopy.size() == hashSet.size()){
while(it.hasNext())
{
if(equal == 0)
break;
if(equal == 1){
equal = 0;
int num = ((Integer)it.next()).intValue();
Iterator it2 = resultSetCopy.iterator();
while(it2.hasNext())
{
int num2 = ((Integer)it2.next()).intValue();
if(num == num2){
equal = 1;
break;
}
}
}
}
if(equal == 1)
return true;
else
return false;
}
return false;
}
}
//主方法
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CombinationClass combinationClass = new CombinationClass();
ArrayList<HashSet> resultList = new ArrayList<HashSet>();
combinationClass.computeCombine(8, 3, new int[]{1,2,3,4,5,6,7,8},new HashSet(), resultList);
System.out.println("BBBBBB" + resultList.size());
for(int i = 0; i < resultList.size(); i ++)
{
HashSet set = resultList.get(i);
Iterator it = set.iterator();
while(it.hasNext())
{
System.out.print(it.next() + " - ");
}
System.out.println();
}
}
}
分享到:
相关推荐
6位数,共有几种排列组合的算法,java实现
高效实现组合算法的一种方法是位移法,也称为滚动数组法。位移法主要利用位运算来快速生成组合序列,这种方法可以避免大量的重复计算,从而提高效率。在`Combination.java`文件中,你应该能看到这种位移法的实现,它...
在给定的标题“多边形填充算法java实现”中,我们可以推断这是一个Java编程项目,它实现了对多边形内部进行填充的功能。描述中提到的“扫描线算法”是实现这一功能的常见方法,这种方法基于逐行扫描图像并处理与...
总之,ARIMA模型是时间序列预测的重要工具,通过Java实现可以将这种统计方法集成到数据分析系统中。理解模型背后的理论,结合适当的库和编程技巧,可以在各种领域,如金融、气象预报、销售预测等,应用ARIMA模型进行...
Java遗传算法排课系统是一种利用遗传算法解决复杂优化问题的软件应用。在教育领域,排课是一个典型的组合优化问题,需要考虑多方面的约束条件,如教师时间冲突、教室容量限制、课程时间安排等。遗传算法作为一种启发...
遗传算法java实现 遗传算法是一种搜索启发式算法,它模拟自然选择和遗传过程,通过选择、交叉、变异等操作来搜索最优解。在交通路线和方式规划问题中,遗传算法可以用来解决 Vehicle Routing Problem(VRP),即...
Java实现AdaBoost涉及多个组件的开发,包括数据结构、弱分类器、权重更新机制以及组合策略。通过不断的迭代和优化,AdaBoost能够从弱分类器中构建出强大的分类系统。在实际项目中,理解并掌握AdaBoost的原理和实现...
在Java中实现维吉尼亚加密算法,我们需要理解以下几个核心概念: 1. **密钥**:维吉尼亚密码的关键在于其密钥,这是一个由字母组成的字符串,决定了加密和解密过程中使用的偏移量。密钥的长度决定了密码表的循环...
### Java组合算法详解 在Java编程语言中,组合算法是一种常用的数据处理方法,尤其是在需要从一组数据中选取特定数量元素的场景下...希望本文能够帮助读者更好地理解和掌握组合算法的核心概念及其在Java中的实现方式。
本资源“经典算法Java实现”为Java学习者和研究人员提供了一套完整的算法实现集合,旨在帮助他们更好地理解和运用这些算法。 一、排序算法 1. 冒泡排序:基础排序算法,通过不断交换相邻的逆序元素来逐步理顺数组...
在本案例中,“分治思想的棋盘算法java实现”是一个具体的编程实践,通过Java语言来解决棋盘覆盖问题。 棋盘覆盖问题是一个经典的分治问题,通常指的是将一个n×n的棋盘划分为大小为1×2的小矩形,使得这些小矩形...
通过以上介绍,我们可以看出LRU算法在Java中的实现主要依赖于HashMap和DoublyLinkedList这两个数据结构,它们结合在一起提供了高效且灵活的缓存管理能力。在实际应用中,LRU算法广泛应用于数据库的缓存系统、操作...
装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...
排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。
在这个Java实现中,我们将会探讨如何将Apriori算法应用于处理Excel数据,并在Eclipse环境中运行。 首先,我们需要了解Apriori算法的基本原理。Apriori算法基于两个关键概念:频繁集和闭合集。频繁集是指在数据集中...
本项目"gray码生成组合算法的java代码"是基于Java编程语言实现的,旨在结合组合数学原理生成Gray码。在实际编程中,生成Gray码通常涉及到循环移位和异或操作。下面将详细讲解这个程序可能涉及的知识点: 1. **Java...
蚁群算法是一种优化技术...通过这个Java实现的蚁群算法程序,可以深入理解算法的运作机制,同时提供了一个学习和交流的平台。无论是初学者还是经验丰富的开发者,都能从中受益,进一步提升对优化算法的理解和应用能力。
在这个Java实现的项目中,"Shamir密钥分享算法java.rar"包含了一个带有GUI图形界面的应用程序。用户可以输入要加密的字符串,设置共享值m(即总共生成的子密钥数量)和门限值n。这些参数决定了密钥的分散方式和重新...
下面我们将深入探讨弗洛伊德算法的原理及其Java实现。 弗洛伊德算法的基本思想是通过逐步考虑中间节点,更新每对顶点之间的最短路径。初始时,我们假设所有顶点间的最短路径就是它们之间的直接边权重。然后,对于图...
以下是对该算法及其Java实现的详细解释。 **LSB算法原理** LSB算法基于数字二进制表示,其核心思想是利用图像每个像素点颜色值的最低位进行信息隐藏。通常,图像由红、绿、蓝(RGB)三个通道组成,每个通道的每个...