美文网首页PHP进阶篇
笛卡尔积算法(PHP实现)

笛卡尔积算法(PHP实现)

作者: 安之烟波客 | 来源:发表于2020-01-16 00:34 被阅读0次

    第一、定义

    笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员

    图例

    假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

    类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。A表示所有声母的集合,B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。

    设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.
    笛卡尔积的符号化为:

    A×B={(x,y)|x∈A∧y∈B}

    例如,A={a,b}, B={0,1,2},则

    A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

    B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

    第二 、运算

    1. 对任意集合A,根据定义有
      AxΦ =Φ , Φ xA=Φ
    2. 一般地说,笛卡尔积运算不满足交换律,即
      AxB≠BxA(当A≠Φ ∧B≠Φ∧A≠B时)
    3. 笛卡尔积运算不满足结合律,即
      (AxB)xC≠Ax(BxC)(当A≠Φ ∧B≠Φ∧C≠Φ时)
      4.笛卡尔积运算对并和交运算满足分配律,即
      Ax(B∪C)=(AxB)∪(AxC)
      (B∪C)xA=(BxA)∪(CxA)
      Ax(B∩C)=(AxB)∩(AxC)
      (B∩C)xA=(BxA)∩(CxA)

    第三 、程序算法

    <?php
    
    class Cartesian {
        private $matrix = [];
    
        /**
         * @param array $matrix
         */
        public function setMatrix (array $matrix): void {
    
            $this->matrix[] = $matrix;
    
        }
    
        public function exportData () {
            if (!$this->matrix) {
                return [];
            }
            $list = [];
            foreach ($this->matrix as $key => $value) {
    
                $this->logic($value, $list);
            }
            return $list;
        }
    
        public function logic ($item, &$list = []) {
            if (!$list) {
                foreach ($item as $value) {
                    $temp = [];
                    $temp[] = $value;
                    array_push($list, $temp);
                }
                return "";
            }
            $forupdate = [];
            foreach ($list as $v) {
                $_temp = $v;
                foreach ($item as $i) {
                    $__temp = $_temp;
                    array_push($__temp, $i);
                    $forupdate[] = $__temp;
                }
            }
            $list = $forupdate;
    
        }
    }
    
    // 使用方法
    
        $cartesian = new Cartesian();
        
        $cartesian->setMatrix(['红色','黄色',"蓝色"]);
        $cartesian->setMatrix(['M','L','XL','XXL']);
        $cartesian->setMatrix(['北京','郑州']);
        $cartesian->setMatrix(['男','女']);
        
        $dd =  $cartesian->exportData();
        print_r($dd);
    
    

    第四 、总结

    这种算法不仅适用于学生选课系统中的选课,一个学生选多门课程,而且还适用于商城系统的商品的多规格生成和和管理。

    以上是闲来无聊写的一个demo,作为抛砖引玉吧,如果哪位同学还有更好写法,欢迎指正批评,共同提高!谢谢

    相关文章

      网友评论

        本文标题:笛卡尔积算法(PHP实现)

        本文链接:https://www.haomeiwen.com/subject/tlwxzctx.html