笛卡尔乘积

笛卡尔乘积笛卡尔乘积是指在数学中 两个集合 X 和 Y 的笛卡尓积 Cartesianpro 又称直积 表示为 X nbsp nbsp Y 第一个对象是 X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员 nbsp 1 nbsp nbsp 定义编辑笛卡尔乘积是指在数学中 两个集合 X 和 Y 的笛卡尓积 Cartesianpro 又称直积 表示为 X Y 第一个对象是 X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员 3 nbsp nbsp 假设集

笛卡尔乘积是指在数学中,两个集合XY的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1]  。

定义

编辑

笛卡尔乘积
笛卡尔乘积是指在数学中,两个 集合
X
Y的笛卡尓积(Cartesian product),又称 直积,表示为
X×
Y,第一个对象是
X的成员而第二个对象是
Y的所有可能 有序对的其中一个成员
[3]
  。
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。A表示所有声母的集合,B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。
设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.
笛卡尔积的符号化为:
A×B={(x,y)|x∈A∧y∈B}
例如,A={a,b}, B={0,1,2},则
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}


运算

编辑

1.对任意集合A,根据定义有
AxΦ =Φ , Φ xA=Φ
2.一般地说,笛卡尔积运算不满足交换律,即
AxB≠BxA(当A≠Φ ∧B≠Φ∧A≠B时)
3.笛卡尔积运算不满足结合律,即
(AxB)xC≠Ax(BxC)(当A≠Φ ∧B≠Φ∧C≠Φ时)
4.笛卡尔积运算对并和 交运算满足 分配律,即
Ax(B∪C)=(AxB)∪(AxC)
(B∪C)xA=(BxA)∪(CxA)
Ax(B∩C)=(AxB)∩(AxC)
(B∩C)xA=(BxA)∩(CxA)


案例

编辑

给出三个域:
D1=SUPERVISOR = { 张清玫,刘逸 }
D2=SPECIALITY= {计算机专业,信息专业}
D3=POSTGRADUATE = { 李勇, 刘晨, 王敏}
则D1,D2,D3的笛卡尔积为D:
D=D1×D2×D3 ={(张清玫, 计算机专业, 李勇), (张清玫, 计算机专业, 刘晨),
(张清玫, 计算机专业, 王敏), (张清玫, 信息专业, 李勇),
(张清玫, 信息专业, 刘晨), (张清玫, 信息专业, 王敏),
(刘逸, 计算机专业, 李勇), (刘逸, 计算机专业, 刘晨),
(刘逸, 计算机专业, 王敏), (刘逸, 信息专业, 李勇),
(刘逸, 信息专业, 刘晨), (刘逸, 信息专业, 王敏)}
这样就把D1,D2,D3这三个集合中的每个元素加以对应组合,形成庞大的集合群。
本个例子中的D中就会有2X2X3个元素,如果一个集合有1000个元素,有这样3个集合,他们的笛卡尔积所组成的新集合会达到十亿个元素。假若某个集合是 无限集,那么新的集合就将是有无限个元素
 [2]
  。


代码

编辑




C#源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using 
System;
using 
System.Collections;
using 
System.Collections.Generic;
using 
System.Text;
using 
System.Linq;
public 
class 
Descartes
{
public 
static 
void 
run(List string
>> dimvalue, List<
string
> result, 
int 
layer, 
string 
curstring)

{
if 
(layer < dimvalue.Count - 1)
{
if 
(dimvalue[layer].Count == 0)
run(dimvalue, result, layer + 1, curstring);
else
{
for 
(
int 
i = 0; i < dimvalue[layer].Count; i++)
{
StringBuilder s1 = 
new 
StringBuilder();
s1.Append(curstring);
s1.Append(dimvalue[layer][i]);
run(dimvalue, result, layer + 1, s1.ToString());
}
}
}
else 
if 
(layer == dimvalue.Count - 1)
{
if 
(dimvalue[layer].Count == 0) result.Add(curstring);
else
{
for 
(
int 
i = 0; i < dimvalue[layer].Count; i++)
{
result.Add(curstring + dimvalue[layer][i]);
}
}
}
}
}




使用说明

(1)将每个维度的集合的元素视为List

,多个集合构成List > dimvalue作为输入
(2)将多维笛卡尔乘积的结果放到List

result之中作为输出
(3)int layer, string curstring只是两个中间过程的参数携带变量
(4)程序采用递归调用,起始调用示例如下:
List

result = new List

();

Descartes.run(dimvalue, result, 0, "");
即可获得多维笛卡尔乘积的结果
 [2]
  。
JAVA源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import 
java.util.ArrayList;
import 
java.util.List;
//import com.alibaba.fastjson.JSON;
public 
class 
DescartesUtil {
    
public 
static 
void 
main(String[] args) {
        
List > list = 
new 
ArrayList >();
        
List

 listSub1 = 

new 
ArrayList

();
        
List

 listSub2 = 

new 
ArrayList

();
        
List

 listSub3 = 

new 
ArrayList

();
        
List

 listSub4 = 

new 
ArrayList

();
        
listSub1.add(
"1"
);
        
listSub1.add(
"2"
);
        
listSub2.add(
"3"
);
        
listSub2.add(
"4"
);
        
listSub3.add(
"a"
);
        
listSub3.add(
"b"
);
        
listSub4.add(
"c"
);
        
listSub4.add(
"d"
);
        
list.add(listSub1);
        
list.add(listSub2);
        
list.add(listSub3);
        
list.add(listSub4);
        
List > result = 
new 
ArrayList >();
        
descartes(list, result, 
0

new 
ArrayList

());
        
// System.out.println(JSON.toJSONString(result));
    
}
    
/
     
* Created on 2014年4月27日
     

     
* Discription:笛卡尔乘积算法
     
* 把一个List{[1,2],[3,4],[a,b]}转化成List{[1,3,a],[1,3,b],[1,4
     
* ,a],[1,4,b],[2,3,a],[2,3,b],[2,4,a],[2,4,b]}数组输出
     

     
     
* @param dimvalue原List
     
* @param result通过乘积转化后的数组
     
* @param layer
     
*            中间参数
     
* @param curList
     
*            中间参数
     
*/
    
private 
static 
void 
descartes(List > dimvalue,
            
List > result, 
int 
layer, List

 curList) {

        
if 
(layer < dimvalue.size() - 
1
) {
            
if 
(dimvalue.get(layer).size() == 
0
) {
                
DescartesUtil.descartes(dimvalue, result, layer + 
1
, curList);
            

else 
{
                
for 
(
int 
i = 
0
; i < dimvalue.get(layer).size(); i++) {
                    
List

 list = 

new 
ArrayList

(curList);
                    
list.add(dimvalue.get(layer).get(i));
                    
DescartesUtil.descartes(dimvalue, result, layer + 
1
, list);
                
}
            
}
        

else 
if 
(layer == dimvalue.size() - 
1
) {
            
if 
(dimvalue.get(layer).size() == 
0
) {
                
result.add(curList);
            

else 
{
                
for 
(
int 
i = 
0
; i < dimvalue.get(layer).size(); i++) {
                    
List

 list = 

new 
ArrayList

(curList);
                    
list.add(dimvalue.get(layer).get(i));
                    
result.add(list);
                
}
            
}
        
}
    
}
}

python源代码
1
2
3
from 
itertools 
import 
product
for 
x,y,z 
in 
product([
'a'
,
'b'
,
'c'
],[
'd'
,
'e'
,
'f'
],[
'm'
,
'n'
]):
    
print
(x,y,z)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198582.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:52
下一篇 2026年3月26日 下午2:53


相关推荐

  • idea打不开,双击IDEA图标没反应

    idea打不开,双击IDEA图标没反应1 是这样 突然 idea 就卡死了 然后我就直接用任务管理器强行关闭了 然后就百度了半小时都不知道打不开是什么情况 最后还是看了下任务管理器的进程 发现还存在 idea 的进程 把它强制关闭掉就行了 图中是我已经把它停掉了 所有没有 如果存在的 名称应该是 diea 开头的

    2026年3月26日
    2
  • Java判断回文字符串_java将字符串反转输出

    Java判断回文字符串_java将字符串反转输出java判断回文字符串几种简单的实现:1.将字符串倒置后逐一比较,实现如下:publicclassHuiWenTest{/***@SERLIN*/publicstaticvoidmain(String[]args){Stringstr=””;System.out.println(“请输入一个字符串”);Scannerin

    2022年5月3日
    49
  • TinyXML介绍「建议收藏」

    TinyXML介绍「建议收藏」http://www.cnblogs.com/phinecos/archive/2008/03/11/1100912.html读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Wind

    2022年5月3日
    52
  • openclaw为什么叫龙虾-openclaw被称为龙虾的原因_3DM手游

    openclaw为什么叫龙虾-openclaw被称为龙虾的原因_3DM手游

    2026年3月13日
    3
  • TomCat7安装与配置[通俗易懂]

    TomCat7安装与配置[通俗易懂]首先下载并安装之,然后配置环境变量。安装完成后右击“我的电脑”,然后“属性”—>”高级系统设置”—>”环境变量”,在系统变量中添加以下变量a、TOMCAT_HOME,该变量指向解压文件的路径,该目录下有lib、bin等文件夹。添加方法如下:点击”环境变量”下的“新建”,在“变量名”中填写“TOMCAT_HOME”,在“变量值”中填写解压文件的路径D:\Tomcat\apache-tomcat-9.

    2022年5月18日
    35
  • Python新手进阶教程之1、海龟作图——用Python绘图(1)「建议收藏」

    Python新手进阶教程之1、海龟作图——用Python绘图(1)「建议收藏」1.1海龟的作用使用海龟作图,我们不仅能够只用几行代码就创建出令人影响深刻的视觉效果,而且还可以跟海龟看看几行代买如何影响到它的移动。者能够帮助我们理解代码的逻辑。1.2第一个海龟程序让我们使用海龟作图来编写第一个程序。在一个新的IDLE窗口中输入如下的代码并将其保存为Square.py#Square.py-画一个正方形importturtlet=turtle.Pen()foriinrange(100):t.forward(x)t.left(90)

    2022年6月28日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号