組合演算法java實現
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();
}
}
}
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();
}
}
}
相關文章
- Java實現全排列、組合演算法Java演算法
- python實現高效率的排列組合演算法Python演算法
- [整] JavaScript m選n組合演算法JavaScript演算法
- 機器學習:整合演算法機器學習演算法
- 機器學習之整合演算法機器學習演算法
- 排序演算法 Java實現排序演算法Java
- 排序演算法Java實現排序演算法Java
- java實現Bitmap演算法Java演算法
- KMP演算法 Java實現KMP演算法Java
- 遞迴演算法實踐---實現排列組合遞迴演算法
- JAVA實現DIJKSTRA演算法Java演算法
- Java利用Comparator實現分組排序Java排序
- 【機器學習】--整合演算法從初始到應用機器學習演算法
- 《計算機程式設計藝術,卷4A:組合演算法(一)(英文版)》前言計算機程式設計演算法
- 排序演算法-Java實現快速排序演算法排序演算法Java
- java氣泡排序演算法實現Java排序演算法
- QQ TEA加密演算法 JAVA實現加密演算法Java
- Java實現AES和RSA演算法Java演算法
- 10大排序演算法——Java實現排序演算法Java
- 排序演算法:Java實現希爾排序排序演算法Java
- java實現字元壓縮演算法Java字元演算法
- AES加密演算法的JAVA實現加密演算法Java
- SCAN掃描演算法 java實現演算法Java
- java 實現 DES加密 解密演算法Java加密解密演算法
- Java Stream API:實現 Kruskal 演算法JavaAPI演算法
- Java中Blowfish加密演算法實現Java加密演算法
- MPU6050姿態結算(採用硬體I2C實現資料融合演算法)演算法
- 【演算法】Java實現七種常用排序演算法演算法Java排序
- 線性表及其演算法(java實現)演算法Java
- 經典排序演算法及其 Java 實現排序演算法Java
- Java實現HEAPSORT堆排序演算法Java排序演算法
- Twitter雪花演算法SnowFlake演算法的java實現演算法Java
- 【演算法資料結構Java實現】歐幾里得演算法演算法資料結構Java
- 小白也能看懂的機器學習之整合演算法機器學習演算法
- 如何實現一個Java Class位元組解析器Java
- 用java語言用sort方法實現groupby分組Java
- 二十、快速排序演算法——JAVA實現(遞迴)排序演算法Java遞迴
- 有向圖的基本演算法-Java實現演算法Java