Tôi sẽ cố gắng phân tích trực quan lý do tại sao Mergesort là n log n và nếu bạn có thể cho tôi ví dụ về thuật toán n log log n, tôi cũng có thể làm việc thông qua nó.
Mergesort là một ví dụ sắp xếp hoạt động thông qua tách danh sách các phần tử liên tục cho đến khi chỉ có các phần tử tồn tại và sau đó hợp nhất các danh sách này lại với nhau. Hoạt động chính trong mỗi lần hợp nhất này là so sánh và mỗi lần hợp nhất yêu cầu nhiều nhất so sánh n trong đó n là độ dài của hai danh sách được kết hợp. Từ đó bạn có thể lấy được sự tái diễn và dễ dàng giải quyết nó, nhưng chúng ta sẽ tránh phương pháp đó. Thay vào đó hãy xem xét cách Mergesort sẽ hành xử, chúng ta sẽ lấy một danh sách và chia nhỏ nó, sau đó lấy nửa đó và chia nó một lần nữa, cho đến khi chúng ta có n phân đoạn chiều dài 1. Tôi hy vọng rằng nó dễ dàng nhìn thấy rằng đệ quy này sẽ chỉ đi sâu vào log (n) cho đến khi chúng ta chia danh sách thành các phân vùng n của chúng ta.
Bây giờ chúng ta có mỗi phân vùng n sẽ cần được hợp nhất, sau đó một khi chúng được hợp nhất cấp tiếp theo sẽ cần phải được hợp nhất, cho đến khi chúng ta có danh sách độ dài n lần nữa. Tham khảo đồ họa của wikipedia để biết ví dụ đơn giản về quy trình này http://en.wikipedia.org/wiki/File:Merge_sort_algorithm_diagram.svg.
Bây giờ hãy xem xét lượng thời gian mà quá trình này sẽ thực hiện, chúng ta sẽ có các cấp độ (n) và ở mỗi cấp, chúng ta sẽ phải hợp nhất tất cả các danh sách. Khi nó quay ra mỗi cấp độ sẽ mất thời gian để hợp nhất, bởi vì chúng tôi sẽ hợp nhất tổng số phần tử n mỗi lần. Sau đó, bạn có thể dễ dàng thấy rằng sẽ mất thời gian n log (n) để sắp xếp một mảng với mergesort nếu bạn thực hiện phép so sánh là hoạt động quan trọng nhất.
Nếu có gì không rõ ràng hoặc tôi bỏ qua ở đâu đó, vui lòng cho tôi biết và tôi có thể cố gắng tiết lộ chi tiết hơn.
Chỉnh sửa giải thích thứ hai:
Hãy để tôi nghĩ rằng nếu tôi có thể giải thích điều này tốt hơn.
Sự cố được chia thành một loạt các danh sách nhỏ hơn và sau đó các danh sách nhỏ hơn được sắp xếp và hợp nhất cho đến khi bạn quay trở lại danh sách ban đầu đã được sắp xếp.
Khi bạn chia nhỏ các vấn đề bạn có nhiều cấp độ khác nhau trước tiên, bạn sẽ có hai danh sách kích thước: n/2, n/2 thì ở cấp tiếp theo bạn sẽ có bốn danh sách kích thước: n/4, n/4, n/4, n/4 ở cấp độ tiếp theo bạn sẽ có n/8, n/8, n/8, n/8, n/8, n/8, n/8, n/8 điều này tiếp tục cho đến khi n/2^k bằng 1 (mỗi phân khu là chiều dài chia cho một lũy thừa của 2, không phải tất cả độ dài sẽ chia hết cho bốn vì vậy nó sẽ không được khá đẹp). Điều này được lặp lại chia cho hai và có thể tiếp tục nhiều nhất log_2 (n) lần, bởi vì 2^(log_2 (n)) = n, vì vậy bất kỳ phân chia nào thêm 2 sẽ mang lại một danh sách có kích thước bằng không.
Bây giờ điều quan trọng cần lưu ý là ở mọi cấp độ chúng ta có n phần tử sao cho mỗi cấp độ hợp nhất sẽ mất thời gian, bởi vì hợp nhất là một phép toán tuyến tính. Nếu có mức log (n) của đệ quy thì chúng ta sẽ thực hiện lần log hoạt động tuyến tính (n) lần này, do đó thời gian chạy của chúng ta sẽ là n log (n).
Xin lỗi nếu điều đó không hữu ích.
Tôi thực sự thích lời giải thích của bạn, nó giúp bạn dễ hiểu cả lý do và cách nhận dạng chúng, cảm ơn! –