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编写的导航条程序
Oct 09 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
PHP用SAX解析XML的实现代码与问题分析
Aug 22 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
php创建无限级树型菜单
Nov 05 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 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/11/11 PHP
php图片缩放实现方法
2014/02/20 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
js同时按下两个方向键
2007/12/01 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
python numpy 按行归一化的实例
2019/01/21 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
Python 爬虫性能相关总结
2020/08/03 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
经典英文广告词
2014/03/18 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
2015年入党决心书
2015/02/05 职场文书
法院个人总结
2015/03/03 职场文书
自我工作评价范文
2015/03/06 职场文书
趣味运动会标语口号
2015/12/26 职场文书
八年级作文之感恩
2019/11/22 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android