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 生成静态页面的办法与实现代码详细版
Feb 15 PHP
PHP原理之异常机制深入分析
Aug 08 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 PHP
解析PHP高效率写法(详解原因)
Jun 20 PHP
php加密解密实用类分享
Jan 07 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
php表单习惯用的正则表达式
Oct 11 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 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分页函数
2006/10/09 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python实现从百度API获取天气的方法
2015/03/11 Python
python判断windows系统是32位还是64位的方法
2015/05/11 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
简单实现python聊天程序
2018/04/01 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
关于Keras Dense层整理
2020/05/21 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
python实现感知机模型的示例
2020/09/30 Python
施工班组长岗位职责
2014/01/05 职场文书
给护士表扬信
2014/01/19 职场文书
企业消防安全制度
2014/02/02 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
英文感谢信范文
2015/01/21 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
MySQL实现配置主从复制项目实践
2022/03/31 MySQL