php实现的笛卡儿积

时间:2022-09-21 15:38:20

  之前在网上找到一个大牛写的版本(网址已经记不得了。。),如下

  

 function Descartes1()
{ //Cartesian product of arrays or strings or something else except empty array
//note that when there is only one argent, it must be an array with more than one elements, otherwise it will result in an warning and wrong result
$t = func_get_args(); if(func_num_args() == 1) return call_user_func_array( __FUNCTION__, $t[0] ); $a = array_shift($t); if(! is_array($a)) $a = array($a); $a = array_chunk($a, 1); do {
$r = array();
$b = array_shift($t);
if(! is_array($b)) $b = array($b); foreach($a as $p)
foreach(array_chunk($b, 1) as $q)
$r[] = array_merge($p, $q); $a = $r; }while($t); return $r;
}

Descartes1

  在实际使用过程中,若输入的 数组过大,则会导致内存不够用,于是 就将其改为了 yield 版本,如下:

     function Descartes()
{
$args = func_get_args();
if (func_num_args() == 1 && is_array($args[0])) $args=$args[0]; $i = 0;
$args_len = []; while ($i < count($args)){//modify each argument to array
$args_len[] = is_array($args[$i]) ? ( count($args[$i++]) - 1 ) : (int) ( ($args[$i] = array($args[$i])) && ++$i ) - 1;
#$args_len[] = is_array($args[$i]) ? count($args[$i])-1 : 0;
#$i++;
} foreach(Descartes_yield($args_len, $args) as $e){
yield $e;
}
}
function Descartes_yield($arr_len, $arr_data)
{
$len = count($arr_len);
$temp_arr = array_pad(array(), $len, 0);
$temp_arr[0]--; while($temp_arr != $arr_len) {
$temp_arr[0]++; $i = 0;
$result = []; while ($i < $len) {
if ($temp_arr[$i] > $arr_len[$i]) {
$temp_arr[$i] = 0;
$temp_arr[$i+1]++;
}
$i++;
}
$i=0;
while($i < $len) {
$result[$i] = $arr_data[$i][$temp_arr[$i]];
$i++;
} yield $result;
}
}

  下面是测试代码:

#Descartes(array(1,2),["a","b"],3);
 # 测试代码:
 # foreach ( Descartes( array(1,2), ["a","b"], 3) as $descar )
 #  print_r( $descar );

  不知道 速度 会不会比之前的慢,不过至少在 大量数据 做笛卡儿积的时候,可以跑起来了~

  又看到一个写的特别棒的,原文网址https://skyverd.com/php_array_function_cartesian/,如下:

 $arr = array(
array("a","b"),
range(1,100),
array("A","B","C")
);
6
7
8
fun($arr);
print_r($res); function fun($arr, $tmp = array())
{
foreach(array_shift($arr) as $v)
{
$tmp[] = $v;
if($arr)
{
fun($arr, $tmp);
}
else
{
$GLOBALS["res"][] = implode(",", $tmp); }
array_pop($tmp);
}
}

简单的测试了一下:

//memory_limit = 512M, 64位
range(1,10000000);//7个零,只有该数组时,php直接报错 $arr = array(
array("a","b"),
range(1,100000), // 5个零
array("A","B","C")
);//三个版本都正常运行 $arr1 = array(
array("a","b"),
range(1,1000000), // 6个零
array("A","B","C")
);//版本1,3直接报错,内存不够,版本2运行良好

