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

乌斯曼

我需要一个函数来返回输入数组的所有可能的唯一变体,但不重复数组元素,因此 [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,如果可能的话,我宁愿修复代码也不愿分配更多内存。

乌斯曼

所以经过大量的分析和拆开代码,我得出的结论是,无论函数如何编码,都会发生内存耗尽错误。随着数组元素数量的增加,可能的组合数量呈指数增长,直至达到系统内存限制。

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

感谢@Anant_Singh 看一看。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章