Java笛卡爾積算法原理與實現(xiàn)方法詳解
本文實例講述了Java笛卡爾積算法原理與實現(xiàn)方法。分享給大家供大家參考,具體如下:
笛卡爾積算法的Java實現(xiàn):

(1)循環(huán)內(nèi),每次只有一列向下移一個單元格,就是CounterIndex指向的那列。
(2)如果該列到尾部了,則這列index重置為0,而CounterIndex則指向前一列,相當(dāng)于進位,把前列的index加一。
(3)最后,由生成的行數(shù)來控制退出循環(huán)。
public class Test {
private static String[] aa = { "aa1", "aa2" };
private static String[] bb = { "bb1", "bb2", "bb3" };
private static String[] cc = { "cc1", "cc2", "cc3", "cc4" };
private static String[][] xyz = { aa, bb, cc };
private static int counterIndex = xyz.length - 1;
private static int[] counter = { 0, 0, 0 };
public static void main(String[] args) throws Exception {
for (int i = 0; i < aa.length * bb.length * cc.length; i++) {
System.out.print(aa[counter[0]]);
System.out.print("\t");
System.out.print(bb[counter[1]]);
System.out.print("\t");
System.out.print(cc[counter[2]]);
System.out.println();
handle();
}
}
public static void handle() {
counter[counterIndex]++;
if (counter[counterIndex] >= xyz[counterIndex].length) {
counter[counterIndex] = 0;
counterIndex--;
if (counterIndex >= 0) {
handle();
}
counterIndex = xyz.length - 1;
}
}
}
輸出共2*3*4=24行:
aa1 bb1 cc1 aa1 bb1 cc2 aa1 bb1 cc3 aa1 bb1 cc4 aa1 bb2 cc1 aa1 bb2 cc2 aa1 bb2 cc3 aa1 bb2 cc4 aa1 bb3 cc1 aa1 bb3 cc2 aa1 bb3 cc3 aa1 bb3 cc4 aa2 bb1 cc1 aa2 bb1 cc2 aa2 bb1 cc3 aa2 bb1 cc4 aa2 bb2 cc1 aa2 bb2 cc2 aa2 bb2 cc3 aa2 bb2 cc4 aa2 bb3 cc1 aa2 bb3 cc2 aa2 bb3 cc3 aa2 bb3 cc4
最近碰到了一個笛卡爾積的算法要求,比如傳遞過來的參數(shù)是"1,3,6,7==4,5,8,9==3,4==43,45,8,9==35,4",則返回的是一個list,如[1,4,3,43,35][1,4,3,43,4][1,4,3,45,35]……,該list包含是4*4*2*4*2=256個元素,現(xiàn)在的思路是這樣的:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DescartesTest {
/**
* 獲取N個集合的笛卡爾積
*
* 說明:假如傳入的字符串為:"1,2,3==5,6==7,8"
* 轉(zhuǎn)換成字符串?dāng)?shù)組為:[[1, 2, 3], [5, 6], [7, 8]]
* a=[1, 2, 3]
* b=[5, 6]
* c=[7, 8]
* 其大小分別為:a_length=3,b_length=2,c_length=2,
* 目標(biāo)list的總大小為:totalSize=3*2*2 = 12
* 對每個子集a,b,c,進行循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))
* 對a中的每個元素循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))=12/(3*4)=1次,每個元素每次循環(huán)打印次數(shù):后續(xù)集合的笛卡爾積個數(shù)=2*2個
* 對b中的每個元素循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))=12/(2*2)=3次,每個元素每次循環(huán)打印次數(shù):后續(xù)集合的笛卡爾積個數(shù)=2個
* 對c中的每個元素循環(huán)次數(shù)=總記錄數(shù)/(元素個數(shù)*后續(xù)集合的笛卡爾積個數(shù))=12/(2*1)=6次,每個元素每次循環(huán)打印次數(shù):后續(xù)集合的笛卡爾積個數(shù)=1個
*
* 運行結(jié)果:
* [[1, 2, 3], [5, 6], [7, 8]]
1,5,7,
1,5,8,
1,6,7,
1,6,8,
2,5,7,
2,5,8,
2,6,7,
2,6,8,
3,5,7,
3,5,8,
3,6,7,
3,6,8]
從結(jié)果中可以看到:
a中的每個元素每個元素循環(huán)1次,每次打印4個
b中的每個元素每個元素循環(huán)3次,每次打印2個
c中的每個元素每個元素循環(huán)6次,每次打印1個
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="1,3,6,7==4,5,8,9==3,4==43,45,8,9==35,4";
List<String> result = descartes(str);
System.out.println(result);
}
@SuppressWarnings("rawtypes")
public static List<String> descartes(String str) {
String[] list = str.split("==");
List<List> strs = new ArrayList<List>();
for(int i=0;i<list.length;i++){
strs.add(Arrays.asList(list[i].split(",")));
}
System.out.println(strs);
int total = 1;
for(int i=0;i<strs.size();i++){
total*=strs.get(i).size();
}
String[] mysesult = new String[total];
int now = 1;
//每個元素每次循環(huán)打印個數(shù)
int itemLoopNum = 1;
//每個元素循環(huán)的總次數(shù)
int loopPerItem =1;
for(int i=0;i<strs.size();i++){
List temp = strs.get(i);
now = now*temp.size();
//目標(biāo)數(shù)組的索引值
int index=0;
int currentSize = temp.size();
itemLoopNum = total/now;
loopPerItem = total/(itemLoopNum*currentSize);
int myindex = 0;
for(int j=0;j<temp.size();j++){
//每個元素循環(huán)的總次數(shù)
for(int k=0;k<loopPerItem;k++){
if(myindex==temp.size())
myindex=0;
//每個元素每次循環(huán)打印個數(shù)
for(int m=0;m<itemLoopNum;m++){
mysesult[index]=(mysesult[index]==null?"":mysesult[index]+",")+((String)temp.get(myindex));
index++;
}
myindex++;
}
}
}
return Arrays.asList(mysesult);
}
}
運行結(jié)果輸出:
[[1, 3, 6, 7], [4, 5, 8, 9], [3, 4], [43, 45, 8, 9], [35, 4]]
[1,4,3,43,35, 1,4,3,43,4, 1,4,3,45,35, 1,4,3,45,4, 1,4,3,8,35, 1,4,3,8,4, 1,4,3,9,35, 1,4,3,9,4, 1,4,4,43,35, 1,4,4,43,4, 1,4,4,45,35, 1,4,4,45,4, 1,4,4,8,35, 1,4,4,8,4, 1,4,4,9,35, 1,4,4,9,4, 1,5,3,43,35, 1,5,3,43,4, 1,5,3,45,35, 1,5,3,45,4, 1,5,3,8,35, 1,5,3,8,4, 1,5,3,9,35, 1,5,3,9,4, 1,5,4,43,35, 1,5,4,43,4, 1,5,4,45,35, 1,5,4,45,4, 1,5,4,8,35, 1,5,4,8,4, 1,5,4,9,35, 1,5,4,9,4, 1,8,3,43,35, 1,8,3,43,4, 1,8,3,45,35, 1,8,3,45,4, 1,8,3,8,35, 1,8,3,8,4, 1,8,3,9,35, 1,8,3,9,4, 1,8,4,43,35, 1,8,4,43,4, 1,8,4,45,35, 1,8,4,45,4, 1,8,4,8,35, 1,8,4,8,4, 1,8,4,9,35, 1,8,4,9,4, 1,9,3,43,35, 1,9,3,43,4, 1,9,3,45,35, 1,9,3,45,4, 1,9,3,8,35, 1,9,3,8,4, 1,9,3,9,35, 1,9,3,9,4, 1,9,4,43,35, 1,9,4,43,4, 1,9,4,45,35, 1,9,4,45,4, 1,9,4,8,35, 1,9,4,8,4, 1,9,4,9,35, 1,9,4,9,4, 3,4,3,43,35, 3,4,3,43,4, 3,4,3,45,35, 3,4,3,45,4, 3,4,3,8,35, 3,4,3,8,4, 3,4,3,9,35, 3,4,3,9,4, 3,4,4,43,35, 3,4,4,43,4, 3,4,4,45,35, 3,4,4,45,4, 3,4,4,8,35, 3,4,4,8,4, 3,4,4,9,35, 3,4,4,9,4, 3,5,3,43,35, 3,5,3,43,4, 3,5,3,45,35, 3,5,3,45,4, 3,5,3,8,35, 3,5,3,8,4, 3,5,3,9,35, 3,5,3,9,4, 3,5,4,43,35, 3,5,4,43,4, 3,5,4,45,35, 3,5,4,45,4, 3,5,4,8,35, 3,5,4,8,4, 3,5,4,9,35, 3,5,4,9,4, 3,8,3,43,35, 3,8,3,43,4, 3,8,3,45,35, 3,8,3,45,4, 3,8,3,8,35, 3,8,3,8,4, 3,8,3,9,35, 3,8,3,9,4, 3,8,4,43,35, 3,8,4,43,4, 3,8,4,45,35, 3,8,4,45,4, 3,8,4,8,35, 3,8,4,8,4, 3,8,4,9,35, 3,8,4,9,4, 3,9,3,43,35, 3,9,3,43,4, 3,9,3,45,35, 3,9,3,45,4, 3,9,3,8,35, 3,9,3,8,4, 3,9,3,9,35, 3,9,3,9,4, 3,9,4,43,35, 3,9,4,43,4, 3,9,4,45,35, 3,9,4,45,4, 3,9,4,8,35, 3,9,4,8,4, 3,9,4,9,35, 3,9,4,9,4, 6,4,3,43,35, 6,4,3,43,4, 6,4,3,45,35, 6,4,3,45,4, 6,4,3,8,35, 6,4,3,8,4, 6,4,3,9,35, 6,4,3,9,4, 6,4,4,43,35, 6,4,4,43,4, 6,4,4,45,35, 6,4,4,45,4, 6,4,4,8,35, 6,4,4,8,4, 6,4,4,9,35, 6,4,4,9,4, 6,5,3,43,35, 6,5,3,43,4, 6,5,3,45,35, 6,5,3,45,4, 6,5,3,8,35, 6,5,3,8,4, 6,5,3,9,35, 6,5,3,9,4, 6,5,4,43,35, 6,5,4,43,4, 6,5,4,45,35, 6,5,4,45,4, 6,5,4,8,35, 6,5,4,8,4, 6,5,4,9,35, 6,5,4,9,4, 6,8,3,43,35, 6,8,3,43,4, 6,8,3,45,35, 6,8,3,45,4, 6,8,3,8,35, 6,8,3,8,4, 6,8,3,9,35, 6,8,3,9,4, 6,8,4,43,35, 6,8,4,43,4, 6,8,4,45,35, 6,8,4,45,4, 6,8,4,8,35, 6,8,4,8,4, 6,8,4,9,35, 6,8,4,9,4, 6,9,3,43,35, 6,9,3,43,4, 6,9,3,45,35, 6,9,3,45,4, 6,9,3,8,35, 6,9,3,8,4, 6,9,3,9,35, 6,9,3,9,4, 6,9,4,43,35, 6,9,4,43,4, 6,9,4,45,35, 6,9,4,45,4, 6,9,4,8,35, 6,9,4,8,4, 6,9,4,9,35, 6,9,4,9,4, 7,4,3,43,35, 7,4,3,43,4, 7,4,3,45,35, 7,4,3,45,4, 7,4,3,8,35, 7,4,3,8,4, 7,4,3,9,35, 7,4,3,9,4, 7,4,4,43,35, 7,4,4,43,4, 7,4,4,45,35, 7,4,4,45,4, 7,4,4,8,35, 7,4,4,8,4, 7,4,4,9,35, 7,4,4,9,4, 7,5,3,43,35, 7,5,3,43,4, 7,5,3,45,35, 7,5,3,45,4, 7,5,3,8,35, 7,5,3,8,4, 7,5,3,9,35, 7,5,3,9,4, 7,5,4,43,35, 7,5,4,43,4, 7,5,4,45,35, 7,5,4,45,4, 7,5,4,8,35, 7,5,4,8,4, 7,5,4,9,35, 7,5,4,9,4, 7,8,3,43,35, 7,8,3,43,4, 7,8,3,45,35, 7,8,3,45,4, 7,8,3,8,35, 7,8,3,8,4, 7,8,3,9,35, 7,8,3,9,4, 7,8,4,43,35, 7,8,4,43,4, 7,8,4,45,35, 7,8,4,45,4, 7,8,4,8,35, 7,8,4,8,4, 7,8,4,9,35, 7,8,4,9,4, 7,9,3,43,35, 7,9,3,43,4, 7,9,3,45,35, 7,9,3,45,4, 7,9,3,8,35, 7,9,3,8,4, 7,9,3,9,35, 7,9,3,9,4, 7,9,4,43,35, 7,9,4,43,4, 7,9,4,45,35, 7,9,4,45,4, 7,9,4,8,35, 7,9,4,8,4, 7,9,4,9,35, 7,9,4,9,4]
遞歸算法:
public static void fn(List<String[]> list,String[] arr,String str){
//迭代list
List<String> li = new ArrayList<String>();
for(int i=0;i<list.size();i++){
//取得當(dāng)前的數(shù)組
if(i==list.indexOf(arr)){
//迭代數(shù)組
System.out.println(arr.length);
for(String st : arr){
st = str + st;
if(i<list.size()-1){
fn(list,list.get(i+1),st);
}else if(i==list.size()-1){
li.add(st);
}
}
}
}
for(int i = 0 ; i < li.size();i++ )
{
System.out.println(li.get(i));
}
}
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為LocalDateTime出現(xiàn)的問題
這篇文章主要介紹了Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為LocalDateTime出現(xiàn)的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
spring事務(wù)的REQUIRES_NEW源碼示例解析
這篇文章主要為大家介紹了spring事務(wù)的REQUIRES_NEW源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
如何使用eclipse搭建maven多module項目(構(gòu)建父子項目)
這篇文章主要介紹了如何使用eclipse搭建maven多module項目(構(gòu)建父子項目) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
SpringBoot 指標(biāo)監(jiān)控actuator的專題
未來每一個微服務(wù)在云上部署以后,我們都需要對其進行監(jiān)控、追蹤、審計、控制等。SpringBoot就抽取了Actuator場景,使得我們每個微服務(wù)快速引用即可獲得生產(chǎn)級別的應(yīng)用監(jiān)控、審計等功能,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-11-11

