Tôi đã thực sự điểm chuẩn cây van Emde-Boas một lần. Tôi đã so sánh nó với một Cây AA, một hashmap và một mảng bit.
Các thử nghiệm thực hiện size
chèn với các số ngẫu nhiên trong khoảng [0, bound]
, sau đó size
tìm kiếm, sau đó size
xóa và sau đó size
tìm kiếm lại . Việc xóa cũng được thực hiện trên các số ngẫu nhiên, vì vậy trước tiên bạn phải tìm hiểu xem chúng có nằm trong cấu trúc không.
Dưới đây là kết quả ( size
= 2000000, bound
= 10000000) sau vài giây:
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
Như bạn có thể thấy, cây van Emde-Boas chậm gấp đôi so với bản đồ băm, chậm gấp mười lần so với mảng bit và nhanh gấp 5 lần so với cây tìm kiếm nhị phân.
Tất nhiên những điều trên cần từ chối trách nhiệm: các thử nghiệm là giả tạo, bạn có thể cải thiện mã hoặc sử dụng ngôn ngữ khác với trình biên dịch có đầu ra nhanh hơn, v.v.
Từ chối trách nhiệm này là cốt lõi của lý do chúng tôi sử dụng phân tích tiệm cận trong thiết kế thuật toán: vì bạn không biết các hằng số là gì và vì các hằng số có thể thay đổi tùy thuộc vào các yếu tố môi trường, tốt nhất chúng ta có thể làm là phân tích tiệm cận.
Bây giờ, trong trường hợp so với : trong ví dụ trên, cây van Emde-Boas của tôi có thể chứa phần tử. và , đây là một cải tiến của yếu tố 6, một chút trong thực tế. Ngoài ra, cây van Emde-Boas có các yếu tố không đổi tốt (tất cả là về các yếu tố không đổi trong thực tế vì sự khác biệt nhỏ này) vì chúng không cần phải tự cân bằng.log log n 2 32 log 2 32 = 32 log 32 = 5lognloglogn232log232=32log32=5