[英]algorithm that will take numbers or words and find all possible combinations
我正在寻找一种算法,该算法将采用数字或单词并一起找到它们的所有可能变体,还让我定义要一起查找的值。
示例以字符串或数组为例:
cat
dog
fish
那么值2的结果可能是:
cat dog
cat fish
dog cat
dog fish
fish cat
fish dog
因此,来自3个项目的结果集是2个结果匹配时它的6种可能的变化
如果有3个结果匹配,它将是:
cat dog fish
cat fish dog
dog cat fish
dog fish cat
fish cat dog
fish dog cat
...甚至更多的选择
我在Stackoverflow上找到了一个指向此示例的链接,该链接执行此操作,但它在javascript中,我想知道是否有人知道如何在PHP中执行此操作,也许已经建立了某些东西?
看看http://pear.php.net/package/Math_Combinatorics
<?php
require_once 'Math/Combinatorics.php';
$words = array('cat', 'dog', 'fish');
$combinatorics = new Math_Combinatorics;
foreach($combinatorics->permutations($words, 2) as $p) {
echo join(' ', $p), "\n";
}
版画
cat dog
dog cat
cat fish
fish cat
dog fish
fish dog
如果您正在寻找类似的工作方式,这就是我在没有使用二进制的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;
}
请注意,虽然这只会返回唯一的组合,但是可以轻松扩展以获取组合的所有可能顺序,因此在您的示例中,输出:
Array
(
[0] => fish
[1] => dog
[2] => dog fish
[3] => cat
[4] => cat fish
[5] => cat dog
[6] => cat dog fish
)
因此,首先,您可能知道的二进制数是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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.