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 相关文章推荐
phpMyAdmin 安装教程全攻略
Mar 19 PHP
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
PHP反向代理类代码
Aug 15 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
PHP __call()方法实现委托示例
May 20 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获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
Python实现优先级队列结构的方法详解
2016/06/02 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
如何在python中判断变量的类型
2020/07/29 Python
Python如何定义一个函数
2015/09/01 面试题
英语专业职业生涯规划范文
2014/03/05 职场文书
个人承诺书格式
2014/06/03 职场文书
安全例会汇报材料
2014/08/23 职场文书
实习班主任自我评价
2015/03/11 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android