离散学习--笛卡尔积
来源:互联网 发布:刷指数软件 编辑:程序博客网 时间:2024/05/29 13:17
定义:
对于集合A和集合B,以A中的元素作为第一元素,B中的元素作为第二元素组成序偶,所有这样的序偶组成的集合称为A和B的笛卡尔积,记作A × B,形式化表达为
对于n个集合
称为
伪码:
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
请按任意键继续…
- 离散学习--笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 笛卡尔积
- 什么是笛卡尔积
- java 笛卡尔积实现
- 处理笛卡尔积
- 如何理解笛卡尔积
- 经典笛卡尔积SQL
- 笛卡尔积 C# 算法
- centos7.2 编译安装lnmp
- VS中vcxpro路径的重新设置
- Java的Class类及static块的执行时机
- 设计模式--Prototype模式
- 标准模板库(STL) map —— 初始化问题
- 离散学习--笛卡尔积
- VS下QT中文乱码解决办法
- HTTP协议详解
- springAOP入口之AopNamespaceHandler
- 利用adb访问sqllite中的数据库
- Delphi中MD5实现方法(转)
- JAVA EE-HTTP
- Fragment与Activity之间传值,Fragment与Fragment传值以及对commit的理解
- 2017年爱奇艺校招Java研发笔试编程题(2个)