Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 算法,将采取数字或文字,并找到所有可能的组合_Php_Algorithm_Permutation - Fatal编程技术网

Php 算法,将采取数字或文字,并找到所有可能的组合

Php 算法,将采取数字或文字,并找到所有可能的组合,php,algorithm,permutation,Php,Algorithm,Permutation,我正在寻找一种算法,它将数字或单词放在一起,找到它们所有可能的变化,并让我定义要一起查找的值的数量 例如,假设字符串或数组为: cat dog fish 那么值为2的结果可能是: cat dog cat fish dog cat dog fish fish cat fish dog cat dog fish cat fish dog dog cat fish dog fish cat fish cat dog fish dog cat

我正在寻找一种算法,它将数字或单词放在一起,找到它们所有可能的变化,并让我定义要一起查找的值的数量

例如,假设字符串或数组为:

cat  
dog  
fish  
那么值为2的结果可能是:

cat dog  
cat fish  
dog cat  
dog fish  
fish cat  
fish dog   
cat dog fish  
cat fish dog  
dog cat fish  
dog fish cat  
fish cat dog  
fish dog cat  
因此,在2个结果匹配时,3个项目集的结果是6个可能的变化
如果有3个结果相匹配,则为:

cat dog  
cat fish  
dog cat  
dog fish  
fish cat  
fish dog   
cat dog fish  
cat fish dog  
dog cat fish  
dog fish cat  
fish cat dog  
fish dog cat  
……甚至可能有更多的选择

我在Stackoverflow上找到了一个链接,指向这个例子,但是它是在javascript中实现的,我想知道是否有人知道如何在PHP中实现这一点,也许已经构建了一些东西

(死链接)

看看


如果您想了解类似的东西是如何工作的,我就是这样做到的,没有使用二进制的php库

function search_get_combos($query){
$list = explode(" ", $query);
$bits = count($list); //bits of binary number equal to number of words in query;
//Convert decimal number to binary with set number of bits, and split into array
$dec = 1;
$binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT));
while($dec < pow(2, $bits)) {
    //Each 'word' is linked to a bit of the binary number.
    //Whenever the bit is '1' its added to the current term.
    $curterm = "";
    $i = 0;
    while($i < ($bits)){
        if($binary[$i] == 1) {
            $curterm .= $list[$i]." ";
        }
        $i++;
    }
    $terms[] = $curterm;
    //Count up by 1
    $dec++;
    $binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT));
}
return $terms;
}
编辑(更多说明) 基本理论 首先,你可能知道二进制数是由1和0组成的字符串。数字的长度是它的“位”数,例如数字
011001
有6位(如果您感兴趣,数字为25)。然后,如果数字的每一位对应于其中一个项,则每次它向上计数,如果该位为1,则该项包含在输出中,而如果为0,则忽略该项。这就是发生的事情的基本理论

深入研究代码 PHP没有二进制计数的方法,但您可以将小数转换为二进制。所以这个函数实际上是以十进制计数,并将其转换为二进制。但是因为位的数量很重要,因为每个术语都需要自己的位,所以您需要添加前导0,所以这个位就是这样做的:
str_pad(decbin($dec),$bits,'0',str_pad_LEFT)

现在这个函数使用while循环,但是由于循环次数的变化取决于有多少个术语,所以需要做一些数学计算。如果您曾经使用过二进制,您就会知道,您可以使用的最大数字是2^n(其中n是位数)

我想这应该涵盖了函数中所有令人困惑的部分,如果我遗漏了什么,请告诉我

看看发生了什么 使用下面的代码输出所使用的逻辑,这样看可能更有意义

function search_get_combos_demo($query){
    $list = explode(" ", $query);
    $bits = count($list);
    $dec = 1;
    while($dec < pow(2, $bits)) {
        $binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT));
        $curterm = "";
        $i = 0;
        while($i < ($bits)){
            if($binary[$i] == 1) {
                $curterm[] = $list[$i]." ";
            }
            $i++;
        }
        //-----DISPLAY PROCESS-----//
        echo "Iteration: $dec <table cellpadding=\"5\" border=\"1\"><tr>";
        foreach($binary as $b){
            echo "<td>$b</td>";
        }
        echo "</tr><tr>";
        foreach($list as $l){
            echo "<td>$l</td>";
        }
        echo "</tr></table>Output: ";
        foreach($curterm as $c){
            echo $c." ";
        }
        echo "<br><br>";
        //-----END DISPLAY PROCESS-----//
        $terms[] = $curterm;
        $dec++;
    }
    return $terms;
}
函数搜索\u获取\u组合\u演示($query){
$list=分解(“,$query);
$bits=计数($list);
$dec=1;
而($dec
”; //-----结束显示过程-----// $terms[]=$curterm; $dec++; } 返回$terms; }
非常好的PEAR包,我以后会使用它。这是非常感谢您提供的信息,您知道示例脚本中这2个是$combination和$permutation之间的区别吗?在排列中,元素的顺序计数,在组合中,顺序是无关的。例如,(猫,狗)和(狗,猫)都包含在排列的结果中(),而组合的结果()只包含其中一个,第二个被认为是相等的。顺便说一句,你可以从中复制,它自己可以很好地工作。我不知道这是如何工作的,你能在这个概念上添加更多的细节吗?@TimoHuovinen我更新了我的答案。如果它回答了您的问题,请让我知道,否则请让我知道,我会尽力解释更多谢谢您花时间澄清它,今天晚些时候我们将对此进行深入研究。@TimoHuovinen尝试一下我在回答末尾添加的函数,它可能会让您更清楚地了解发生了什么,因为它会为每次迭代输出一个表!现在我明白了!视觉信息有帮助!1.你把2取为单词数的幂,3个单词等于8:“猫狗鱼”,如果你用二进制数到8,它就是000001010011100101110111。如果将计数中的第一个数字视为包含“猫”的规则,第二个数字表示“狗”,第三个数字表示“鱼”,则二进制计数将包含所有可能的组合!001=鱼,101=猫鱼,111=猫狗鱼JavaScript链接已断开
function search_get_combos_demo($query){
    $list = explode(" ", $query);
    $bits = count($list);
    $dec = 1;
    while($dec < pow(2, $bits)) {
        $binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT));
        $curterm = "";
        $i = 0;
        while($i < ($bits)){
            if($binary[$i] == 1) {
                $curterm[] = $list[$i]." ";
            }
            $i++;
        }
        //-----DISPLAY PROCESS-----//
        echo "Iteration: $dec <table cellpadding=\"5\" border=\"1\"><tr>";
        foreach($binary as $b){
            echo "<td>$b</td>";
        }
        echo "</tr><tr>";
        foreach($list as $l){
            echo "<td>$l</td>";
        }
        echo "</tr></table>Output: ";
        foreach($curterm as $c){
            echo $c." ";
        }
        echo "<br><br>";
        //-----END DISPLAY PROCESS-----//
        $terms[] = $curterm;
        $dec++;
    }
    return $terms;
}