หลังจากใช้ PHP มาระยะหนึ่งผมสังเกตว่าฟังก์ชั่น PHP ในตัวบางตัวนั้นไม่เร็วเท่าที่ควร พิจารณาการประยุกต์ใช้ที่เป็นไปได้ทั้งสองอย่างของฟังก์ชั่นที่ค้นหาว่าตัวเลขนั้นสำคัญเพียงใดโดยใช้อาเรย์แคชของช่วงเวลา
//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 );
}
เพราะนี่คือin_array
การดำเนินการกับการค้นหาเชิงเส้น O (n) ซึ่งจะชะลอตัวลงเชิงเส้นเป็น$prime_array
เติบโต ในกรณีที่array_key_exists
ฟังก์ชั่นถูกนำไปใช้กับการค้นหา hash O (1) ซึ่งจะไม่ทำให้ช้าลงเว้นแต่ว่าตารางแฮชจะได้รับการเติมข้อมูลอย่างมาก (ในกรณีนี้เป็นเพียง O (n))
จนถึงขณะนี้ผมได้มีการค้นพบที่ยิ่งใหญ่-O ผ่านการทดลองและข้อผิดพลาดและบางครั้งมองรหัสที่มา ตอนนี้สำหรับคำถาม ...
มีรายการของ O (หรือปฏิบัติ) ครั้งใหญ่ทางทฤษฎีสำหรับทุก * ฟังก์ชั่น PHP ในตัว?
* หรืออย่างน้อยน่าสนใจ
ตัวอย่างเช่นผมพบว่ามันยากมากที่จะทำนายโอใหญ่ของฟังก์ชั่นที่ระบุไว้เพราะการดำเนินการที่เป็นไปได้ขึ้นอยู่กับโครงสร้างข้อมูลที่ไม่รู้จักหลักของ PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(กับปัจจัยการผลิตอาร์เรย์) ฯลฯ
true
isset($large_prime_array[$number])
ถ้าฉันจำได้อย่างถูกต้องมันจะอยู่ในลำดับที่เร็วกว่าin_array
ฟังก์ชั่นหลายร้อยเท่า
array_key_exists
วนซ้ำแต่ละรายการในอาร์เรย์และเปรียบเทียบค่ากับเข็มที่คุณส่งไป หากคุณพลิกค่าเป็นคีย์ (และแทนที่ค่าแต่ละค่าด้วยค่าตัวอย่างเช่นการใช้จะเร็วกว่ามากหลายเท่านี่เป็นเพราะคีย์ของอาร์เรย์ถูกทำดัชนีโดย PHP (เช่น hashtable) ดังนั้นการค้นหา อาเรย์ในลักษณะนี้สามารถปรับปรุงความเร็วได้อย่างมากin_array
in_array
true
isset