概念

在数学中,两个集合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. Python 语音识别

    调用科大讯飞语音听写,使用Python实现语音识别,将实时语音转换为文字. 参考这篇博客实现的录音,首先在官网下载了关于语音听写的SDK,然后在文件夹内新建了两个.py文件,分别是get_audio. ...

  2. 51nod 1040:最大公约数之和(数论)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. ...

  3. LDD3 第11章 内核的数据类型

    考虑到可移植性的问题,现代版本的Linux内核的可移植性是非常好的. 在把x86上的代码移植到新的体系架构上时,内核开发人员遇到的若干问题都和不正确的数据类型有关.坚持使用严格的数据类型,并且使用-W ...

  4. Git 中关于一次完整的提交的命令

    1.创建仓库(git init .git clone URL) 有两种新建 Git 项目仓库的方法.第一种是在本地通过初始化来创建新的 Git 仓库.第二种是从已有的 Git 远程仓库中克隆出一个仓库 ...

  5. fedora下编译运行java傻瓜入门级教程

    操作步骤: 编译运行环境的搭建 fedora下默认安装为GNU公司的JDK,如下所示 $java -version java version "1.7.0_25" OpenJDK ...

  6. 【PBFT】拜占庭容错

    共识机制堪称区块链的核心.我们知道,EOS.Hyperledger以及Stellar等著名的项目,都采用了BFT(拜占庭容错)共识机制,那么,BFT到底是什么鬼?和其它共识机制相比,又有什么优势和特点 ...

  7. 10.15 sed 命令实践

    在n行前插入 [root@wen data]# sed '2i 106,dandan,CSO' person.txt101,oldboy,CEO106,dandan,CSO102,zhangyao,C ...

  8. delphi 程序嵌入桌面效果的实现

    function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN; var dc, dc_c: HDC; ...

  9. 116、TensorFlow变量的版本

    import tensorflow as tf v = tf.get_variable("v", shape=(), initializer=tf.zeros_initialize ...

  10. linux主机hang住echo 0 > /proc/sys/kernel/hung_task_timeout_secs disables this message

    用dmesg显示如下图信息 问题原因: 默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的IO请求都是同步的. ...