numaraları veya kelimeleri almak ve mümkün olan tüm kombinasyonları bulabilirsiniz algoritması

2 Cevap php

Ben numaraları veya kelimeleri almak ve bunların hepsi birlikte olası varyasyonları bulmak ve aynı zamanda beni araya aramak için kaç değerleri tanımlamak sağlayacak bir algoritma için arıyorum.

Örnek dize veya dizi olduğunu söylüyorlar sağlar:

cat  
dog  
fish  

daha sonra bir 2 değeri sonuçları olabilir:

cat dog  
cat fish  
dog cat  
dog fish  
fish cat  
fish dog   

SO the results from the set of 3 items are 6 possible variations of it at 2 results matching
with 3 results matching it would be:

cat dog fish  
cat fish dog  
dog cat fish  
dog fish cat  
fish cat dog  
fish dog cat  

Muhtemelen ... daha fazla seçenek bile

Ben bunu yapar ama herkes belki bir şey zaten orada inşa PHP bunu nasıl biliyor merak ediyorum, javascript olan bu örneğe Stackoverflow bir bağlantı bulduk?

javascript version here

2 Cevap

http://pear.php.net/package/Math_Combinatorics bir göz atın

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

baskılar

cat dog
dog cat
cat fish
fish cat
dog fish
fish dog

Sizin böyle bir şey nasıl çalıştığını arıyorsanız, bu i ikili kullanarak php kütüphaneleri ile başarılmıştır nasıl.

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

Bu rağmen sadece eşsiz kombinasyonu dönecektir, ancak örnekte bu çıkışları kolayca kombinasyonların her türlü sipariş almak için uzatılabilir unutmayın:

Array
(
    [0] => fish 
    [1] => dog 
    [2] => dog fish 
    [3] => cat 
    [4] => cat fish 
    [5] => cat dog 
    [6] => cat dog fish 
)

Edit (More clarification)

Basic theory

Bu yüzden öncelikle, Bildiğiniz gibi ikili sayılar 1 ve 0 bir dize vardır. Sayısının uzunluğu bulunur bit 'sayısı, eg. numarası 011001 6 bit (durumda ilgilenen yılında numaralar 25) sahiptir. Durum 0 ise, göz ardı edilir ise daha sonra, sayının her bit terimlerin birine tekabül ediyorsa, her seferinde, yukarı sayar bit 1 ise, terim çıktı dahildir. Peki ne oluyor temel teorisi bu.

Delving into the code

PHP ikili sayma bir yolu vardır, ancak ikili ondalık dönüştürebilirsiniz. Yani bu fonksiyon aslında onluk kadar sayar ve bu ikili dönüştürür. Bit sayısı önemlidir çünkü her dönem kendi biraz ihtiyacı var gibi ama, bunu bu biraz ne şu, 0 önde gelen eklemek gerekir: str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT)

Şimdi bu fonksiyonu bir süre döngü kullanır, ama kaç kez olarak orada kaç terim bağlı döngü değişikliklere ihtiyacı, matematik biraz yapılması gerekiyor. Hiç ikili ile çalıştı varsa, yapabileceğiniz maksimum sayı 2 ^ n (n bit sayıdır) olduğunu bilecek.

Elimden bir şey özledik eğer bana bildirin, fonksiyonun bütün kafa karıştırıcı bit örtülü olması gerektiğini düşünüyorum.

See what's happening

Kullanılan mantık, bu bu şekilde görünce biraz daha mantıklı olabilir çıkışına aşağıdaki kodu kullanabilirsiniz!

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