PHP实现笛卡尔积算法的实例讲解


Posted in PHP onDecember 22, 2019

概念

在数学中,两个集合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();                  // 获取传入的参数

  if (func_num_args() == 1) {                // 判断参数个数是否为1

    return call_user_func_array(__FUNCTION__, $t[0]); // 回调当前函数,并把第一个数组作为参数传入

  }

  $a = array_shift($t);    // 将 $t 中的第一个元素移动到 $a 中,$t 中索引值重新排序

  if ( !is_array($a)) {

    $a = [$a];

  }

  $a = array_chunk($a, 1);   // 分割数组 $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(12) {

 [0]=>

 array(3) {

  [0]=>

  string(9) "张清玫"

  [1]=>

  string(15) "计算机专业"

  [2]=>

  string(7) "2018级"

 }

 [1]=>

 array(3) {

  [0]=>

  string(9) "张清玫"

  [1]=>

  string(15) "计算机专业"

  [2]=>

  string(7) "2017级"

 }

 [2]=>

 array(3) {

  [0]=>

  string(9) "张清玫"

  [1]=>

  string(33) "信息管理与信息系统专业"

  [2]=>

  string(7) "2018级"

 }

 [3]=>

 array(3) {

  [0]=>

  string(9) "张清玫"

  [1]=>

  string(33) "信息管理与信息系统专业"

  [2]=>

  string(7) "2017级"

 }

 [4]=>

 array(3) {

  [0]=>

  string(9) "张清玫"

  [1]=>

  string(18) "电子商务专业"

  [2]=>

  string(7) "2018级"

 }

 [5]=>

 array(3) {

  [0]=>

  string(9) "张清玫"

  [1]=>

  string(18) "电子商务专业"

  [2]=>

  string(7) "2017级"

 }

 [6]=>

 array(3) {

  [0]=>

  string(6) "刘逸"

  [1]=>

  string(15) "计算机专业"

  [2]=>

  string(7) "2018级"

 }

 [7]=>

 array(3) {

  [0]=>

  string(6) "刘逸"

  [1]=>

  string(15) "计算机专业"

  [2]=>

  string(7) "2017级"

 }

 [8]=>

 array(3) {

  [0]=>

  string(6) "刘逸"

  [1]=>

  string(33) "信息管理与信息系统专业"

  [2]=>

  string(7) "2018级"

 }

 [9]=>

 array(3) {

  [0]=>

  string(6) "刘逸"

  [1]=>

  string(33) "信息管理与信息系统专业"

  [2]=>

  string(7) "2017级"

 }

 [10]=>

 array(3) {

  [0]=>

  string(6) "刘逸"

  [1]=>

  string(18) "电子商务专业"

  [2]=>

  string(7) "2018级"

 }

 [11]=>

 array(3) {

  [0]=>

  string(6) "刘逸"

  [1]=>

  string(18) "电子商务专业"

  [2]=>

  string(7) "2017级"

 }

}

以上就是本次介绍的全部相关知识点,感谢大家的学习和对三水点靠木的支持。

PHP 相关文章推荐
php的header和asp中的redirect比较
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
PHP通过COM使用ADODB的简单例子
Dec 31 PHP
PHP 操作文件的一些FAQ总结
Feb 12 PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
php设置编码格式的方法
Mar 05 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
PHP中对于浮点型的数据需要用不同的方法解决
Mar 11 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
php模拟post提交数据的方法
Feb 12 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP架构及原理知识点详解
Dec 22 #PHP
Laravel 验证码认证学习记录小结
Dec 20 #PHP
php文件上传原理与实现方法详解
Dec 20 #PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 #PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
You might like
php 图像函数大举例(非原创)
2009/06/20 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python 中的with关键字使用详解
2016/09/11 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
Python循环结构的应用场景详解
2019/07/11 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
python 数据类型强制转换的总结
2021/01/25 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
数据库连接池的工作原理
2012/09/26 面试题
经理秘书找工作求职信
2013/12/19 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
校园演讲稿汇总
2014/05/21 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS