Khi bạn có một tệp thực sự lớn và có nhiều phần tử trong đó, nhưng phần tử phổ biến nhất là rất phổ biến - xảy ra phần thời gian - bạn có thể tìm thấy nó trong thời gian tuyến tính với các từ O ( k ) không gian ( hằng số trong ký hiệu O ( ) là rất nhỏ, về cơ bản là 2 nếu bạn không tính dung lượng lưu trữ cho những thứ phụ trợ như băm). Hơn nữa, điều này hoạt động rất tốt với bộ nhớ ngoài, vì tệp được xử lý theo thứ tự một phần tử tại một thời điểm và thuật toán không bao giờ "nhìn lại". Một cách để làm điều này là thông qua một thuật toán cổ điển của Misra và Gries, xem các ghi chú bài giảng này>1/kO(k)O(). Vấn đề bây giờ được gọi là vấn đề người nặng nề (yếu tố thường xuyên là người tuyệt vời nặng).
Giả định rằng phần tử thường xuyên nhất xuất hiện phần thời gian cho k một số nhỏ có vẻ mạnh nhưng đó là một cách cần thiết! Tức là nếu bạn sẽ có quyền truy cập tuần tự vào tệp của mình (và trong trường hợp tệp truy cập ngẫu nhiên rất lớn sẽ quá đắt), bất kỳ thuật toán nào luôn tìm thấy phần tử thường xuyên nhất trong số lượng vượt qua sẽ sử dụng tuyến tính không gian trong số phần tử . Vì vậy, nếu bạn không giả định điều gì đó về đầu vào, bạn không thể đánh bại bảng băm. Giả định rằng yếu tố thường xuyên nhất là rất thường xuyên có lẽ là cách tự nhiên nhất để có được xung quanh kết quả tiêu cực.>1/kk
Dưới đây là một bản phác thảo cho , tức là khi có một yếu tố duy nhất xảy ra hơn một nửa thời gian. Trường hợp đặc biệt này được gọi là thuật toán bỏ phiếu đa số và là do Boyer và Moore. Chúng tôi sẽ giữ một yếu tố duy nhất và một số lượng duy nhất. Khởi tạo số đếm thành 1 và lưu trữ phần tử đầu tiên của tệp. Sau đó xử lý tệp theo trình tự:k=2
- nếu phần tử hiện tại của tệp giống với phần tử được lưu trữ, hãy tăng số lượng lên một
- nếu phần tử hiện tại của tệp khác với phần tử được lưu trữ, hãy giảm số lượng một
- nếu số lượng cập nhật là 0, hãy "loại bỏ" phần tử được lưu trữ và lưu trữ phần tử hiện tại của tệp; tăng số lượng lên 1
- tiến hành phần tử tiếp theo của tập tin
Một chút suy nghĩ về thủ tục này sẽ thuyết phục bạn rằng nếu tồn tại phần tử "đa số", tức là phần tử xảy ra hơn một nửa thời gian, thì phần tử đó sẽ là phần tử được lưu trữ sau khi toàn bộ tệp được xử lý.
Đối với k chungkk−1k−1kk
Tất nhiên bạn có thể sử dụng bảng băm để lập chỉ mục k−11/kO(k)
Một điều cuối cùng: sau khi bạn tìm thấy k1/kk−1