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代码
Mar 08 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
PHP insert语法详解
Jun 07 PHP
第五章 php数组操作
Dec 30 PHP
PHP实现的MongoDB数据库操作类分享
May 12 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
Jun 12 PHP
php去除头尾空格的2种方法
Mar 16 PHP
PHP SplObjectStorage使用实例
May 12 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
PHP微信支付实例解析
Jul 22 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 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读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
详解Python多线程
2016/11/14 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
python表格存取的方法
2018/03/07 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
python异常处理和日志处理方式
2019/12/24 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
通息工程毕业生自荐信
2013/10/16 职场文书
自荐书封面下载
2013/11/29 职场文书
中层干部竞聘演讲稿
2014/05/15 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
文体活动总结
2015/02/04 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python