php实现的笛卡儿积的更多相关文章

  1. Javascript实现笛卡儿积算法

    在根据商品属性计算SKU时,通常会对商品不同选项的不同属性进行笛卡儿积运算. 这是在NodeJs里的实现版本,目前用在生产环境. function cartesian(elements) { if ( ...

  2. 使用Python的列表推导式计算笛卡儿积

    笛卡儿积: 笛卡儿积是一个列表, 列表里的元素是由输入的可迭代类型的元素对构 成的元组,因此笛卡儿积列表的长度等于输入变量的长度的乘积, 如下图: 如果你需要一个列表,列表里是 3 种不同尺寸的 T ...

  3. SQL中的笛卡儿积问题和多表连接操作

    (使用scott用户) SELECT * FROM scott.dept;--4SELECT * FROM scott.emp;--14 /**笛卡尔积内连接(等值连接)外连接(非等值连接)自连接*/ ...

  4. Spark笔记:RDD基本操作(上)

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

  5. Oracle数据加载之sqlldr工具的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 客户端:WIN10 + Oracle 11.2.0.1 client 目录: sqlldr语法 sqlldr实验准备 sqlldr常 ...

  6. 《SQL必知必会》学习笔记&lpar;二&rpar;

    咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所 ...

  7. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  8. sql复习第五次

    1.在数据库范围内,关系的每一个属性值是不可分解的 关系中不允许出现重复元组 由于关系是一个集合,因此不考虑元组的顺序 2.笛卡儿积是两个关系的所有元组组合而成的,而等值联接是由笛卡儿积和选择运算组合 ...

  9. sql复习第四次

    1.关系操作的特点是集合操作 2.关系模型的完整性规则包括实体完整性规则,参照完整性规则,用户定义的完整性规则 3.rou联接运算是由笛卡儿积和选择操作组合而成的 4.自然联接运算是由笛卡儿积,选择, ...

随机推荐

  1. 21&period;C&num;序列过虑、排序、let子句和连接&lpar;十一章11&period;3-11&period;5&rpar;

    哈哈,隔了一个星期,再怎么样都要发一篇,要多看书啊,书不能停~~~ 使用where子句进行过虑 where子句的语法格式如下:where 过虑表达式 例子:新建一个珠宝类,如下: class Jewe ...

  2. str内部方法

    代码 #str内部功能 name=' aK am\til.L iu' age=18 num=-11 ab='#' ac=('1','2','3','4','5','6','7') print(dir( ...

  3. 在windows下创建一个Mongo服务

    首先需要下载mongo的安装包 cmd.exe 这个需要用管理员权限打开 进入到mongo的安装目录 首先到C盘根据下面的命令手动创建一个 Data 文件夹 在Data 里面创建一个db文件夹一个lo ...

  4. js中typeof可以准确判断哪些变量类型

    typeof 运算符返回一个用来表示表达式的数据类型的字符串.  可能的字符串有:"number"."string"."boolean".& ...

  5. Nhibernate 一对一关系映射&lpar;主键映射&rpar;

    参考:点击这里 妈的,搞了一天了,终于可以了,现在总结下,以防下次再出现这样痛苦的问题了,有两个表:user(用户)和Blog(设置表),它们之间的关系正如我所说的是一对一的关系.现在我们来映射这两个 ...

  6. 论文笔记:ATOM&colon; Accurate Tracking by Overlap Maximization

    ATOM: Accurate Tracking by Overlap Maximization  2019-03-12 23:48:42  Paper:https://arxiv.org/pdf/18 ...

  7. Linux LVM卷组管理

    Linux LVM卷组管理 由于传统的磁盘管理不能对磁盘进行磁盘管理,因此诞生了LVM技术,LVM技术最大的特点就是对磁盘进行动态管理. 由于LVM的逻辑卷的大小更改可以进行动态调整,且不会出现丢失数 ...

  8. FunDA(17)- 示范:异常处理与事后处理 - Exceptions handling and Finalizers

    作为一个能安全运行的工具库,为了保证占用资源的安全性,对异常处理(exception handling)和事后处理(final clean-up)的支持是不可或缺的.FunDA的数据流FDAPipeL ...

  9. &lbrack;PHP&rsqb; 重回基础(date函数和strtotime函数)

    date():格式化一个本地时间或者日期,当前时间 2016年5月13日 15:19:49 使用函数date(),输出当前是月份中的第几天,参数:String类型 d 例如:echo date(&qu ...

  10. 【LOJ】&num;2041&period; 「SHOI2015」聚变反应炉

    题解 这显然是一道题拆成两道 然后我胡乱分析了一波,决定第一题就用点度贪心(反正散播的能量肯定能被使用),然后过了 第二题开始mengbier 设\(f_u\)表示第u个点在父亲发动之后才发动的最小价 ...