加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

用PHP实施笛卡尔积算法的思路和代码是什么

发布时间:2023-02-27 15:02:51 所属栏目:PHP教程 来源:
导读:这篇文章主要讲解了“用PHP实现笛卡尔积算法的思路和代码是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用PHP实现笛卡尔积算法的思路和代
这篇文章主要讲解了“用PHP实现笛卡尔积算法的思路和代码是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用PHP实现笛卡尔积算法的思路和代码是什么”吧!
 
概念
 
在数学中,两个集合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级"
 
  }
 
}
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!