概念

在数学中,两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为 X × Y。设A、B是任意两个集合,在集合A中任意取一个元素x,在集合B中任意取一个元素y,组成一个有序对(x,y),把这样的有序对作为新的元素,他们的全体组成的集合称为集合A和集合B的直积,记为A×B,即 A×B={(x,y)|x∈A且y∈B}。

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

举例

给出三个域:

D1 = { 张清玫,刘逸 }
D2 = {计算机专业,信息专业}
D3 = {李勇,刘晨,王敏}

则 D1,D2,D3 的笛卡尔积 D = D1×D2×D3,等于:

{
(张清玫, 计算机专业, 李勇),
(张清玫, 计算机专业, 刘晨),
(张清玫, 计算机专业, 王敏),
(张清玫, 信息专业, 李勇),
(张清玫, 信息专业, 刘晨),
(张清玫, 信息专业, 王敏),
(刘逸, 计算机专业, 李勇),
(刘逸, 计算机专业, 刘晨),
(刘逸, 计算机专业, 王敏),
(刘逸, 信息专业, 李勇),
(刘逸, 信息专业, 刘晨),
(刘逸, 信息专业, 王敏)
}

这样就把D1、D2、D3这三个集合中的每个元素加以对应组合,形成庞大的集合群。本个例子中的D中就会有 2X2X3=12 个元素,如果一个集合有1000个元素,有这样3个集合,他们的笛卡尔积所组成的新集合会达到十亿个元素。

假若某个集合是无限集,那么新的集合就将是有无限个元素。

PHP代码 - 输出数组形式

 function Descartes()
{
// 获取传入的参数
$t = func_get_args();
// 判断参数个数是否为1
if (func_num_args() == 1) {
// 回调当前函数,并把第一个数组作为参数传入
return call_user_func_array(__FUNCTION__, $t[0]);
}
// 将 $t 中的第一个元素移动到 $a 中,$t 中索引值重新排序
$a = array_shift($t);
if (!is_array($a)) {
$a = [$a];
}
// 分割数组 $a ,为每个单元1个元素的新数组
$a = array_chunk($a, 1);
do {
$r = [];
$b = array_shift($t);
if (!is_array($b)) {
$b = [$b];
}
foreach ($a as $p) {
foreach (array_chunk($b, 1) as $q) {
$r[] = array_merge($p, $q);
}
}
$a = $r;
} while ($t);
return $r;
} $arr = [
[
'张清玫',
'刘逸'
],
[
'计算机专业',
'信息管理与信息系统专业',
'电子商务专业'
],
[
'2018级',
'2017级'
]
]; $r = Descartes($arr);

打印

Array
(
[0] => Array
(
[0] => 张清玫
[1] => 计算机专业
[2] => 2018级
) [1] => Array
(
[0] => 张清玫
[1] => 计算机专业
[2] => 2017级
) [2] => Array
(
[0] => 张清玫
[1] => 信息管理与信息系统专业
[2] => 2018级
) [3] => Array
(
[0] => 张清玫
[1] => 信息管理与信息系统专业
[2] => 2017级
) [4] => Array
(
[0] => 张清玫
[1] => 电子商务专业
[2] => 2018级
) [5] => Array
(
[0] => 张清玫
[1] => 电子商务专业
[2] => 2017级
) [6] => Array
(
[0] => 刘逸
[1] => 计算机专业
[2] => 2018级
) [7] => Array
(
[0] => 刘逸
[1] => 计算机专业
[2] => 2017级
) [8] => Array
(
[0] => 刘逸
[1] => 信息管理与信息系统专业
[2] => 2018级
) [9] => Array
(
[0] => 刘逸
[1] => 信息管理与信息系统专业
[2] => 2017级
) [10] => Array
(
[0] => 刘逸
[1] => 电子商务专业
[2] => 2018级
) [11] => Array
(
[0] => 刘逸
[1] => 电子商务专业
[2] => 2017级
) )

