Po dłuższym użyciu PHP zauważyłem, że nie wszystkie wbudowane funkcje PHP działają tak szybko, jak się spodziewano. Rozważ te dwie możliwe implementacje funkcji, która sprawdza, czy liczba jest liczbą pierwszą, używając buforowanej tablicy liczb pierwszych.
//very slow for large $prime_array
$prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... );
$result_array = array();
foreach( $prime_array => $number ) {
$result_array[$number] = in_array( $number, $large_prime_array );
}
//speed is much less dependent on size of $prime_array, and runs much faster.
$prime_array => array( 2 => NULL, 3 => NULL, 5 => NULL, 7 => NULL,
11 => NULL, 13 => NULL, .... 104729 => NULL, ... );
foreach( $prime_array => $number ) {
$result_array[$number] = array_key_exists( $number, $large_prime_array );
}
Wynika to z faktu, że in_array
jest realizowane za pomocą wyszukiwania liniowego O (n), które będzie liniowo zwalniać w miarę $prime_array
wzrostu. Gdy array_key_exists
funkcja jest zaimplementowana z wyszukiwaniem skrótów O (1), który nie zwolni, chyba że tablica skrótów zostanie bardzo zapełniona (w takim przypadku jest to tylko O (n)).
Do tej pory musiałem odkrywać duże O poprzez próbę i błąd, a czasami od czasu do czasu patrzę na kod źródłowy . Teraz pytanie…
Czy istnieje lista teoretycznych (lub praktycznych) dużych czasów O dla wszystkich * wbudowanych funkcji PHP?
* lub przynajmniej te interesujące
Na przykład, bardzo trudno przewidzieć Big O funkcji wymienionych ponieważ ewentualna realizacja zależy od struktury danych brak podstawowych PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(z wejściami tablicy), etc.
true
a następnie przetestowanie obecności za pomocą isset($large_prime_array[$number])
. Jeśli dobrze pamiętam, jest to setki razy szybsze niż in_array
funkcja.
array_key_exists
, porównuję in_array
. in_array
iteruje każdy element w tablicy i porównuje wartość z igłą, którą mu przekazujesz. Jeśli przerzucisz wartości na klucz (i po prostu zastąpisz każdą z wartościami fikcyjnymi, np. true
Użycie isset
jest wiele razy szybsze. Jest tak, ponieważ klucze tablicy są indeksowane przez PHP (jak tablica haszująca). W rezultacie wyszukiwanie tablica w ten sposób może znacząco poprawić prędkość