一尘不染

算法-从必须按顺序选择的项目中生成所有组合

algorithm

我正在寻找一个特定的算法是否已经存在。我想在应用程序中使用它,但是我也看到了一些Euler项目的问题。

我正在寻找一种特定类型的排列/输出集,其中选择的下一项 必须 是仅来自下一组的有限选项中的一项。

例如,说我有3个数组

$a1 = array("a", "b", "c");
$a2 = array("d", "e", "f");
$a3 = array("g", "h", "i");

我期待以产生含有序列中的所有的可能性 从每个阵列至多1个元件以便选择 。也就是说,作为输出,我希望看到:

adg aeg afg
adh aeh afh
adi aei afi

bdg beg bfg 
bdh beh bfh
bdi bei bfi

cdg ceg cfg
cdh ceh cfh
cdi cei cfi

寻找用PHP或Javascript实现该算法。本质上,它将遍历包含可变数量元素的可变数量数组,并输出可能按顺序出现的所有序列序列。

是否存在?

如果是这样,它叫什么?从技术上讲,这并不是我所了解的排列或组合。

编辑:丹尼尔·菲舍尔(Daniel
Fischer)告诉我这是笛卡尔积,这是从PHP网站获取的一种实现:

function array_cartesian_product($arrays)
{
    $result = array();
    $arrays = array_values($arrays);
    $sizeIn = sizeof($arrays);
    $size = $sizeIn > 0 ? 1 : 0;
    foreach ($arrays as $array)
        $size = $size * sizeof($array);
    for ($i = 0; $i < $size; $i ++)
    {
        $result[$i] = array();
        for ($j = 0; $j < $sizeIn; $j ++)
            array_push($result[$i], current($arrays[$j]));
        for ($j = ($sizeIn -1); $j >= 0; $j --)
        {
            if (next($arrays[$j]))
                break;
            elseif (isset ($arrays[$j]))
                reset($arrays[$j]);
        }
    }
    return $result;
}

阅读 215

收藏
2020-07-28

共1个答案

一尘不染

这是笛卡尔乘积,如果从每个列表/数组中仅选择一项,则更确切地说是笛卡尔乘积的元素列表。对于列表,它在Haskell的标准库中:

Prelude> sequence ["abc","def","ghi"]
["adg","adh","adi","aeg","aeh","aei","afg","afh","afi","bdg","bdh","bdi","beg","beh"
,"bei","bfg","bfh","bfi","cdg","cdh","cdi","ceg","ceh","cei","cfg","cfh","cfi"]

我认为对于PHP或Javascript,您必须自己编写代码。

2020-07-28