Ben bir yere başvurmak için olması iyi bir fikir olacağını düşündüm önce kimse bu yapmış gibi görünmüyor çünkü. Ben array_*
işlevleri tanımlamak için rağmen gitti ve ya kriter veya kod süzme yoluyla ettik. Ben en yakın daha ilginç Big-O koymak denedim. Bu liste tam değildir.
Not: Bir karma arama gerçekten O (n) olsa bile (1) O olduğu varsayılarak hesaplanan All Big-O. N katsayısı arama Big-O özellikleri etkisini alarak başlamak istiyorum önce yeterince büyük bir dizi depolama koç havai size zarar vereceğini, bu yüzden düşüktür. Örneğin array_key_exists
-N at = 1 ve N = 1,000,000 bir çağrı arasındaki fark ~% 50 saat artıştır.
Interesting Points:
isset
/ array_key_exists
çok in_array
daha hızlı ve array_search
olduğu
+
(sendika) array_merge
biraz daha hızlı (ve daha güzel görünüyor). Ama o kadar akılda tutmak farklı çalışır.
shuffle
array_rand
ile aynı Big-O katmanlı verildi
array_pop
/ array_push
yeniden göstergesi alınmaz için array_shift
/ array_unshift
nedeniyle daha hızlı
Lookups:
array_key_exists
O (n) ama O gerçekten yakın (1) - bu, çünkü çarpışmalar doğrusal yoklama, ancak çarpışma şansı çok küçük olduğu için, katsayı da çok azdır. I O (1), daha gerçekçi, büyük-O vermek gibi karma aramalarını tedavi bulmak. Örneğin N = 1000 ve N = 100000 arasındaki farklı sadece yaklaşık% 50 yavaş aşağı.
isset( $array[$index] )
O (n) ama O gerçekten yakın (1) - bu array_key_exists gibi aynı arama kullanır. Anahtar kodlanmış ise o dil yapı yana, aynı anahtar tekrar tekrar kullanıldığı durumlarda hız yukarı çıkan, arama önbelleğe alır.
in_array
O (n) - bu değerini bulana kadar dizide olsa bir doğrusal arama yapar çünkü bu.
array_search
O (n) - bu İn_Array'in gibi aynı temel işlevi kullanır ama değerini döndürür.
Queue functions:
array_push
O (Σ var_i, tüm i için)
array_pop
O (1)
array_shift
O (n) - tüm tuşları reindex var
(Tüm i için n + Σ var_i) array_unshift
O - tüm tuşları reindex var
Array Intersection, Union, Subtraction:
array_intersect_key
if kavşak% 100 do O (Max (param_i_size) * Σparam_i_count, tüm i için), kesişme 0% kesişir eğer O (Σparam_i_size, tüm i için)
array_intersect
kesişme 100% O do if (n ^ 2 * Σparam_i_count, tüm i için), kesişme% 0 O kesişir (n ^ 2) ise
array_intersect_assoc
if kavşak% 100 do O (Max (param_i_size) * Σparam_i_count, tüm i için), kesişme 0% kesişir eğer O (Σparam_i_size, tüm i için)
array_diff
O (π param_i_size, tüm i için) - Hepsi param_sizes ürün bulunuyor
array_diff_key
O (Σ param_i_size, i = 1!) - Biz ilk dizinin üzerinde yineleme gerek yok çünkü bu.
array_merge
O (Σ array_i, i = 1!) - İlk dizinin üzerinde yineleme gerekmez
Bu yeniden numaralandırmak zorunda olmadığından array_merge daha az yük - n 2 dizinin boyutu (yani array_first + array_second) olan +
(sendika) O (n),
array_replace
O (Σ array_i, tüm i için)
Random:
shuffle
O (n)
array_rand
O (n) - doğrusal bir anket gerektirir.
Obvious Big-O:
array_fill
O (n)
array_fill_keys
O (n)
range
O (n)
array_splice
O (+ uzunluğu ofset)
array_slice
O (+ uzunluğu ofset) ya da O (n) ise uzunluğu = null
array_keys
O (n)
array_values
O (n)
array_reverse
O (n)
array_pad
O (pad_size)
array_flip
O (n)
array_sum
O (n)
array_product
O (n)
array_reduce
O (n)
array_filter
O (n)
array_map
O (n)
array_chunk
O (n)
array_combine
O (n)
Ben kolay fonksiyonları Big-O bulmak için yapmak için Eureqa teşekkür etmek istiyorum. Bu keyfi veri için en uygun işlevini bulabilirsiniz inanılmaz free program.
EDIT:
PHP dizi aramalarını O(N)
olduğuna şüphe olanlar için, ben (en çok gerçekçi değerler için hala etkili O(1)
olan) olduğunu test etmek için bir kriter yazdım.
$tests = 1000000;
$max = 5000001;
for( $i = 1; $i <= $max; $i += 10000 ) {
//create lookup array
$array = array_fill( 0, $i, NULL );
//build test indexes
$test_indexes = array();
for( $j = 0; $j < $tests; $j++ ) {
$test_indexes[] = rand( 0, $i-1 );
}
//benchmark array lookups
$start = microtime( TRUE );
foreach( $test_indexes as $test_index ) {
$value = $array[ $test_index ];
unset( $value );
}
$stop = microtime( TRUE );
unset( $array, $test_indexes, $test_index );
printf( "%d,%1.15f\n", $i, $stop - $start ); //time per 1mil lookups
unset( $stop, $start );
}