PHP实现排列组合算法

一、组合算法

给定一非重复字符串所有的组合,形如 abc,则
Q1:输出所有组合 a,b,c,ab,ac,bc,abc;
Q2:输出指定长度的组合,如2个长度则输出 ab,ac,bc;
Q3:计算组合总数。

1、组合算法一——获取所有组合
/**
 * get_combinations 获取指定字符串的所有组合
 * @param string $str 目标字符串
 * @param array $comb 组合容器
 * @return bool | array
 * @author Mike Lee
 */
function get_combinations($str = '', &$comb = array())
{
    if (trim($str) == '' || ! $str) return false;
    if (strlen($str) <= 1) {
        $comb[] = $str;
    } else {
        $str_first = $str[0];
        $comb_temp = get_combinations(substr($str, 1), $comb);
        $comb[] = $str_first;
        foreach ($comb_temp as $k => $v) {
            $comb[] = $str_first . $v;
        }
    }
    return $comb;
}
2、组合算法二——获取指定长度的组合
待更新
3、组合算法三——计算组合数
/**
 * count_combinations 计算组合数
 * @param int $n
 * @param int $m
 * @return int $count
 * @author Mike Lee
 */
function count_combinations($n= 1, $m = false)
{
    $n = (int) $n;
    if ($n < 0) return false;
    if ($m === false) {
        $count = pow(2, $n) - 1;
    } else {
        $m = (int) $m;
        if ($m < 0) return false;
        if ($m > $n) return false;
        if ($m == $n || $m == 0) {
            $count = 1;
        } else {
            $count = factorial($n) / (factorial($m) * factorial($n - $m));
        }
    }
    return $count;
}

/**
 * factorial 阶乘
 * @param int $num
 * @return int $result
 */
function factorial($num = 0)
{
    $num = (int) $num;
    if ($num < 0) return false; // 负数没有阶乘
    if ($num > 1) {
        $result = $num * factorial($num - 1);
    } else {
        $result = 1;    // 0和1的阶乘均为1
    }
    return $result;
}
4、组合算法四——数组组合

给定若干一维索引数组,对各数组中的值进行组合;
例如 $a = [1, 2],$b = ['a', 'b'],那么将有如下组合:
[1, 'a'],[1, 'b'],[2, 'a'],[2, 'b'];
下面算法实现 foo 和 foo2 函数只是传参不同,效果一致。

function foo(array $arr)
{
    $num = count($arr);
    if ($num === 0) return false;
    if ($num === 1) return $arr[0];

    while(count($arr) > 1) {
        $arr_first = array_shift($arr);
        $arr_second = array_shift($arr);
        $c = array();
        foreach ($arr_first as $v) {
            $v = (array) $v;
            foreach ($arr_second as $val) {
                $c[] = array_merge($v, (array) $val);
            }
        }
        array_unshift($arr, $c);
        unset($c);
    }
    return $arr[0];
}

function foo2()
{
    $num = func_num_args();
    if ($num === 0) return false;
    $all = func_get_args();
    if ($num === 1) return $all[0];
    while(count($all) > 1) {
        $all_first = array_shift($all);
        $all_second = array_shift($all);
        $c = array();
        foreach ($all_first as $v) {
            $v = (array) $v;
            foreach ($all_second as $val) {
                $c[] = array_merge($v, (array) $val);
            }
        }
        array_unshift($all, $c);
        unset($c);
    }
    return $all[0];
}

二、排列算法

给定字符串一非重复字符串,例如 abc,则
Q1:输出所有排列 a,b,c,ab,ac,ba,bc,ca,cb,abc,acb,bac,bca,cab,cba;
Q2:输出指定长度的排列,如2个长度则输出 ab,ac,ba,bc,ca,cb;
Q3:计算排列总数。

1、排列算法一——获取所有排列
待更新
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 高级钳工应知鉴定题库(858题) ***单选题*** 1. 000003难易程度:较难知识范围:相关4 01答案:...
    开源时代阅读 11,287评论 1 9
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 28,567评论 5 20
  • 简单介绍 单位 在编写网页过程中需要对元素进行宽高,颜色,字体等的设置,这些需要使用单位。在CSS中,设置字体和宽...
    大小伍阅读 3,550评论 0 0
  • 我不是个好女人,但也不是个坏女人。用我自己的话说,我不好不坏,亦正亦邪。 好坏的标准是什么,以什么来区分呢?好女人...
    素墨无痕阅读 5,564评论 5 27
  • 卷宗细节:三次平台召对 第一次平台召对 经过:天启七年八月,崇焕入都,先奏陈兵事,帝召见平台,慰劳甚至,咨以方略。...
    四库全书提调官阅读 4,675评论 0 0

友情链接更多精彩内容