数字や単語を取り、すべての可能な組み合わせを見つけるアルゴリズム
-
12-09-2019 - |
質問
私は、数字や言葉を取ると一緒にそれらのすべての可能なバリエーションを見つけても、私は一緒に探しにどのように多くの値を定義できますアルゴリズムを探しています。
の例では、文字列や配列があると言うことができます:
cat
dog
fish
次に、2値の結果は次のようになります。
cat dog
cat fish
dog cat
dog fish
fish cat
fish dog
SO 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 の<見てみましょう/ P>
<?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ライブラリとそれをacheived方法です。
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
は(ケースあなたが興味の数字25)6ビットを有します。番号の各ビットは、条件のいずれかに該当する場合、ビットが1である場合、それが0の場合は、それは無視され、一方、その後、それがカウントアップするたびには、この用語は、出力に含まれています。だから、何が起こっているかの基本的な理論のthatsます。
コード
掘り下げます PHPはバイナリでカウントする方法はありませんが、あなたはバイナリに小数を変換することができます。したがって、この機能は、実際に小数でカウントアップ、およびバイナリに変換していること。しかし、それぞれの用語は、独自のビットを必要とするビット数は、重要であるため、あなたは先頭の0を追加する必要があり、このビットが何をするかのthatsので: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;
}