PHP排列组合算法

 
更多

php排列组合的算法。

<?php

$keyword_list = ['mysql', '数据库', '权限'];

//求2个元素作为一个整体的排列数组
$list = arrangement($keyword_list, 2);
echo '<pre>';
print_r($list);

//求2个元素作为一个整体的排列数组个数
$num = arrangementNum(count($keyword_list), 2);
echo $num . "\n";

//求2个元素作为一个整体的组合数组
$list = combination($keyword_list, 2);
echo '<pre>';
print_r($list);

//求2个元素作为一个整体的组合数组个数
$num = combinationNum(count($keyword_list), 2);
echo $num . "\n";
// 阶乘
function factorial($n) {
    return array_product(range(1, $n));
}

// 排列数
function arrangementNum($n, $m) {
    return factorial($n) / factorial($n - $m);
}

// 组合数
function combinationNum($n, $m) {
    return arrangementNum($n, $m) / factorial($m);
}
// 排列
function arrangement($array, $m) {
    $r = array();

    $n = count($array);
    if ($m <= 0 || $m > $n) {
        return $r;
    }

    for ($i = 0; $i < $n; $i++) {
        $b = $array;
        $t = array_splice($b, $i, 1);
        if ($m == 1) {
            $r[] = $t;
        } else {
            $c = arrangement($b, $m - 1);
            foreach ($c as $v) {
                $r[] = array_merge($t, $v);
            }
        }
    }

    return $r;
}
// 组合
function combination($array, $m) {
    $r = array();

    $n = count($array);
    if ($m <= 0 || $m > $n) {
        return $r;
    }

    for ($i = 0; $i < $n; $i++) {
        $t = array($array[$i]);
        if ($m == 1) {
            $r[] = $t;
        } else {
            $b = array_slice($array, $i + 1);
            $c = combination($b, $m - 1);
            foreach ($c as $v) {
                $r[] = array_merge($t, $v);
            }
        }
    }

    return $r;
}

关于排列更高效的算法方法

function arrangementV2($array, $num) {
    $result = [];

    if ($num == 1) {
        foreach ($array as $key => $value) {
            $result[] = [$key => $value];
        }

        return $result;
    }

    ksort($array);
    $subArray = array_slice($array, 1, null, true);
    $subArrayResult = arrangementV2($subArray, $num - 1);

    foreach ($array as $key => $value) {
        foreach ($subArrayResult as $v1) {
            $ext = array_keys($v1);
            if ($key < array_shift($ext)) {
                $result[] = [$key => $value] + $v1;
            }
        }
    }

    return $result;
}
打赏

本文固定链接: https://www.cxy163.net/archives/3208 | 绝缘体-小明哥的技术博客

该日志由 绝缘体.. 于 2020年12月19日 发表在 MySQL, PHP, 数据库, 编程语言 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: PHP排列组合算法 | 绝缘体-小明哥的技术博客
关键字: , , , ,

PHP排列组合算法:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter