概念

在数学中,两个集合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. spring微服务(顺序由简入难易于理解)

    一.为微服务应用增加健康监控 1.在 build.gradle 文件 dependencies 属性中增加 compile('org.springframework.boot:spring-boot- ...

  2. POJ 3525 Most Distant Point from the Sea (半平面交)

    Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...

  3. npm和webpack安装以及相关信息

    一.npm初始化 在项目文件夹下执行npm init,根据提示回车或者填写信息.结果是生成packge.json文件. 根据json文件npm install会安装依赖,项目会看到有一个node_mo ...

  4. SQL学习记录:定义(一)

    --1.在这里@temp是一个表变量,只有一个批处理中有效,declare @temp table; --2. 如果前面加#就是临时表,可以在tempDB中查看到,它会在最后一个使用它的用户退出后才失 ...

  5. Python进阶:多线程、多进程和线程池编程/协程和异步io/asyncio并发编程

    gil: gil使得同一个时刻只有一个线程在一个CPU上执行字节码,无法将多个线程映射到多个CPU上执行 gil会根据执行的字节码行数以及时间片释放gil,gil在遇到io的操作时候主动释放 thre ...

  6. jmeter添加自定义扩展函数之大写转换小写

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  7. Java学习之多线程(线程安全问题及线程同步)

    一.线程安全问题产生前提:1.多线程操作共享数据2.线程任务中有多条代码 class Ticket implements Runnable { //2.共享数据 private int num = 1 ...

  8. CSS属性去除图片链接时的虚线框

    CSS 之outline (轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用.outline 属性是一个简写属性,用于设置元素周围的轮廓线.注释:轮廓线不会占据空间,也不一定是 ...

  9. selenium,webdriver模仿浏览器访问百度 基础1

    这是一种比较好的反反爬技术 #安装:pip install selenium=2.48.0 #显示:pip show selenium #卸载:pip uninstall selenium #模拟用户 ...

  10. VB - 修改注册表

    Vbs中修改注册表的语句主要有: 1.读注册表的关键词和值: 可以通过把关键词的完整路径传递给wshshell对象的regread方法.例如: set ws=wscript.createobject( ...