Dữ liệu vào: Một số nguyên dương K và một văn bản lớn. Văn bản thực sự có thể được xem như một chuỗi từ. Vì vậy, chúng ta không phải lo lắng về cách chia nó thành chuỗi từ.
Đầu ra: K từ thường gặp nhất trong văn bản.
Suy nghĩ của tôi là như thế này.
sử dụng bảng Hash để ghi lại tần suất của tất cả các từ trong khi duyệt qua toàn bộ chuỗi từ. Trong giai đoạn này, khóa là "từ" và giá trị là "tần suất từ". Điều này mất O (n) thời gian.
sắp xếp cặp (từ, từ-tần số); và chìa khóa là "tần số từ". Điều này mất O (n * lg (n)) thời gian với thuật toán sắp xếp thông thường.
Sau khi sắp xếp, chúng ta chỉ lấy K từ đầu tiên. Điều này mất O (K) thời gian.
Tóm lại, tổng thời gian là O (n + n lg (n) + K) , Vì K chắc chắn nhỏ hơn N nên nó thực sự là O (n lg (n)).
Chúng tôi có thể cải thiện điều này. Trên thực tế, chúng tôi chỉ muốn K từ hàng đầu. Các từ khác 'tần suất không phải là mối quan tâm đối với chúng tôi. Vì vậy, chúng ta có thể sử dụng "phân loại Heap từng phần". Đối với bước 2) và 3), chúng tôi không chỉ thực hiện phân loại. Thay vào đó, chúng tôi thay đổi nó thành
2 ') xây dựng một đống cặp (từ, từ-tần suất) với "từ-tần số" làm khóa. Mất O (n) thời gian để xây dựng một đống;
3 ') trích xuất K từ hàng đầu từ đống. Mỗi lần chiết là O (lg (n)). Vì vậy, tổng thời gian là O (k * lg (n)).
Tóm lại, giải pháp này tốn thời gian là O (n + k * lg (n)).
Đây chỉ là suy nghĩ của tôi. Tôi chưa tìm ra cách để cải thiện bước 1).
Tôi hy vọng một số chuyên gia Truy xuất Thông tin có thể làm sáng tỏ hơn về câu hỏi này.