PHP Keyfi Boy (Ağırlıklı) Kombinasyonlar kelimeler oluşturuluyor

4 Cevap php

Kullanım yaygınlığına sırasına göre sıralanır ortak kelimelerin bir listesini, verilen bu 'en yaygın' dizilerinin amacıyla bir keyfi uzunluğu (kelime istenilen sayı) kelime kombinasyonları oluşturmak mümkündür. En yaygın kelimeler, uzunluğu iki kombinasyonları için 'a, b, c' ise, örneğin, şu oluşturulabilir olacaktır:

aa
ab
ba
bb
ac
bc
ca
cb
cc

İşte uzunluğu 3 için doğru listesi:

aaa
aab
aba
abb
baa
bab
bba
bbb
aac
abc
bac
bbc
aca
acb
bca
bcb
acc
bcc
caa
cab
cba
cbb
cac
cbc
cca
ccb
ccc

Bu elemanların herhangi bir sayı için 2 veya 3 kelime (kümesi uzunluğu) kombinasyonları için uygulamak basittir, ama bu keyfi uzunlukları için neler yapılabilir? PHP bu uygulamak istiyorum, ama yalancı ya da algoritma bile bir özet çok duyacağız!

4 Cevap

Burada neye ihtiyacınız olabilir özyinelemeli bir fonksiyon. Bir uzunluğa ve bir mektup verildiğinde fikri önce bu harfi kapsamamaktadır kısa bir harf olan tüm dizileri oluşturmak için, bir. Sonuna yeni bir mektup ekleyin ve o mektubu içeren dizisinin ilk bölümü var. Sonra sola yeni bir mektup taşıyın. Harfler sağa including yenisi her dizisi aracılığıyla döngü.

So if you had gen(5, d) It would start with

(aaaa)d
(aaab)d
...
(cccc)d

bunu yapacağını ac kombinasyonları ile bitti o zaman

(aaa)d(a)
...
(aaa)d(d)
(aab)d(d)
... 
(ccc)d(d)

Bu 4 harfi d ile bitti o zaman bu 3 taşımak istiyorum

(aa)d(aa)

vs, vs

<?php 
/** 
 * Word Combinations (version c) 6/22/2009 1:20:14 PM 
 * 
 * Based on pseudocode in answer provided by Erika: 
 *   http://stackoverflow.com/questions/1024471/generating-ordered-weighted-combinations-of-arbitrary-length-in-php/1028356#1028356 
 *   (direct link to Erika's answer) 
 * 
 * To see the results of this script, run it: 
 *   http://stage.dustinfineout.com/stackoverflow/20090622/word_combinations_c.php 
**/ 

init_generator(); 

function init_generator() { 
    global $words; 
    $words = array('a','b','c'); 
    generate_all(5);


} 

function generate_all($len){
    global $words;
    for($i = 0; $i < count($words); $i++){
        $res = generate($len, $i); 

    	echo join("<br />", $res); 	
    	echo("<br/>");
    }	
}

function generate($len, $max_index = -1){ 
    global $words; 

    // WHEN max_index IS NEGATIVE, STARTING POSITION 
    if ($max_index < 0) { 
        $max_index = count($words) - 1; 
    } 

    $list = array(); 


    if ($len <= 0) { 
    	$list[] = "";
        return $list; 
    } 

    if ($len == 1) { 

        if ($max_index >= 1) { 
    		$add = generate(1, ($max_index - 1));
    		foreach ($add as $addit) { 
                $list[] = $addit; 
            } 


        } 
    	$list[] = $words[$max_index]; 
        return $list; 
    } 

    if($max_index == 0) { 
        $list[] = str_repeat($words[$max_index], $len); 
        return $list; 
    } 

    for ($i = 1; $i <= $len; $i++){ 
        $prefixes = generate(($len - $i), ($max_index - 1)); 
        $postfixes = generate(($i - 1), $max_index); 
        foreach ($prefixes as $pre){ 
    		//print "prefix = $pre<br/>";
            foreach ($postfixes as $post){ 
    			//print "postfix = $post<br/>";
                $list[] = ($pre . $words[$max_index] . $post); 
            } 
        } 
    } 
    return $list; 
} 

?>

Php permütasyon googled ve var: http://www.php.happycodings.com/Algorithms/code21.html

Iyi olup olmadığını ben koduna bakmadım. Ama ne istediğinizi yapmak gibi görünüyor.

Ben terimi hesaplamak için çalışıyoruz ne için olduğunu bilmiyorum, ama bu permütasyon-ile-tekrarı çeşit bulunuyor, kombinasyonları hatta permütasyon değil.

Ben ortalıkta var yakın şeyden biraz biraz adapte kodu kapalı ettik Aşağıda böyle bir şey, LPC bir dize permütasyon jeneratör yok. A, b, c, oluşturduğu için

abc
bac
bca
acb
cab
cba

Muhtemelen istediğiniz tekrarlama davranışını etkinleştirmek için tweaked olabilir.

varargs mixed array permutations(mixed array list, int num) {
    mixed array out = ({});
    foreach(mixed item : permutations(list[1..], num - 1))
        for(int i = 0, int j = sizeof(item); i <= j; i++)
            out += ({ implode(item[0 .. i - 1] + ({ list[0] }) + item[i..], "") });
    if(num < sizeof(list))
        out += permutations(list[1..], num);
    return out;
}

FWIW, sorunu anlatan bir başka yolu N elemanlarının bir giriş için, düğümler gibi girdi unsurları ile tam bağlı, kendine bağlı grafiği uzunluk N tüm yollar kümesini istiyorum olmasıdır.

Söylediğim zaman m (sizin örneklerde 2 ve 3) dizisinin uzunluğu olduğu sabit uzunlukta, sen, m iç içe döngüler kullanıyorsanız kolay olduğunu varsayarak yaşıyorum.

Böyle özyineleme kullanabilirsiniz:

Senin sözlerin, 0 numaralı 1, .. n uzunluğa tüm dizileri oluşturmak gerekiyor m edilir:

generate all sequences of length m:
{
    start with 0, and generate all sequences of length m-1
    start with 1, and generate all sequences of length m-1
    ...
    start with n, and generate all sequences of length m-1 
}

generate all sequences of length 0
{
    // nothing to do
}

Bu nasıl uygulanacağı? Eh, her zaman dizinin sonuna bir daha eleman zorlayabilir aramak ve özyineleme sonuna vurduğunuzda, dizinin içeriğini yazdırmak:

// m is remaining length of sequence, elements is array with numbers so far
generate(m, elements)
{
    if (m == 0)
    {
        for j = 0 to elements.length print(words[j]);
    }
    else
    {
        for i = 0 to n - 1
        {
            generate(m-1, elements.push(i));
        }   
    }
}

Ve nihayet, bu gibi diyoruz: oluşturmak (6, array ())