数字や単語を取り、すべての可能な組み合わせを見つけるアルゴリズム

StackOverflow https://stackoverflow.com/questions/1256117

  •  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://www.merriampark.com/comb.htmする (デッドリンク)

役に立ちましたか?

解決

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;
}

あなたはこのために、このオープンソースコードを試すことができます。それはイテレータを実装しています。 をクリックしてください。

利用可能なPHP、Javaでます。

あなたはそれを拡張する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top