有效地找到数组的所有唯一排列

时间:2019-10-15 11:42:22

标签: php

我需要一个函数,该函数将返回输入数组的所有可能唯一变化,但不重复数组元素,因此[a,b,c]和[b,c,a]相同。

我有一个工作函数,可以使用二进制计数输出所需的结果。因此,对于array("a", "b", "c")的输入数组,它将输出:

Array
(
    [0] => Array
        (
            [0] => c
        )

    [1] => Array
        (
            [0] => b
        )

    [2] => Array
        (
            [0] => b
            [1] => c
        )

    [3] => Array
        (
            [0] => a
        )

    [4] => Array
        (
            [0] => a
            [1] => c
        )

    [5] => Array
        (
            [0] => a
            [1] => b
        )

    [6] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

)

但是我发现对于具有20个或更多元素的数组,代码用完了内存。 我怀疑是因为$binary变量

我正在使用的代码是:

function find_unique_combinations($arr){
    $bits = count($arr);
    $dec = 1;
    while($dec < pow(2, $bits)) {
        $binary  = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT));
        $curterm = array();
        $i = 0;
        while($i < ($bits)){
            if($binary[$i] == 1) {
                $curterm[] = $arr[$i];
            }
            $i++;
        }

        $terms[] = $curterm;
        $dec++;
    }
    return $terms;
}

我收到的错误消息是

Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 36 bytes)

php.ini当前设置为512MB,我宁愿修复代码,也不愿在可能的情况下分配更多的内存。

1 个答案:

答案 0 :(得分:0)

因此,经过大量分析并分解了代码,我得出的结论是,无论如何对函数进行编码,都会发生内存耗尽错误。随着数组元素数量的增加,可能的组合数量也成倍增加,达到系统内存限制。

因此,我将输入数组限制为15,这将产生32,768种可能的组合。这应该涵盖此功能最可能的用例。

感谢@Anant_Singh看看。