【问题标题】:Altered Combinations/Permutations Algorithm in PHPPHP中改变的组合/排列算法
【发布时间】:2016-10-18 18:39:28
【问题描述】:

我很难编写一个接受数组并返回数组数组的函数。我不确定这是否会被视为组合、排列或其他东西。结果应该与我见过的其他一些排列组合算法类似,但并不完全相同。

假设函数签名是这样的

function variable_length_permutations_with_duplicates($set_array, $max_subset_length)

然后这段代码:

$sets = variable_length_permutations_with_duplicates(array('a', 'b'), 2);

应该像这样返回一个数组数组:

[ ['a'], ['a','a'], ['a','b'], ['b], ['b','b'], ['b','a'], ]

它确实需要使用数组,因为值可以是任何东西,它们不一定是该示例中的字符串。返回数组中的子集不需要以任何特定顺序出现。

您知道我可以为此使用的任何 PHP 函数或类,或者我可以翻译成 PHP 的另一种语言的参考实现吗?

【问题讨论】:

    标签: php arrays algorithm combinations permutation


    【解决方案1】:

    你可以使用这段代码——我把函数名缩短了一点:):

    function perm($set_array, $max_subset_length, $prefix = []) {
        $result = [$prefix];
        if ($max_subset_length) {
            foreach ($set_array as $el) {
                $result = array_merge($result, 
                    perm($set_array, $max_subset_length-1, array_merge($prefix, [$el])));
            }
        }
        return $result;
    }
    
    $sets = perm(array('a', 'b'), 2);   
    
    print_r($sets);
    

    请注意,在此逻辑中,空数组也包含在结果中。使用if,您可以在函数的第一行按如下方式排除它:

        $result = count($prefix) ? [$prefix] : [];
    

    【讨论】:

    • 哇,你读懂了我的想法,弄清楚了我真正需要什么,并提供了代码。好工作。我的意思是,包含的空集结果是一件好事。根据我的单元测试,这段代码也能完美运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2012-10-24
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多