Derinliği tüm dizi hareket için gerekli yineleme sayısını artırır onlar karmaşıklığı bileşik gibi, çok boyutlu diziler doğrusal arama algoritmaları (yukarıdaki doğrusal) dikkatli olun. Örn:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
uygun bir algoritma ile, (iğne [100] [1] at olsaydı) sizin için ne arıyorsanız bulmak için en fazla 200 tekrarlamalar da alacaktı.
Bu durumda doğrusal algoritmalar bir milyon girdileri (örneğin 1000x100x10 dizi) iğneyi bulmak için ortalama 500.000 yineleme alacağını, bu kötüdür, O (n) de (tüm dizideki elemanların sipariş sayısını) gerçekleştirin. Eğer çok boyutlu dizinin yapısını değiştirmeye karar verirseniz de ne olurdu? . Derinlik 100'den fazla Bilgisayar bilimi daha iyi yapabilirim Ve eğer PHP bir özyinelemeli algoritma tekmeyi olacaktır:
Mümkünse, her zaman yerine, çok boyutlu diziler nesneleri kullanabilirsiniz:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
ve bunları sıralamak ve bulmak için özel bir karşılaştırma arayüzü ve işlevi uygulamak:
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
(Ben her zaman çok bir arama fonksiyonu dahil ArrayObject genişletmek maceracı hissettiğiniz sıralamak ve bunları yönetebilirsiniz nesneler için kendi koleksiyonları uygulamak gerektiğini, uasort()
özel bir karşılaştırıcı kullanmak için kullanabileceğiniz az).
$arrayObj->uasort("myComp");
Onlar sıralanır kez (uasort (n keyfi veriler üzerinde alır kadar iyi olduğu,) log n, O), ikili arama O'da işlemi yapabilirsiniz (log n) zaman, yani bir milyon girişleri yalnızca ~ 20 yineleme alır arama. Bildiğim kadarıyla benim gibi farkında özel karşılaştırma ikili arama (array_search()
nesne referanslarıyla değil, kendi özellikleri çalışır doğal sıralamayı kullanır) PHP uygulanan değil, sen benim yaptığım gibi bu kendini uygulamak gerekir.
Bu yaklaşım daha verimli (bir derinlik artık yoktur) ve nesneler onlar sıralanır nasıl tanımlamak, böylece sonsuz kodunu geri çünkü daha da önemlisi evrensel (Eğer arayüzleri kullanarak karşılaştırılabilir zorlamak varsayarak). Çok daha iyi =)