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 相关文章推荐
ftp类(myftp.php)
Oct 09 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
php 文件夹删除、php清除缓存程序
Aug 25 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP rsa加密解密算法原理解析
Dec 09 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
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP引用(&)各种使用方法实例详解
2014/03/20 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
详解django2中关于时间处理策略
2019/03/06 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
python基于socket函数实现端口扫描
2020/05/28 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
python元组拆包实现方法
2021/02/28 Python
教育科研先进个人材料
2014/01/26 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
2015年班组长工作总结
2015/04/10 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python