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 相关文章推荐
ASP知识讲座四
Oct 09 PHP
一个PHP的String类代码
Apr 20 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
php封装的mongodb操作类代码
Aug 06 PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 PHP
PHP实现随机发扑克牌
Apr 22 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
Python正则表达式指南 推荐
2018/10/09 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
什么是Smart Navigation?
2016/07/03 面试题
管理学专业个人求职信范文
2013/09/21 职场文书
积极分子思想汇报
2014/01/04 职场文书
拓展策划方案
2014/06/03 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
老公保证书怎么写
2015/02/26 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python