PHP özel fonksiyon kod optimizasyonu

2 Cevap php

Şimdi zor olan kısmı geliyor. Nasıl bu işlevi optimize edebilirim:

function coin_matrix($test, $revs) {
    $coin = array();

    for ($i = 0; $i < count($test); $i++) {
        foreach ($revs as $j => $rev) {
            foreach ($revs as $k => $rev) {
            if ($j != $k && 
                $test[$i][$j] != null && 
                $test[$i][$k] != null) {
                    if(!isset($coin[$test[$i][$j]])) {
                        $coin[$test[$i][$j]] = array(); 
                    }
                    if(!isset($coin[$test[$i][$j]][$test[$i][$k]])) {
                        $coin[$test[$i][$j]][$test[$i][$k]] = 0; 
                    }

                    $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
                }
            }
        }
    }
    return $coin;
}

Bu işte o kadar iyi değilim ve diziler büyükse, sonsuza kadar çalışır.

$coin[$i][$j] += sum_of_pairs_in_array_row / [count(elements_of_row) - 1]: işlevi iki-dim dizideki değerlerin tüm çiftleri bulmak ve bu gibi onları toplamak gerekiyordu

Thanks a lot!

2 Cevap

Eğer gerçekten dizide 3 öğelerinin tüm birleşimlerini çalışıyor olması gerekiyorsa o büyük diziler geldiğinde, çoğunlukla sıkışmış. Sadece giriş arttıkça, çıkış süresi astronomik artacak, gerçeği hakkında bir şey yapamaz - ana faktör işlevi kübik olduğu gerçeği olacaktır. Bunu şimdi nerede% 30, diyelim ki, süresini azaltmak mümkün olabilir, ama zaman zaten 3 hafta ise, çalışma zamanı 1 hafta sizin için çok az şey yapar.

Söyleniyor, hala kendinizi içteki döngü içinde biraz çaba kaydedebilirsiniz. Ben doğru kod yorumlama ediyorsam, yerine henüz ayarlanmamış olduğunu her k öğe için kontrol dışında, sadece bir kez ij kombinasyonu başına $coin[$i][$j] = array() ayarlayabilirsiniz.

Bu da söyleniyor, bu işlevi yapıyor olması gerekiyordu ne hala tam olarak net değil, bu yüzden tam olarak $coin yerine coin kullanımı dışında güven ile diğer düzenlemeler sunamıyoruz , PHP çözümleyici biraz çaba kaydetmek için.

I don't know why this wasn't pointed out earlier: Change:

for ($i = 0; $i < count($test); $i++) {

Için:

$count = count($test);
for ($i = 0; $i < $count; $i++) {

Size oldukça zaman kazandıracak. (Daha fazla $ test büyükse)

Bunun doğru olup olmadığından emin değilim, ama $ some_var yok gibi oldukça bir yavaşlamaya neden olur:

$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

Son olarak, ben hala bunu gerekiyordu emin değilim. Belki bazı iyi giriş ve çıkış değerlerini sağlayabilir. Sizin belirtilen amacı hala mantıklı değil gibi. $ Devir neler, neden öyle:

$coin[$i][$j] += sum_of_pairs_in_array_row / [count(elements_of_row) - 1]

yerine:

$coin[$row] += sum_of_pairs_in_array_row / [count(elements_of_row) - 1]