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 相关文章推荐
全文搜索和替换
Oct 09 PHP
php判断字符以及字符串的包含方法属性
Aug 30 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
php连接oracle数据库的核心步骤
May 26 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
TP5框架页面跳转样式操作示例
Apr 05 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中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
浅说js变量
2011/05/25 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
python实现在一个画布上画多个子图
2020/01/19 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android