php 排列组合函数(无重复组合,可重复组合【全排列组合】)
<?php /**
* 无重复排列組合
* @Author MAX
* @DateTime 2018-09-07T16:28:40+0800
* @param Array $arr 需要排列組合的数组
* @param Number $m 每几个一組
* @param [Array] $push 添加到数组里
* @return Array 組合好的数组
*/
function getCombinationToString($arr, $m, $push=null) {
$rst = array();
for($i = 0; $i < pow(2, count($arr)); $i++) {
$a = 0;
$b = array();
for($j = 0; $j < count($arr); $j++) {
if($i >> $j & 1) {
$a++;
array_push($b, $arr[$j]);
}
}
if($a == $m) {
if(!is_null($push)){
if(is_string($push)){
$b = array_unshift($b, $push);
}else{
$b = array_merge($push, $b);
}
}
$rst[] = $b;
}
}
return $rst;
}
$t1 = microtime(true);
$a = [1,2,3];
$b = getCombinationToString($a,2,[]);
echo '无重复排列組合1';
echo '<pre>';
print_r($b);
$t2 = microtime(true);
echo '耗时'.round($t2-$t1,3).'秒<br>';
echo 'Now memory_get_usage: ' . memory_get_usage() . '<br />'; /*
ps:
microtime() 加上 true 参数, 返回的将是一个浮点类型. 这样 t1 和 t2 得到的就是两个浮点数, 相减之后得到之间的差. 由于浮点的位数很长, 或者说不确定, 所以使用 round() 取出小数点后 3 位。
memory_get_usage() 返回的单位是b,/1024得到kb,/(1024*1024)得到mb,依次类推。
*/ /**
* 无重复排列組合
* @Author MAX
* @DateTime 2018-09-07T16:28:40+0800
* @param Array $arr 需要排列組合的数组
* @param Number $m 每几个一組
* @return Array 組合好的数组
*/
function getCombinationToString2($arr, $m)
{
$result = array();
if ($m ==1)
{
return $arr;
}
if ($m == count($arr))
{
$result[] = implode(',' , $arr);
return $result;
}
$temp_firstelement = $arr[0];
unset($arr[0]);
$arr = array_values($arr);
$temp_list1 = getCombinationToString2($arr, ($m-1));
foreach ($temp_list1 as $s)
{
$s = $temp_firstelement.','.$s;
$result[] = $s;
}
unset($temp_list1);
$temp_list2 = getCombinationToString2($arr, $m);
foreach ($temp_list2 as $s)
{
$result[] = $s;
}
unset($temp_list2);
return $result;
} $t1 = microtime(true);
$a = [1,2,3];
$b = getCombinationToString2($a,2);
echo '无重复排列組合2';
echo '<pre>';
print_r($b);
$t2 = microtime(true);
echo '耗时'.round($t2-$t1,3).'秒<br>';
echo 'Now memory_get_usage: ' . memory_get_usage() . '<br />'; /**
* 可重复排列組合(全组合)
* 解决问题:求一个含有N个元素的数组中取出M个元素组成新的数组,一共可以组合成的数组并输出
* $arr $arr 需要排列組合的数组
* $m 每几个一組
*/
function getCombinationToString3($arr, $m) {
if ($m ==1) {
return $arr;
}
$result = array(); $tmpArr = $arr;
unset($tmpArr[0]);
for($i=0;$i<count($arr);$i++) {
$s = $arr[$i];
$ret = getCombinationToString3(array_values($tmpArr), ($m-1), $result); foreach($ret as $row) {
$result[] = $s . $row;
}
} return $result;
} $t1 = microtime(true);
$arr = array(1,2,3);
$r = getCombinationToString3($arr, 2);
echo '可重复排列組合';
echo '<pre>';
print_r($r);
$t2 = microtime(true);
echo '耗时'.round($t2-$t1,3).'秒<br>';
echo 'Now memory_get_usage: ' . memory_get_usage() . '<br />';
执行效果如下:
php 排列组合函数(无重复组合,可重复组合【全排列组合】)的更多相关文章
- javascript柯里化及组合函数~
大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...
- MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用
在统计查询中,经常会用到count函数,这里是基础的 MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用 -- 创建表 CREATE TABLE `tb ...
- js的组合函数
1.组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递 1>最简单版本 这种方法实现的组合函数,需要我们指定函数的执行顺序 /**第一种方法 */ function add(a, b) ...
- oracle 子查询和组合函数
oracle 子查询和组合函数 --查询与"SCOTT"在同一个部门的员工 select empno,ename,deptno from emp where deptno in ( ...
- go结构体组合函数
结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数 ...
- JavaScript函数式编程(纯函数、柯里化以及组合函数)
JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...
- JS前端无侵入实现防止重复提交请求技术
JS前端无侵入实现防止重复提交请求技术 最近在代码发布测试的过程中,我发现有些请求非常的消耗服务器资源,而系统测试人员因为响应太慢而不停的点击请求.我是很看不惯系统存在不顺眼的问题,做事喜欢精益求精, ...
- 用JS编写一个函数,返回数组中重复出现过的元素
用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...
- 大数据位图法(无重复排序,重复排序,去重复排序,数据压缩)之Java实现
1,位图法介绍 位图的基本概念是用一个位(bit)来标记某个数据的存放状态,由于采用了位为单位来存放数据,所以节省了大量的空间.举个具体的例子,在Java中一般一个int数字要占用32位,如果能用一位 ...
随机推荐
- java基础---->自定义gradle的插件
这里面简单的介绍一下gradle插件的编写. 自定义gradle插件 我们编写的gradle脚本一般是放在build.gradle文件中.所以首先创建一下build.gradle文件,下面的例子都是在 ...
- python __setattr__、__getattr__、__getattribute__全面详解
一.属性引用函数 hasattr(obj,name[,default])getattr(obj,name)setattr(obj,name,value)delattr(obj,name) 二.属性引用 ...
- vue项目实战中的增、删、改、查
参考:https://blog.csdn.net/xr510002594/article/details/81665762?utm_source=blogxgwz0 https://blog.csdn ...
- 算法提高 最小方差生成树(Kruskal)_模板
算法提高 最小方差生成树 时间限制:1.0s 内存限制:256.0MB 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是 ...
- unicode 与 utf-8 编码概念及区别
unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.每个字符都对应一个编号,编号的范围是0-0x10FFFF来.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为 ...
- java Api 读取HDFS文件内容
package dao; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java ...
- windows下怎样测试oracle安装是否成功以及在oracle中创建用户并赋予用户权限;和[Err] ORA-65096: 公用用户名或角色名无效的解决方案
测试oracle数据安装是否成功,可按顺序执行以下两个步骤: 测试步骤 1:请执行操作系统级的命令:tnsping orcl 上述命令假定全局数据库名是 orcl.以下是命令执行后的示例(请在cmd命 ...
- jquery parents() next() prev() 找父级别标签 找同级别标签
html结构 解决方法: jquery parents() 找父级别标签 next() 同级别向下找 prev() 同级别想上找 我这里找的是一个,下面有n个的方法 $(document).read ...
- 从javaScript中学习正则表达式——RegExp
正则表达式工具:http://regexper.com 由于国外网络可以选择 https://github.com/javallone/regexper-static 离线安装作为本地服务. 正则 ...
- JavaScript基础知识(三个判断、三个循环)
三个判断 if…else…只会执行其中一个条件 如果if条件中只有一个值,那么会默认转布尔: if(1=="1"){ // 当括号中条件为true时,执行此处的代码 console ...