离散学习--笛卡尔积

来源:互联网 发布:刷指数软件 编辑:程序博客网 时间:2024/05/29 13:17


定义:
  对于集合A和集合B,以A中的元素作为第一元素,B中的元素作为第二元素组成序偶,所有这样的序偶组成的集合称为A和B的笛卡尔积,记作A × B,形式化表达为

A×B={<x,y>|xAyB}

对于n个集合A1,A2,A3,,An,集合
A1×A2×A3××An={<a1,a2,a3,,an>|aiAi(i=,1,2,3,,n)}

称为A1,A2,A3,,An的笛卡尔积。

伪码:
  src与result可以看做二维的数据存储结构,deep递归深度(如果把src看成二维的数组,则deep就为src的行数),temp为辅助变量。

recursive(src, result,deep,temp)    if deep < src.size-1        //判断是否到了倒数第二行        if src[deep].size == 0  //判断该行是否为空            recursive(src, result,deep+1,temp)//递归下一行        else            for i=0 to src[deep].size //遍历该行上的所有元素                new temp2                temp2=temp                temp2.add(src[deep][i])                 recursive(src, result,deep+1,temp)//递归    else        if deep == src.size-1     //递归到了最后一行            if src[deep].size == 0                result.add(temp) //加入结果集        else            for i=0 to src[deep].size //遍历最后一行的元素                new temp2                temp2=temp                temp2.add(src[deep][i])                result.add(temp)

c++代码:

//笛卡尔积之递归算法#include <iostream>#include<cstdio>#include<vector>#include<string>using namespace std;void recursive(vector<vector<string>> src,vector<vector<string>> &result,int deep,vector<string>& temp){    if(deep<src.size()-1){        if(src[deep].size()==0){            recursive(src,result,deep+1,temp);        }else{            for(int i=0;i<src[deep].size();++i){                vector<string> * temp2=new vector<string>(temp);                temp2->push_back(src[deep][i]);                recursive(src,result,deep+1, *temp2);            }        }    }else{        if(deep==src.size()-1){            if(src[deep].size()==0){                result.push_back(temp);            }else{                for(int i=0;i<src[deep].size();++i){                    vector<string> * temp2=new vector<string>(temp);                    temp2->push_back(src[deep][i]);                    result.push_back(*temp2);                }            }        }    }    return ;}int main(){    vector<vector<string>> src;    vector<vector<string>> result;    vector<string> temp;    temp.push_back("1");    temp.push_back("2");    temp.push_back("3");    src.push_back(temp);    temp.pop_back();    temp.pop_back();    temp.pop_back();    temp.push_back("a");    temp.push_back("b");    temp.push_back("c");    src.push_back(temp);    temp.pop_back();    temp.pop_back();    temp.pop_back();    temp.push_back("A");    temp.push_back("B");    temp.push_back("C");    src.push_back(temp);    temp.pop_back();    temp.pop_back();    temp.pop_back();    recursive(src,result,0,temp);    cout<<"src:***************************************************"<<endl;    for(int i=0;i<src.size();i++){        for(int j=0;j<src[i].size();j++){            cout<<src[i][j]<<"\t";        }        cout<<"\n";    }    cout<<"result**************************************************"<<endl;    for(int i=0;i<result.size();i++){        for(int j=0;j<result[i].size();j++){            cout<<result[i][j]<<"\t";        }        cout<<"\n";    }    system("pause");    return 0;}

测试数据:

row\col 0 1 2 0 1 2 3 1 a b c 2 A B C

测试结果:

src:*****************************************
1 2 3
a b c
A B C
result**************************************************
1 a A
1 a B
1 a C
1 b A
1 b B
1 b C
1 c A
1 c B
1 c C
2 a A
2 a B
2 a C
2 b A
2 b B
2 b C
2 c A
2 c B
2 c C
3 a A
3 a B
3 a C
3 b A
3 b B
3 b C
3 c A
3 c B
3 c C
请按任意键继续…

0 0
原创粉丝点击