PHP实现笛卡尔积算法的更多相关文章

  1. JS笛卡尔积算法与多重数组笛卡尔积实现方法示例

    js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码. 一.javascript笛卡尔积算法代码 ...

  2. 笛卡尔积算法的sku

    1.笛卡尔积在形式上比较容易理解,但作为按钮操作DOM的时候,我的思路大体还可以,有些偏差.看到这种矩行方阵,首先联想到二维数组,事实上这种方法完全可以实现,但是在性能和编码速度上都有弊端. 2.以下 ...

  3. JavaScripts之迪卡算法求积(n*n)适用于SKU信息计算等场景

    迪卡算法求积(n * n) 使用 array.reduce 的方式实现 笛卡尔积算法 const arr = [ ['黑色', '白色', '蓝色'], ['1.2KG', '2.0KG', '3.0 ...

  4. mysql(3)—— 内连接、外连接的区别

    先来看一下,内连接的语法: SELECT  XXX FROM XXX INNER JOIN XXX ON XXX; 这里 INNER 可以省略,在上一篇博客中我们对于笛卡尔积现象的研究中(http:/ ...

  5. 深入剖析linq的联接

    内联接 代码如下 from a in new List<string[]>{ ]{"张三","男"}, ]{"李四"," ...

  6. "一起来捉妖"怎么从瘸腿中组合到最合心意的妖灵

    背景: 最近两天活动,黑鬼白鬼合体觉醒秋容,陆无名,聂小倩,作为一个非土豪玩家,没有超高资质妖灵的我,想要在瘸腿妖灵中选取两个最佳选择,合体觉醒. 初选: 备选妖灵从5个维度录入数据,进行选择,分别为 ...

  7. N个数组中所有元素的排列组合(笛卡尔积)算法

    (1)N个数组对象中所有元素排列组合算法 private List<List<Object>> combineAlg(List<Object[]> nArray) ...

  8. 高效测试用例组织算法pairwise之Python实现

    ------------------------------------------本文专为<光荣之路培训 >原创,如有转载请注明出处--------------------------- ...

  9. mysql(2)—— 由笛卡尔积现象分析数据库表的连接

    首先,先简单解释一下笛卡尔积. 现在,我们有两个集合A和B. A = {0,1}     B = {2,3,4} 集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式: A×B = {(0,2 ...

随机推荐

  1. mybatis源码分析之03SqlSession的创建

    在上一篇中,说到了mybatis是如何构造一个SqlSessionFactory实例的,顾名思意,SqlSessionFactory就是用于创建SqlSession的工厂类. 好,现在我们接着昨天的来 ...

  2. mysql图形化管理工具workbench下载安装以及基本使用

    1.下载安装 去mysql官网下载地址进行下载安装 2. 创建schema和表格等基本操作 (1)连接数据库 打开workbench,操作如下: ps:正常需要输入mysql的密码的,但是我之前保存了 ...

  3. Android中实现Activity的启动拦截之----实现360卫士的安装应用界面

    第一.摘要 今天不是周末,但是我已经放假了,所以就开始我们的技术探索之旅,今天我们来讲一下Android中最期待的技术,就是拦截Activity的启动,其实我在去年的时候,就像实现这个技术了,但是因为 ...

  4. Bugku | 游戏过关

    思路:绕过判断,直接跳转到算flag的函数哪里 1.找到计算flag的函数在哪里,记住 "0075e940",这是入口 2.找到一个现成的跳转指令,修改它: 3.重新运行一遍,得到 ...

  5. sql优化工具SQLAdvisor的安装

    原文地址:https://www.cnblogs.com/beliveli/articles/6541936.html 本机安装包路径: D:\share\src\linux-mysql\sqlAdv ...

  6. [HDU2294]Pendant

    题目:Pendant 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2294 分析: 1)f[i][j]表示长度为i,有j种珍珠的吊坠的数目. $f[i][ ...

  7. GPIO 的 8 种工作模式

    GPIO 的 8 种工作模式 在初始化 GPIO 的时候,根据我们的使用要求,必须把 GPIO 设置为相应的模式.如 LED 例程中的 GPIO 引脚如果配置为模拟输入模式是必然会导致错误的. 我们配 ...

  8. 2.2寸(14PIN)TFT液晶屏STM32 SPI 控制

    屏幕如图所示,共14个IO口(也可能只有13个),控制屏幕的有9个IO口 详细版介绍见:http://www.ciast.net/post/20151112.html 反面IO口图: 连接通过SPI方 ...

  9. vux使用方法

    # 使用vux及vuex-i18n需要做的工作 ### 1.首先需要安装vux ### 2.需要安装vux-loader ### 3.需要安装vuex ### 4.需要安装vuex-i18n ### ...

  10. java常用排序

    1.冒泡排序 public static int[] bubble(int[] a){ for(int i=0;i<a.length-1;i++){ int tmp=0; for(int j=0 ...