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漏洞小结
Feb 05 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
php头像上传预览实例代码
May 02 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 PHP
浅谈php使用curl模拟多线程发送请求
Mar 08 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
Apr 02 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
CURL状态码列表(详细)
2013/06/27 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
flexigrid 参数说明
2010/11/23 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
Python extract及contains方法代码实例
2020/09/11 Python
Python中常用的os操作汇总
2020/11/05 Python
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
优秀团员个人的自我评价
2013/10/02 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
廉洁校园实施方案
2014/05/25 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
督导岗位职责范本
2015/04/10 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
Python实现视频自动打码的示例代码
2022/04/08 Python