จริง ๆ แล้วฉันเคยเปรียบเทียบกับต้นแวนเอมัส - โบอาสด้วยตัวเองครั้งเดียว ฉันเปรียบเทียบกับ AA Tree, hashmap และ bit array
การทดสอบsize
จะทำการแทรกด้วยตัวเลขสุ่มในช่วงเวลา[0, bound]
จากนั้นsize
ทำการค้นหาจากนั้นทำการsize
ลบแล้วsize
ทำการค้นหาอีกครั้ง การลบจะทำกับตัวเลขสุ่มเช่นกันดังนั้นคุณต้องคิดก่อนว่ามันอยู่ในโครงสร้างหรือไม่
นี่คือผลลัพธ์ ( size
= 2000000, bound
= 10,000000) ในไม่กี่วินาที:
AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting... 7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting... 0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting... 1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting... 0.2387776
Searching... 0.3413800
อย่างที่คุณเห็นต้นไม้ Van Emde-Boas นั้นช้ากว่าแผนที่แฮชสองเท่าช้ากว่าอาเรย์บิตสิบเท่าและเร็วกว่าต้นไม้ค้นหาแบบทวิภาค 5 เท่า
แน่นอนว่าข้างต้นจำเป็นต้องมีข้อจำกัดความรับผิดชอบ: การทดสอบนั้นเป็นของปลอมคุณสามารถปรับปรุงรหัสหรือใช้ภาษาอื่นกับคอมไพเลอร์ที่มีเอาต์พุตเร็วกว่าและอื่น ๆ เป็นต้น
ข้อจำกัดความรับผิดชอบนี้เป็นหัวใจสำคัญของเหตุผลที่เราใช้การวิเคราะห์แบบอะซิมโทติคในการออกแบบอัลกอริทึม: เนื่องจากคุณไม่มีความคิดว่าค่าคงที่คืออะไรและค่าคงที่สามารถเปลี่ยนแปลงได้ขึ้นอยู่กับปัจจัยด้านสิ่งแวดล้อม
ตอนนี้ในกรณีของ logn กับ loglogn: ในตัวอย่างด้านบนต้น van Emde-Boas ของฉันสามารถเก็บได้ 232 องค์ประกอบ log232=32และ log32=5ซึ่งเป็นการปรับปรุงตัวประกอบ 6 ซึ่งค่อนข้างในทางปฏิบัติ นอกจากนี้ต้นฟาน Emde-Boas ยังมีปัจจัยคงที่ที่ดี (มันเป็นเรื่องของปัจจัยคงที่ในทางปฏิบัติสำหรับความแตกต่างเล็ก ๆ นี้) เนื่องจากพวกเขาไม่จำเป็นต้องสร้างความสมดุลให้ตัวเอง