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分页显示制作详细讲解
Nov 19 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 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/05/17 PHP
php array_map()函数实例用法
2021/03/03 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
详解vue 项目白屏解决方案
2018/10/31 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
使用python制作一个解压缩软件
2019/11/13 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
护理学中专毕业生求职信
2013/11/11 职场文书
医学院学生的自我评价分享
2013/11/19 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
学校班班通实施方案
2014/06/11 职场文书
建筑学专业自荐书
2014/07/09 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
先进单位申报材料
2014/12/25 职场文书
幼师中班个人总结
2015/02/12 职场文书
python函数的两种嵌套方法使用
2022/04/02 Python