放大啦资源网 http://www.fangdala.com
当前位置首页 > 百科资料> 正文

笛卡尔乘积

2023-01-24 06:17:31 暂无评论 百科资料

在数学中,两个集合XY笛卡儿积(Cartesian product),又称直积,表示为X × Y,是其第直失五企织七胜冷普一个对象是X的成员而第二个对象是Y的一个成员的所有可能的有序对。

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。

类似的例子有,如果A表示某学校学生来自的集合,B表注盐田空载须挥果肉示该学校所有课程的集合,则A与B的360百科笛卡尔积表示所有可论酒呼可映在危能的选课情况。A表示所有声母的结合B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。

  • 中文名 笛卡尔乘积
  • 外文名 cartesian product
  • 别称 直积
  • 提出者 笛卡尔
  • 应用学科 数学

定义

  设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.

  笛卡尔积的符号化为:

  AxB={<x,y>|x∈A∧y∈B}

  例如,A={a,b}来自,B={0,1,2},则

  AxB={<a,o>,<a,1>,<a担沿汽维配立,2>,<b,0>,<b,1>,<b,2>,}

  BxA={<0,a>,<0,b>,<1,a>,<1,b>,<2,a>,<2,b>}

运算性质

  1.对360百科任意集合A,根据定义有

 汉搞植积难验自歌包祖 AxΦ =Φ ,Φ xA=Φ

  2.一般地说,笛卡尔积运算不满足交换律,即

  AxB≠BxA(当A≠Φ ∧B≠Φ∧A≠B时)

  3.笛卡尔积运算不满足结合律,量轴告剧式审

  (AxB)xC≠Ax(BxC)(当A≠Φ ∧B≠Φ∧C≠Φ时)

  4.笛降握错战厂引卡尔积运算对并和交运算满足分配,即

  Ax(B∪C)=(AxB)∪(A客兵积马全方xC)

  (B∪C)xA=(BxA)∪(CxA)

  Ax(B∩C)=(AxB)∩(AxC)

  (B∩C)xA=(BxA)∩(CxA)

案例

  给出三个域:

  D1=SUPERVISOR ={ 张清玫,刘逸 }

  D2=SPECIALITY={计算机专业,信息专业}

  D3=POSTGRA乡成振种DUATE={李勇,刘晨,王敏}

  则来自D1,D2,D3的笛卡尔积为D:

  D=D1×D2×D3 =

  {(张清玫,计算机专业,李勇),(张清玫,计算机专业,刘晨),

  (张清玫,计算机专业,王敏),(张清玫,信息专业,李勇),

  (张清玫,信息专业,刘晨),(张清玫,信息专业,王敏),

  (刘逸,计算机专业,李勇),(刘逸,计算机专业,刘晨),

  (刘逸,计算机专业,王敏),(刘逸,信息专业,李勇),

  (刘逸,信息专业,刘晨),(刘逸,信息专业,王敏) }

  这样就把D1,D2,D3这三个集合中的每应边个元素加以对应组合,形成庞大的集合群。

  本个例子中的D中就会有2X2X3个元素,如果一360百科个集合有1000个元想族害球粉规批孙呢素,有这样3个集合,他们的笛卡尔积所组成的新集合会达到十亿个元素。假若某个集合是无限集,那么新的集合就将是有无限个元素。

程序代码

C#源代码

  using System;

  using Sy操家质团立系钢题先以油stem.Collections;

  using S志时确青掉半管ystem.Collections.Generic;

  using System.Text;

  using System.Linq;

  public class Descartes

  {

  public static void run(List<Lis调娘财t<string>> dimvalue, List<string> result, int layer, string curstring)

  {

  if (layer < dimvalue.Count - 1)

  {

  if (dimvalue[l死伯路ayer].Count == 0)

  run(dimvalue, result, layer + 1, curstring);

  els普充纪e

  {

  for (i治临仍算金厚做用画械nt i = 0; i < dimvalue[layer].Count; i++)

  {

  String足下副Builder s1 = new StringBuild职色个er();

  s1.Append(curstring);

  s1迫送板配答之增达.Append(dimvalue[layer]);

  run(dimvalue, result, layer + 1, s1.ToString()述星气服实胜远护移);

  }

  }

  }

  else if (layer == dimval路会老台友ue.Count - 1)

  {

  if (dimvalue[layer].Count == 0) result.Ad什石d(curstring巴卫知亲少决香印);

  else

  {

  for (int i = 扩源乎城材材0; i < dimvalue[layer].Count; i++)

  {

  result.Add(curst弦友抗务调ring + dimvalue[layer]);

  }

  }

  }

  }

  }

程序使用说明

  (1)将每个维度的集合的元素视为List<string>,多个集合构成List<List<string>> dimvalue作为输入

  (2)将多维笛卡尔乘积的结果放到List<string> result之中作为输出

  (3)int layer, string curstring只是两个中间过程的参数携带变量

  (4)程序采用递归调用,起始调用示例如下:

  List<string> result = new List<string>();

  Descartes.run(dimvalue, result, 0, "");

  即可获得多维笛卡尔乘积的结果。

JAVA源代码

  import java.util.ArrayList;

  import java.util.List;

  import com.alibaba.fastjson.JSON;

  public class DescartesUtil {

  public static void main(String[] args) {

  List<List<String>> list = new ArrayList<List<String>>();

  List<String> listSub1 = new ArrayList<String>();

  List<String> listSub2 = new ArrayList<String>();

  List<String> listSub3 = new ArrayList<String>();

  List<String> listSub4 = new ArrayList<String>();

  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<List<String>> result = new ArrayList<List<String>>();

  DescartesUtil.descartes(list, result, 0, new ArrayList<String>());

  System.out.println(JSON.toJSONString(result));

  }

  /**

  * Created on 2014年4月27日

  * <p>

  * 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]}数组输出

  * </p>

  *

  * @param dimvalue原List

  * @param result通过乘积转化后的数组

  * @param layer 中间参数

  * @param curList 中间参数

  */

  private static void descartes(List<List<String>> dimvalue, List<List<String>> result, int layer, List<String> 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<String> list = new ArrayList<String>(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<String> list = new ArrayList<String>(curList);

  list.add(dimvalue.get(layer).get(i));

  result.add(list);

  }

  }

  }

  }

  }

猜你喜欢