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中使用Oracle数据库(4)
Oct 09 PHP
php session 预定义数组
Mar 16 PHP
PHP file_exists问题杂谈
May 07 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
PHP实现动态柱状图改进版
Mar 30 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
Yii框架核心组件类实例详解
Aug 06 PHP
Laravel 实现添加多语言提示信息
Oct 25 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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学习资料汇总与网址
2007/03/16 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
simplehtmldom Doc api帮助文档
2012/03/26 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
php微信开发之谷歌测距
2018/06/14 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
jQuery入门知识简介
2010/03/04 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python将多份excel表格整理成一份表格
2018/01/03 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
python对象与json相互转换的方法
2019/05/07 Python
Python绘制动态水球图过程详解
2020/06/03 Python
python 实现超级玛丽游戏
2020/11/25 Python
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
历史专业毕业生的自我鉴定
2013/11/15 职场文书
金融事务专业求职信
2014/04/25 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
表扬信范文
2019/04/22 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers