<?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 排列组合函数(无重复组合,可重复组合【全排列组合】)的更多相关文章

  1. javascript柯里化及组合函数~

    大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...

  2. MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用

    在统计查询中,经常会用到count函数,这里是基础的 MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用 -- 创建表 CREATE TABLE `tb ...

  3. js的组合函数

    1.组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递 1>最简单版本 这种方法实现的组合函数,需要我们指定函数的执行顺序 /**第一种方法 */ function add(a, b) ...

  4. oracle 子查询和组合函数

    oracle 子查询和组合函数 --查询与"SCOTT"在同一个部门的员工 select empno,ename,deptno from emp where deptno in ( ...

  5. go结构体组合函数

    结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数 ...

  6. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  7. JS前端无侵入实现防止重复提交请求技术

    JS前端无侵入实现防止重复提交请求技术 最近在代码发布测试的过程中,我发现有些请求非常的消耗服务器资源,而系统测试人员因为响应太慢而不停的点击请求.我是很看不惯系统存在不顺眼的问题,做事喜欢精益求精, ...

  8. 用JS编写一个函数,返回数组中重复出现过的元素

    用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...

  9. 大数据位图法(无重复排序,重复排序,去重复排序,数据压缩)之Java实现

    1,位图法介绍 位图的基本概念是用一个位(bit)来标记某个数据的存放状态,由于采用了位为单位来存放数据,所以节省了大量的空间.举个具体的例子,在Java中一般一个int数字要占用32位,如果能用一位 ...

随机推荐

  1. Zephyr学习(五)线程和调度

    前面说过zephyr支持静态和动态两种方式创建线程,这里分析动态创建的方式.应用程序通过调用k_thread_create()函数创建一个线程,实际上是调用_impl_k_thread_create( ...

  2. Python实现代码统计工具——终极加速篇

    Python实现代码统计工具--终极加速篇 声明 本文对于先前系列文章中实现的C/Python代码统计工具(CPLineCounter),通过C扩展接口重写核心算法加以优化,并与网上常见的统计工具做对 ...

  3. java高级---->Java观察者的原理

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.今天我们通过模拟按钮的处理事件来深入Java ...

  4. JVM监控和调优常用命令工具总结

    JVM监控和调优 在Java应用和服务出现莫名的卡顿.CPU飙升等问题时总是要分析一下对应进程的JVM状态以定位问题和解决问题并作出相应的优化,在这过程中Java自带的一些状态监控命令和图形化工具就非 ...

  5. jvm.option是什么,它是如何加载的

    jvm.option是一些程序里边的java的配置参数的一个集合,不同的应用都会定义自己的jvm.options用来控制一些jvm的参数 以下,以elasticsearch为例,来说明它是如何加载的 ...

  6. 公司中springcloud项目遇到的问题

    1.更改maven的.m2下的settings.xml文件,程序就可以运行,是不是很神奇?

  7. hdu 2097 sky数(进制转换)

    Sky数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. openshift 配置 bitbucket 的webhook

    参考 https://docs.openshift.org/latest/dev_guide/builds/triggering_builds.html oc set triggers bc < ...

  9. python 链表表达式 map、filter易读版

    链表推导式 [x for x in x] 链表推导式提供了一个创建链表的简单途径,无需使用 map(), filter() 以及 lambda.返回链表的定义通常要比创建这些链表更清晰.每一个链表推导 ...

  10. C# word 图片大小

    通过Office自带的类库word文档中插入图片,图片大小的单位为磅 而文档中,图片的大小已经固定,为CM. 实际工作中,首先将图片插入到word中,根据目前的大小,计算转换为目标大小的比率,将长宽按 ...