zoukankan      html  css  js  c++  java
  • 笛卡尔乘积

    笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
    方式一:
    <?php
        // 笛卡尔积
        $color = array('red', 'green');
        $size  = array(39, 40, 41);
        $local = array('M', 'L');
        
        echo "<pre>";
        print_r(combineDika($color, $size));
        print_r(combineDika($color, $size, $local));
        
        /**
         * 所有数组的笛卡尔积
         */
        function combineDika() 
        {       
            $data   = func_get_args(); // 获取所有数据
            $cnt    = count($data);    // 计算总数(用于循环)
            $result = array();         // 结果数组
    
            // 取出第一个元素遍历为二维数组
            foreach($data[0] as $item) {
                $result[] = array($item);
            }
            // return [$data, $result];
            // 从第二元素开始循环
            for($i = 1; $i < $cnt; $i++) {
                $result = combineArray($result, $data[$i]); // 循环匹配
            }
            return $result;
        }
         
        /**
         * 两个数组的笛卡尔积
         * @param unknown_type $arr1
         * @param unknown_type $arr2
         */
        function combineArray($arr1, $arr2) 
        {
            $result = array();
            foreach ($arr1 as $item1) {
                foreach ($arr2 as $item2) {
                    $temp     = $item1;
                    $temp[]   = $item2;
                    $result[] = $temp;
                }
            }
            return $result;
        }
    

      方式二:

    <?Php
        $arr = array(
            array(1,3,4,5),
            array(3,5,7,9),
            array(76,6,1,0)
        );
    
        /**
        ** 实现二维数组的笛卡尔积组合
        ** $arr 要进行笛卡尔积的二维数组
        ** $str 最终实现的笛卡尔积组合,可不写
        ** @return array
        **/
        function cartesian($arr, $str = array())
        {
            //去除第一个元素
            $first = array_shift($arr);
            //判断是否是第一次进行拼接
            if(count($str) > 1) {
                foreach ($str as $k => $val) {
                    foreach ($first as $key => $value) {
                        // 最终实现的格式 1,3,76
                        // 可根据具体需求进行变更
                        $str2[] = $val.','.$value;
                    }
                }
    
            } else {
    
                foreach ($first as $key => $value) {
                    
                    //最终实现的格式 1,3,76
                    //可根据具体需求进行变更
                    $str2[] = $value;
                }
            }
    
            //递归进行拼接
            if(count($arr) > 0) {
                $str2 = cartesian($arr, $str2);
            }
            //返回最终笛卡尔积
            return $str2;
        }
    
        $cartesian_product = cartesian($arr);
        echo '<pre>';
        print_r($cartesian_product);
    

      

  • 相关阅读:
    phoneGap
    backbonejs使用
    优化后的光标插件
    选择文本,范围
    js最佳继承范型
    深入理解事件捕获冒泡
    keyCode,charCode,which
    与IE奋战的血泪史
    【程序员的自我修养】如何使用IRC
    【程序员的自我修养】写给新手程序员的一封信
  • 原文地址:https://www.cnblogs.com/haostyle/p/13124002.html
Copyright © 2011-2022 走看看