Độ phức tạp thời gian logarit và gấp đôi logarit


9

Trong các ứng dụng trong thế giới thực có lợi ích cụ thể khi sử dụng thuật toán thay vì thuật toán ?O(log(log(n))O(log(n))

Đây là trường hợp khi một người sử dụng ví dụ cây van Emde Boas thay vì triển khai cây tìm kiếm nhị phân thông thường hơn. Nhưng ví dụ, nếu chúng ta lấy thì trong trường hợp tốt nhất, thuật toán logarit kép vượt trội hơn logarit một (khoảng) hệ số . Và cũng nói chung việc thực hiện là khó khăn và phức tạp hơn.n<1065

Cho rằng cá nhân tôi thích BST hơn cây VEB, bạn nghĩ sao?

Người ta có thể dễ dàng chứng minh rằng:

n<106. lognlog(log(n))<5.26146


về cơ bản, bạn nên xem các hằng số liên quan đến thuật toán để biết giá trị / kích thước đầu vào nhỏ hơn. Lý tưởng nhất là chúng tôi muốn chúng nhỏ.
singhsumit

3
Lưu ý rằng đã có một loạt các cải tiến kể từ cây VEB, tính toán cấu trúc dữ liệu trên RAM với độ phức tạp tìm kiếm / chèn / xóa của mà không cần ngẫu nhiên (xác định) và với ngẫu nhiên. Xem Sắp xếp xác định trong Thời gian và không gian tuyến tính. bởi Han và Thời gian dự kiến ​​và không gian tuyến tính. bởi Han và Thorup. O(log log n)O(log log n)O(n log log n)O(log log n)
TẠI

Trong thế giới thực, hệ số 5 là khá đáng kể và số lượng vật phẩm thường có thể là 10 ^ 9 hoặc thậm chí 10 ^ 12.
RBarryYoung

Câu trả lời:


10

Đừng quên rằng vẫn tăng theo cấp số nhân (trong ) nhanh hơn !log ( n ) log ( log n )lognlog(n)log(logn)

Thật vậy, nếu bạn nhìn vào thương số của và , sẽ không có nhiều ấn tượng để xem:log ( log ( n ) )log(n)log(log(n))

log (n) / log (log (n))
[ nguồn ]

Tuy nhiên, bạn vẫn có được hệ số năm đến sáu cho kích thước lên tới . Lưu ý rằng kích thước lớn hơn không phải là hiếm trong thực tế, và việc tăng tốc theo yếu tố đó là tuyệt vời ! Nó có thể tạo ra sự khác biệt giữa việc có kết quả sau bữa trưa hoặc chỉ ngày mai. Xin lưu ý rằng một phần của việc tăng tốc có thể bị ăn mòn bởi các hằng số cao hơn của việc thực hiện cây; bạn sẽ phải vẽ (hoặc phân tích) và với các hằng số thời gian chạy thực tế để có được một hình ảnh thực.c log ( n ) d log ( log ( n ) ) c , d100000clog(n)dlog(log(n))c,d

Ngoài ra, điều mà Dave đề cập là rất quan trọng: nếu hoạt động tăng tốc được thực hiện như vậy, giả sử, tuyến tính thường xuyên, tăng tốc không đổi trở thành tăng tốc tuyến tính, tức là bạn có thể giảm hằng số dẫn đầu của toàn bộ thuật toán của mình! Như tôi đã nói ở trên, đó là tuyệt vời. Chỉ cần nhìn vào những gì xảy ra nếu bạn chạy hoạt động lần:n

n * log (n) / (n * log (log (n)))
[ nguồn ]

Bây giờ nếu điều đó không đáng để tôi gặp rắc rối thì tôi không biết gì.


6

Người ta có thể tưởng tượng rằng sự khác biệt về độ phức tạp thực sự không quan trọng lắm, và thời gian thực tế là quan trọng hơn. Nhưng nếu thuật toán là cốt lõi của thuật toán khác, thì sự khác biệt này có thể quan trọng.

Từ một mục đích lý thuyết thuần túy, sự khác biệt của khóa học là vấn đề, đặc biệt nếu thuật toán là một phần của cái khác. Nó có thể đặt thuật toán lớn hơn trong một lớp phức tạp khác.


6

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 sizechèn với các số ngẫu nhiên trong khoảng [0, bound], sau đó sizetìm kiếm, sau đó sizexóa và sau đó sizetì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


Có thể nhảy vào R (hoặc tương đương) và tạo ra một số biểu đồ đẹp (như @Raphael đã làm).
Dave Clarke

1
Nó sẽ cải thiện câu trả lời của bạn nếu bạn liên quan các thuật toán này với các khái niệm vàlog log nlognloglogn
Dave Clarke

@DaveClarke: cảm ơn những lời đề nghị. Thật không may, tôi khá tệ trong việc tạo ra những bức ảnh đẹp - tôi nghĩ rằng chỉnh sửa của tôi đã cải thiện khả năng đọc kết quả của tôi.
Alex ten Brink

Có lẽ không đủ dữ liệu cho một pic thích hợp. Không có vấn đề .... nhưng học cách làm cho hình ảnh tốt là một kỹ năng tiện dụng.
Dave Clarke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.