
21/07/2026
21/07/2026
Để tìm 100 số lớn nhất từ dãy \(10^{9}\) số nguyên lưu trên ổ cứng với RAM giới hạn 512 MB, thuật toán tối ưu nhất là sử dụng Cấu trúc dữ liệu Min-Heap (Đống tối thiểu) kết hợp với Đọc dữ liệu theo khối (Stream/Buffer).
Giải pháp này chỉ cần truy cập ổ cứng đúng 1 lần duy nhất (đọc tuần tự từ đầu đến cuối).
1. Đề xuất thuật toán
• Khởi tạo: Tạo một cấu trúc dữ liệu Min-Heap có kích thước tối đa là 100 phần tử.
• Đọc dữ liệu: Đọc tuần tự từng khối dữ liệu (ví dụ: mỗi lần đọc một khối vài megabyte) từ ổ cứng vào RAM để tối ưu hóa tốc độ I/O.
• Xử lý từng số \(x\) trong luồng dữ liệu:
o Nếu Min-Heap chưa đủ 100 phần tử: Thêm trực tiếp \(x\) vào Min-Heap.
o Nếu Min-Heap đã có đủ 100 phần tử: So sánh \(x\) với phần tử nhỏ nhất hiện tại ở đỉnh heap (heap[0]). Nếu \(x > \text{heap}[0]\), ta loại bỏ heap[0] và thêm \(x\) vào heap, sau đó thực hiện vun đống phục hồi tính chất Min-Heap. Nếu \(x \le \text{heap}[0]\), bỏ qua \(x\).
• Kết quả: Sau khi đọc hết \(10^{9}\) số, 100 phần tử còn lại trong Min-Heap chính là 100 số lớn nhất cần tìm.
2. Phân tích độ phức tạp
• Độ phức tạp thời gian (Time Complexity): \(\mathcal{O}(N \log K)\)
o Với \(N = 10^9\) và \(K = 100\). Vì \(K\) rất nhỏ, \(\log_2(100) \approx 7\), chi phí cho mỗi lần cập nhật heap là cực kỳ nhỏ.
o Tổng số phép toán xấp xỉ \(7 \times 10^9\) phép so sánh/hoán đổi trong trường hợp xấu nhất.
• Độ phức tạp không gian (Space Complexity): \(\mathcal{O}(K)\) trong RAM
o Bộ nhớ lưu trữ Min-Heap chỉ tốn dung lượng cho 100 số nguyên (khoảng 400 bytes hoặc 800 bytes), hoàn toàn đáp ứng mức giới hạn 512 MB của RAM.
• Số lần truy cập ổ cứng: \(\mathcal{O}(1)\)
o Toàn bộ dữ liệu được đọc tuần tự theo cơ chế streaming từ đầu đến cuối một lần duy nhất, không cần ghi ngược lại hay tạo file tạm trên ổ cứng (External Sorting).
Bạn có muốn viết mã giả hay mô phỏng thuật toán này không?
Nếu bạn muốn hỏi bài tập
Các câu hỏi của bạn luôn được giải đáp dưới 10 phút
CÂU HỎI LIÊN QUAN
Top thành viên trả lời